【原创】菜鸟给菜鸟的教程之修改特征码避开杀毒软件检测(图文)
精华序号
:241
来自论坛
:
小熊在线
《软件论坛》
内容说明
:本文即将探讨的话题就是,修改软件特征码以避开杀毒软件检测。这种技术常被用在修改某些本身不是病毒的黑客工具上,或者与PE文件有关的工具上。不多罗嗦,进入正题。先申明:偶素菜鸟。
【原创】菜鸟给菜鸟的教程之修改特征码避开杀毒软件检测(图文)
(5419字)
熊坛·天天
(589005)
于2005/07/29(12:11:44)..
病毒和杀毒软件之间的关系就像矛与盾一样,互有攻守,相应的技术也在这种抗衡中共同发展,新技术不断演化被运用到程序设计之中,更多底层和高级技术被人研究并公布出来,文档也渐多,如保护模式下获得Ring0级权限,如3721的驱动级监护等,逆向工程、软件保护、软件DIY等趣味话题慢慢为人们所熟悉。本文即将探讨的话题就是,修改软件特征码以避开杀毒软件检测。这种技术常被用在修改某些本身不是病毒的黑客工具上,或者与PE文件有关的工具上。不多罗嗦,进入正题。先申明:偶素菜鸟。
待改软件:啊D网络工具包
软件介绍:(功能描述长,略)
使用工具:PEiD,FI,UltraEdit,Ollydbg,UPX,ImportREC,CCL,AVP
测试平台:Windows 2000 Server
啊D网络工具包的功能比较多,个头也不大。但由于其某些放肆的功能,被列入了杀毒软件的黑名单。平时在Kaspersky Monitor监视下,点击它就会报毒。现在要做的就是修改之,“变脸”,让杀毒软件安静下来,不再理它。
修改软件特征码的步骤,略总结一下可分为四步:
一,侦察软件,有壳脱壳;
二,定位特征码;
三,修改软件;
四,反复测试,收尾。
一,侦察软件,有壳脱壳
关闭“卡巴斯基”监控,用PEiD查壳,显示“Nothing found *”;换FI查,显示UPX + cryptor。以为是UPX变形壳,用UltraEdit打开修改区段名,再用UPX -d脱壳,没作用。
后来才知道不是常见的UPX壳。看来需要手动脱。
于是请出必备兵器Ollydbg(后文简称OD)载入之,两次提示PE文件被压缩,有壳。然后OD停在0051A082处,PUSHAD是保存现场标志。
0051A082 > 60 PUSHAD
于是F8往前走,直到0051A35F处,载入很多DLL链接库,开始小心看代码。
0051A35F E8 07040000 CALL DTools.0051A76B
0051A35F E8 07040000 CALL DTools.0051A76B
0051A364 ^72 E6 JB SHORT DTools.0051A34C
0051A366 8B85 B8A74500 MOV EAX,DWORD PTR SS:[EBP+45A7B8]
0051A36C 0347 28 ADD EAX,DWORD PTR DS:[EDI+28]
0051A36F 894424 1C MOV DWORD PTR SS:[ESP+1C],EAX
0051A373 61 POPAD
0051A374 -FFE0 JMP EAX ; DTools.00516130
0051A373处是POPAD,然后是向前跳跃,这里还不是OEP,F8向前又是一个PUSHAD
00516130 . 60 PUSHAD
00516131 . BE 00D04B00 MOV ESI,DTools.004BD000
00516136 . 8DBE 0040F4FF LEA EDI,DWORD PTR DS:[ESI+FFF44000]
0051613C . C787 C4800C00 >MOV DWORD PTR DS:[EDI+C80C4],BD03F8F8
00516146 . 57 PUSH EDI
00516147 . 83CD FF OR EBP,FFFFFFFF
0051614A . EB 0E JMP SHORT DTools.0051615A
到这里之后,按住F8发现光标开始上跳下跳,这里就是在解压原PE文件了,刚才前一段是壳的代码。
00516219 .^E9 38FFFFFF JMP DTools.00516156
这里不用走,关键看跳转,在00516219处有JMP上跳,于是向前看有没有往下跳过这个JMP的指令。在005161A4发现唯一一处跳到00516219之后的
005161A4 . 74 78 JE SHORT DTools.0051621E
于是在0051621E处F2,然后F9跳出循环。接下去在0051622F处,同理用F2F9
0051622F . 803F 1F CMP BYTE PTR DS:[EDI],1F
然后在00516250处发现LOOPD,也跳过去。到00516252
00516250 .^E2 D9 LOOPD SHORT DTools.0051622B
00516252 . 8DBE 00201100 LEA EDI,DWORD PTR DS:[ESI+112000]
接下去又看到POPAD下一个优雅美妙的跨区跳跃。
0051629A > 61 POPAD
0051629B .^E9 281FFBFF JMP DTools.004C81C8
于是004C81C8就是OEP,在004C81C8处OllyDump转存进程为DTools_.exe
004C81C8 > 55 PUSH EBP
没有完,现在需要用ImportREC重建输入表,复制DTools.exe为DTools1.exe,运行之,然后运行ImportREC,选择进程DTools1.exe,填写刚才的OEP:C81C8,点按钮【Get Import】,再点【Show Invalid】,函数居然这么完整,那直接【Fix Dump】,选择刚才Dump出的DTools_.exe,得到DTools__.exe即为脱壳后的文件。
运行检验一下,看来这个UPX + cryptor还是普通壳。没有反调试器,没有花指令,没有异常。再用PEiD察看,显示为“Borland Delphi 6.0 - 7.0”。再用AVP扫描一下,同样识别为病毒“HackTool.Win32.Delf.p”。
二,定位特征码;
现在到了关键一步,就是要找出“卡车司机”以什么来识别俺们无辜的DTools__.exe为HackTool的。这就要先解释一下“特征码”:“特征码”是杀毒软件识别病毒的几个bit的二进制代码。根据经验,通常为两处,但只是通常。举个通俗的例子,比如春三十娘判断至尊宝是不是孙猴子的依据是:脚底板有没有三颗痔。因此这三颗痔就是孙猴子的“特征码”。
确定特征码在哪里要用的特征码定位器,即CCL。CCL的原理是用ASCII字符00分段填充软件,然后用杀毒软件(以下简单称“杀软”)查,杀软杀不掉的就是被替换了特征码的,在用CCL检查,就可以得到特征码的位置。就是说,CCL要和杀毒软件配合起来使用。
这个是基本原理,真正定位起来根据文件本身的大小,需要相应大的硬盘空间。而且定位是慢慢缩小范围的。CCL的定位方式有两种:手动定位和自动定位。
我们先用手动定位,就是先生成文件,再让杀软查。手动定位的指定方式又分为两种,一是指定生成文件个数,二是每次替换为00的字节长度。我的硬盘剩下的空间不多,我指定的是每次替换1280个字节。需要1G多硬盘空间。
操作过程如下:
1.点击【设置】->【手动操作参数设置】,如图设置,
2.点击【设置】->【整体参数设置】,如图设置
3.点击【文件】->【特征码检测】->【文件特征码】,
选择脱壳后的文件“DTools__.exe”,弹出如图
我们可以看到,脱壳后的文件有五个区段,我们不好确定哪个段为代码段。所以先不选择,而直接点击【确定】弹出【生成文件信息】对话框
/*
当前选择文件为
C:\Documents and Settings\who\桌面\DTools__.exe
文件大小为1171456 个字节
您选择的是对整个文件进行检测,包括PE文件头。
当前的操作方式为手动,替换块的大小为1280个字节,
共需生成约915 个文件,
共需要硬盘空间 1171456 字节×915 =1071882240 字节,约为1046760 KB。
……
*/
然后点击【运行】生成915个文件,默认路径是当前目录下的output目录,你也可以在【整体参数设置】中指定生成到其他目录中。
4.生成完毕,用AVP查毒,注意设置AVP为不弹出提示,直接删除病毒文件。杀毒完成后,剩下几个如OUT_000C7D53_00000016的文件。选择【操作】->【结果定位】,选到刚才的output目录,结果如图tzm.gif
现在一共出现5处特征码,前文提到过,杀软识别病毒文件一般需要两处特征码。
/*
--------------定位结果-------------
序号 起始偏移 大小 结束偏移
0001 000C7D53 0000002C 000C7D7F
0002 000C7D80 0000002C 000C7DAC
0003 000C7DAE 00000016 000C7DC4
0004 000C81CA 0000002C 000C81F6
0005 000C81F8 00000016 000C820E
*/
5.我们无法确定到底是哪几个,现在就要用到排列组合。
别觉麻烦,CCL已经给我们准备好了。先点击【文件】->【保存结果】,取名r.txt,然后【文件】->【特征码检测】->【定位结果排列组合】,在打开的对话框里点击【导入】,如图
6.然后先点【生成】,别关闭当前对话框,再用AVP检测生成的文件,会剩下若干个。
再点击【检测】,结果如下:
/*
只修改一处特征码无效,需同时修改两处或以上
同时修改两处特征码时,可以修改
第 1 处 和 第 4 处
或 第 1 处 和 第 5 处
或 第 2 处 和 第 4 处
或 第 2 处 和 第 5 处
或 第 3 处 和 第 4 处
或 第 3 处 和 第 5 处
同时修改三处特征码时,可以修改
第 1 处 、第 2 处 和 第 4 处
或 第 1 处 、第 2 处 和 第 5 处
或 第 1 处 、第 3 处 和 第 4 处
或 第 1 处 、第 3 处 和 第 5 处
或 第 1 处 、第 4 处 和 第 5 处
或 第 2 处 、第 3 处 和 第 4 处
或 第 2 处 、第 3 处 和 第 5 处
或 第 2 处 、第 4 处 和 第 5 处
或 第 3 处 、第 4 处 和 第 5 处
*/
从结果中可以看出5处码的关系是:( 1 or 2 or 3 ) and ( 4 or 5 )
到这里有两条路可以选,一条是选择修改偏移3和5,因为
序号 起始偏移 大小 结束偏移
0003 000C7DAE 00000016 000C7DC4
0005 000C81F8 00000016 000C820E
都是16字节,指令条数不会很多。另一条是继续生成文件,把替换00的步长调小,再重复以上过程,直到范围缩小到2-4个字节。现在我们选前者。
三,修改软件;
启动OD,载入DTools__.exe,到达004C7DAE处,16个字节里包含的指令如下:
004C7DB0 |. 8BD8 MOV EBX,EAX
004C7DB2 |. 33C0 XOR EAX,EAX
004C7DB4 |. 5A POP EDX
004C7DB5 |. 59 POP ECX
004C7DB6 |. 59 POP ECX
004C7DB7 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
004C7DBA |. 68 DC7D4C00 PUSH DTools__.004C7DDC
004C7DBF |> 8D45 D0 LEA EAX,DWORD PTR SS:[EBP-30]
004C7DC2 |. E8 79CCF3FF CALL DTools__.00404A40
到达004C81F8处,16个字节里包含的指令如下:
004C81F8 . 8B03 MOV EAX,DWORD PTR DS:[EBX]
004C81FA . 8B15 ACCE4A00 MOV EDX,DWORD PTR DS:[4ACEAC]
004C8200 . E8 AF9FFCFF CALL DTools__.004921B4
004C8205 . 8B0D 98A94C00 MOV ECX,DWORD PTR DS:[4CA998]
004C820B . 8B03 MOV EAX,DWORD PTR DS:[EBX]
现在要想办法将此两处代码移动到其他地方,于是在程序里寻找缝隙。发现在
004C8250 00 DB 00
004C8251 00 DB 00
……
004C900A 00 DB 00
004C900B 00 DB 00
之间全部是00(好大的缝,反弹端口的Shell都可以插入了),于是用0D的汇编模式修改如下,这里修改用Hiew也可以。
修改如下:
004C7DB0 . E9 A5040000 JMP 004C825A
004C7DB5 > 90 NOP
004C7DB6 . 90 NOP
004C7DB7 . 90 NOP
004C7DB8 . 90 NOP
004C7DB9 . 90 NOP
004C7DBA . 90 NOP
004C7DBB . 90 NOP
004C7DBC . 90 NOP
004C7DBD . 90 NOP
004C7DBE . 90 NOP
004C7DBF > 90 NOP
004C7DC0 . 90 NOP
004C7DC1 . 90 NOP
004C7DC2 . 90 NOP
004C7DC3 . 90 NOP
004C7DC4 . 90 NOP
004C7DC5 . 90 NOP
004C7DC6 . 90 NOP
004C81F8 . E9 83000000 JMP 004C8280
004C81FD > 90 NOP
004C81FE . 90 NOP
004C81FF . 90 NOP
004C8200 . 90 NOP
004C8201 . 90 NOP
004C8202 . 90 NOP
004C8203 . 90 NOP
004C8204 . 90 NOP
004C8205 . 90 NOP
004C8206 . 90 NOP
004C8207 . 90 NOP
004C8208 . 90 NOP
004C8209 . 90 NOP
004C820A . 90 NOP
004C820B . 90 NOP
004C820C . 90 NOP
004C820D . 90 NOP
004C820E . 90 NOP
004C820F . 90 NOP
004C8210 . 90 NOP
004C8211 . 90 NOP
004C8212 . 90 NOP
004C825A 8BD8 MOV EBX,EAX
004C825C 33C0 XOR EAX,EAX
004C825E 5A POP EDX
004C825F 59 POP ECX
004C8260 59 POP ECX
004C8261 64:8910 MOV DWORD PTR FS:[EAX],EDX
004C8264 68 DC7D4C00 PUSH 004C7DDC
004C8269 8D45 D0 LEA EAX,DWORD PTR SS:[EBP-30]
004C826C E8 CFC7F3FF CALL 00404A40
004C8271 ^E9 3FFBFFFF JMP 004C7DB5
004C8280 8B03 MOV EAX,DWORD PTR DS:[EBX]
004C8282 8B15 ACCE4A00 MOV EDX,DWORD PTR DS:[4ACEAC]
004C8288 E8 279FFCFF CALL 004921B4
004C828D 8B0D 98A94C00 MOV ECX,DWORD PTR DS:[4CA998]
004C8293 8B03 MOV EAX,DWORD PTR DS:[EBX]
004C8295 8B15 C0064A00 MOV EDX,DWORD PTR DS:[4A06C0]
004C829B ^E9 5DFFFFFF JMP 004C81FD[/FONT][/COLOR]
然后保存到文件DTools__1.exe。打开杀软防火墙监控,点击它,哈,AVP没有提示了。用AVP Scanner扫描它,报告无毒。现在免AVP查杀的“啊D网络工具包”就完成了。但是其体积还是很大,因为原文件是加过壳的,现在就需要下面的工作。
四,反复测试,收尾。
至此,啊D网络工具包变脸完毕,已经不被AVP查杀,我用的是AVP Swiss v3.5,给AVP5.0的用户检测一样可以通过。另外,江民的KAV2005也通过。但瑞星却可以查出来,那就是因为瑞星用的是不同的特征码了。需要用以上办法再去修改Dtools.exe。另外,如果修改好,发布软件时,最好加上和原文件一样强度的壳。脱现在的壳很伤心,偶素菜鸟,偶只说一句:强壳猛于虎。
本文是以一个普通的程序为例,讲述脱壳、修改的过程。针对每一种杀软的修改原理都差不多。CCL是不错的软件,其功能很多,一篇文章没讲完全,需要在使用中不断摸索。
Blog 原文地址:http://blog.dream4ever.org/magiclx/archive/2005/07/25/40588.aspx
tt#20050725
本论坛由小熊在线(
www.beareyes.com
)
joyt
制作及维护