admin管理员组

文章数量:815885

免杀gh0st过瑞星

免杀gh0st过瑞星 2010-05-15 21:51
免杀gh0st过瑞星

  (

  

  

  本来想投稿的,无奈的是,不管怎么发,X的邮箱都发不了,自己的一点心得,拿出来和小菜共享。

  

  

  相信小菜们在制作免杀的过程中都碰到过这样的情况:明明根据 特征码改好了服务端,用杀毒软件一查,还是能查出病毒来。这一般都是因为杀毒软件把 特征码 定义在了输入表或输出表的位置上,下面我和小菜们分享一下在制作输入表和输出表免杀过程中的一点心得,我选择的对象是:gh0st3.5修正版过瑞星。(主要是瑞量的 特征码 定义的比较全:有字母、有十六进制、有输入表、有输出表)。在我写这篇文章的过程中,论坛的小3给了我很大的支持和帮助,在此特表示感谢。

  免杀思路:遇字母大小写互换,十六进制利用跳转法,输入表位置变换输入表,输出表位置增加输出表函数,修改函数RVA。

  利用的工具:MyCcl、oc、 Restorator 2006、LordPE、InstDrv、OllyICE、C32Asm。

  首先运行gh0st3.5生成服务端server.exe(不知道怎么生成服务端的看今年第3期的X档案),用Restorator 2006分别将server.exe的101.dll和102.sys导出,并 定义出瑞星 特征码。(利用MyCcl 定义 特征码的方法以前的X档案已介绍很多,这里就不再罗嗦)。

  一、免杀102.sys

   定义的102.sys 特征码如下:

  [ 特征] 000005C8_00000002 →T

  [ 特征] 000005E0_00000002 →T

  [ 特征] 00000937_00000002 →07(16进制)

  [ 特征] 000009C6_00000002 →(输入表)

  [ 特征] 000009E6_00000002 →(输入表)

  [ 特征] 00000A9A_00000002 →n

  利用C32Asm打开十六进制模式的102.sys,000005C8和000005E0处的 特征码都是大写的T,选中字母T点右键选择修改数据再选择字符小写点确定即可 (如图1);00000937处的 特征码是16进制的07,这里使用跳转法,选中07点右键,选择"对应汇编模式编辑",进入汇编模式后,向上移动一下可以看到汇编代码为:00010936: 75 07 JNZ SHORT 0001093F,向下或向上找一块零区域并将这行代码复制进去,我选择的是 000108F6行,在000108F6行右键单击选择汇编在汇编对话框里写入JNZ SHORT 0001093F并点击汇编,在000108F8行写入 jmp 00010938,再回到00010936行,将原来的汇编语句改为:jmp 000108F6即可(如图2);000009C6处的 特征码在输入表函数DbgPrint的n上,直接更改大小写或者跳转法都会导致文件无法使用,解决办法如下:在HEX编辑模式下将000009C0至000009C7的16进制码(即:DbgPrint)拷贝到00000AA1处,然后将000009C0至000009C7处用00填充(如图3),然后保存并退出C32Asm。打开LordPE,点击PE编辑器在弹出的对话框中选中刚才保存的文件,然后点击目录,在目录表中点击导入表后面的"…"按钮(如图4),会出现导入表(如图5),选择ntoskrnl.exe就会出现所有的导入函数了(如图6),有没有看到第二行没有函数名?这就是刚才我们移动位置的那个函数了,选中它单击右键选择编辑,在编辑Thunk窗口填入00000A9F,(为什么不是00000AA1?因为每个输入表函数前都有一个空格,所以我们一定要把空格的位置空出来)然后选择确定(如图7),然后返回目录表窗口,点击保存,再点击确定返回到PE编辑器窗口,选择校验和后面的"?"按钮修改文件检验和(如图8),然后保存退出即可。这样00009C6处的 特征码,我们已经改完了。利用InstDrv试下改好的文件能不能用。按顺序点击安装、启动、停止、卸载。如果都成功即表示更改成功了。000009E6处的 特征码在输入表函数的S上面,用同样的方法更改即可,我改好后的如图9所示。00000A9A处 特征码是小写的n直接更改大小写或者用上面的方法将DLL文件名移位都可以。

  现在102.sys的 特征码已经全部更改完了,更改一下文件的检验和,然后用InstDrv测试一下驱动能不能用,我的成功了(如图10)

  二、免杀101.DLL

  用Restorator 2006将免杀过的102.sys导入到101.dll保存后, 定义出101_0.dll 特征码如下,每个 特征码后面的地址我用OC得出的偏移地址:

  [ 特征] 0000877A_00000002→1000937A

  [ 特征] 000088F6_00000002→100094F6

  [ 特征] 00008A26_00000002→10009626

  [ 特征] 00009135_00000002→10009D35

  [ 特征] 00009716_00000002→1000A316

  [ 特征] 00014B9F_00000002→(输出表)ResetSSDT

  [ 特征] 00014BAB_00000002→(输出表)ServiceMain

  [ 特征] 00015208_00000002→10016607

  用OllyICE载入101.dll,0000877A(1000937A)处的 特征代码是: 10009379 |. /74 08 je short 10009383,我使用跳转法,将以下两行全部复制下来,然后NOP掉。并记住第三行(10009380)这个地址。

  10009379 |. /74 08 je short 10009383

  1000937B |. |C64424 18 01 mov byte ptr [esp+18], 1

  10009380 |.

  然后将10009379和1000937B两行代码写到下面零区域,并用JMP跳转回来,我选的是:10011F9B 全部改好后如图11,

  因为这篇文章的主要内容不是讲跳转法的,所以下面几处 特征码(除了输出表外)我就不详细讲怎么更改了,000088F6(100094F6)处改好如图12,00008A26(10009626)处改好如图13,00009135(10009D35)处改好如图14,

  00009716(1000A316)处改好如图15。我先不改两处输出表,最后一处 特征码改好后如图16,现在除了输出表以外其他的全部都改好了,用Restorator 2006导入到服务端试一下,上线成功如图17

  下面我着重讲一下更改输出表的方法:

  [ 特征] 00014B9F_00000002 (输出表) 定义在 ResetSSDT的T上

  [ 特征] 00014BAB_00000002 (输出表) 定义在ServiceMain的i上

  经过我测试,利用网上所传的更改输出表函数位置的方法是没办法过瑞重的,即使改过的DLL文件过了瑞星,但是把这个文件复制一下改个名后还是一样被查杀,有兴趣的朋友可以试一下(如图18)。更改输出表需要一些PE文件的基础知识,大家可以看一下七期的《浅谈输出表免杀》,我这里也配了一张PE结构图。先用LordPE打开101.DLL,我们看一下输出表的大小,本来大小是5E,也就是十进制的94(如图19),用C32Asm打开HEX模式的101.DLL文件,跳到输出表的位置(如图20),图中选中的位置即:00014B50到00014BAC就是输出表了,看下面,刚好94个字节,怎么得到是从00014B50开始的呢?这里需要一个VRk(VRk是文件虚拟地址和文件物理址之间的差值),如图21,名称地址是:0001578C,再看图20中svchost.dll这个名称所对应的的地址是:00014B8C,用计算器十六进制下计算0001578C-00014B8C=C00,也就是VRK,别的一样也可以推出来。看到图19的那个RVA了吗(RVA是相对虚拟地址)?导出表的RVA是00015750,减去C00=00014B50。

  为了更好的理解,结合七月份的《浅谈输出表免杀》,对应图20,我们大致分析一下这94个字节的内容,要有这么一个概念,就是从右向左倒过来读。

  0001485C处的8C570100即0001578C是名称的RVA,文件物理地址是:0001578C-C00=00014B8C

  00014B60的0100即0001是表示输出表只有一个DLL

  02000000即00000002表示函数的数量是2个

  后面的02000000即00000002表示函数名的数量2个

  78570100即00015778表示的是函数的RVA地址:也就是说00015778这个地址开始存放的是函数的RVA地址,也就是下面的40A20000和50A20000

  80570100即000015780表示的是函数名的RVA地址,也就是说00015780这个地址存放的是另外一个RVA(00015798),而00015798才是函数名的开始地址,

  88570100即00015788是函数名顺序地址,即00000100.

  40A20000和50A20000是两个函数对应的函数地址。

  98570100即00015798是第一个函数名的开始地址,以00结束

  A2570100即000157A2是第二个函数名的开始地址,以00结束

  737663686F73742E646C6C这个是svchost.dll的十六进制。

  526573657453534454和536572766963654D61696E是两个函数的十六进制,以00结束。

  因为输出表的大小是5E(94字节), 如果将函数名写在这94个字节以外,是没办法使用的。我们要更改输出表,首先要更改输出表的大小。我向下加两行。选中00014B50到0001BCF一共是128个字节, 转换成十六进制是80(如图22),现在关掉C32ASM,用LordPE打开101.DLL,将5E改为80(如图23),然后保存退出。

  我们再用C32ASM打开101.DLL,将函数名ResetSSDT移动到00014BB0那里,将原来的用00填充;将函数名ServiceMain移动到00014BC0那里,将原来的用00填充(如图24),本来ResetSSDT函数名的地址是000014B98(RVA:00015798)现在我们换到了00014BB0这里,所以00015798这个RVA也要改了,改成00014BB0+C00=000157B0,反过来就是B0570100;同样ServiceMain函数名所对应的000157A2也要改成000157C0(如图25)。

  按说,我们已经把 特征码移动到别的位置了,应该已经免杀了,我们试一下(如图26),看到没,还是查得出来。那怎么办呢,经过我一整夜的摸索,终于让我找到了一个可行的办法,那就是增加输出表函数、更改函数地址。

  增加一个输出表函数,同时增加的还有函数地址、函数名顺序地址、函数名地址。我们要给这些地址清理一下空间,方法如下:

  先将DLL文件名移动到00014BA4处,将原来的用00填充,svchost.dll本来的位置是00014B8C,现在我们移动到了00014BA4处,所以0001578C(00014B8C+C00)也要改为000157A4(00014BA4+C00)。将000114B80处的8个字节(也就是存放函数名的八个字节)移动到000114B90处并将原来位置用00填充。因为更改了函数名存放地址的位置,所以,00015780也要改为00015790。下面我们在00014B9D处随便写一个函数名,我写的是ResetS,注意后面留00,现在就有3个函数了,将函数数量由2改为3,将函数名数量也由2改为3,因为多了一个函数,所以函数名地址也多了一个,在000114B98处写上我们编的那个函数名的RVA:0001579D(00014B9D+C00)记得反过来写:9D570100,多了一个函数名,函数地址是不是也要多一个?没有函数地址怎么办呢,我将40A2这个地址重新复制一个就行了,在00014B80这里写上40A2000。那函数名顺序是不是也要多一个呢,多一个0002,我们写在00014B8C这个位置。

  到这里,瑞星还是会查杀的,不信的朋友可以试一下。现在,我们移动一下函数名的位置。将B0570100和9D570100互换一下,再将C0570100和9D570100互换一下,互换完了,函数名的顺序就不对了,所以顺序也要改一下。改为01 00 02 00 00 00,好了,现在已经不查杀了,但是复制一个,改个名后还是一样被查杀,怎么办呢?不是还有个函数地址没改吗?A240和A250不就是函数RVA吗?对应的地址是9640和9650,在汇编模式到9640和9650看一下,每个函数前面是不是都是NOP?我们将A240改成A23F,将A250改成A24F,我们自己加的那个函数的就不要改了。改完好保存再查杀一下,不管怎么复制改文件名也查不出来。全部改好后的样子如图27

  好了,到此,免杀已经全部做完了。导入到服务端,试一下能上线不,上线了,各项功能正常,而瑞星一点反映也没(如图28)。(包里面有我做好的各个文件的免杀样本)

  本人心得:

  1、每改完一处一定要记得存盘,

  2、上线测试的时候如果之前有上线,服务端卸载后要重启电脑,

  3、C32ASM和LordPE不要同时打开同一样文件,容易造成修改完后没有保存。

  4、 修改输出表的时候,修改完一处保存后,用LordPE打开看一下,看是不是正确。

  5、在作免杀的过程中,不要使用瑞星卡卡,会造成OllyICE打开的DLL文件不在程序领空。

本文标签: 免杀gh0st过瑞星