授人以鱼不如授人以渔
这是一篇修改特徵码原理的,所谓授人以鱼不如授人以渔,说的是如何让自己的东东免杀,不是用的加壳的方法,但是作为免杀这是最有效的办法,例子中的代码也不是真的,希望有人可以触类旁通!做出自己的免杀
加壳和下面我说的办法只是殊途同归,因为杀毒软体基本上都是用的特徵码来区分的。
1、 基本原理
想要修改特徵码就必须先找出它的所在。网上有一篇名为《杀毒软体能奈我何——网路神偷特徵码修改实战》的文章介绍了字节替换的原理,总结起来就一句话:如果文件中的特徵码被我们填入的数据(比如0)替换了,那杀毒软体就不会报警,以此确定特徵码的位置。这个方法简单而有效,但是手动操作起来工作量太大。受作者启发,我找了个小程式来自动实现特徵码定位的功能。
2、 参数设置和注意事项
CCL的原理是将原文件中部分字节替换为0,然后生成新文件,再根据杀毒软体来检测这些文件的结果判断特徵码的位置。使用CCL之前应该先设置一下参数,包括操作方式是自动还是手动,生成文件的路径。
自动操作时,有一个参数很重要,就是每生成一个文件等待的秒数。因为我们要保证杀毒软体在这个几秒钟内对替换过的文件进行了检测,并能删除该文件(如果含特徵码的话),然后CCL根据刚才的生成文件是否被删除来决定下面的操作。如果间隔时间过短,杀毒软体没有来得及检测,CCL就进入了下一轮操作,嘿嘿,轻者判断结果出错,重者系统很可能会崩溃的!建议先把时间设大一些,比如7到10秒。
应该明确的是,这种检测对已加壳的文件是无效的,因为带壳文件被替换的字节不是原程式的真身,而是加壳后的数据。不多说了,下面进入实战演练!
四、 实战之一:升级器特徵码的自动定位
铛铛铛!第一个目标是升级器,检测一下,瑞星报警发现了Harm.RAVFree.io
下面让我们利用自动替换功能来定位特徵码。首先运行CCL,将参数设为自动,等待时间7秒,最小定位精度设为16个字节。然后关闭杀毒软体即时监测功能(以后均简称为监测),打开待检测文件。成功读入后会弹出PE文件段选择窗口,这是让用户选择对文件的哪一个部分进行替换。我们双击.text段(这是可执行文件的代码段),然后用户输入区会显示相应数据。我们再点击“添加区段”,就成功地添加了一个待检测区段。当然,你也可以直接在“用户输入区”填入数据然后添加。双击已添加的区段,可以删除任务。
这里有个问题,我们应该选择几个段进行检测呢?最简单的方法是一个都不选,程式会默认对整个文件进行检测。但有时候文件过大,或者你能确定特徵码位于某个段中,为了避免替换时间过长,就可以选择特定的范围进行检测。
还有一个选项叫“是否填充0”,这个选项的功能是指为了预先排除某些部分的干扰,我们在生成文件中将该部分用0填充。呵呵,举个例说明一下,文件有A、B 两处特徵码,为了更精确的定义A,我们可以将B所在的段预先填0,然后专门定位A所在的部分。关于填充0的时机,大家在使用过程中会慢慢总结出来的。好了,回到升级器,这里我们选择“不填充0”,也就是正常替换。
我们单击确定,弹出了操作窗口。
窗口里显示了各种资讯,包括文件名、生成路径、操作方式和需要硬盘空间(手动的话)。这时,别忘了打开监测,并且最好将该功能设为“遇到病毒时自动删除,不提醒用户”。然后打开“我的电脑”,进入生成文件的文件夹,让“我的电脑”窗口保持在前台。为什么呢?因为有的杀毒软体只对前台窗口生成的文件进行即时监测,比如我机上的卡巴斯基。还有一些杀毒软体,就算“我的电脑”窗口在前台也不一定对生成文件检测,这时可以不断的在文件图标上单击右键,来“刺激”一下杀毒软体。是不是有点儿复杂哈?
回到CCL,确认窗口显示的资讯无误后,单击GO,开始自动检测。这时,你会发现“我的电脑”文件夹里多了两个文件,名称形如 “OUT_XXXXXXXX_YYYYYYYY”,其中8个X代表当前替换0的起始偏移,8个Y代表替换多少字节的0。几秒钟内,会有一个文件被杀毒软体自动删除。(我再强调一下,7秒钟是你设定的等待时间,要确保含特徵码的文件在这7秒内被删除掉。)7秒钟后,会生成另外两个文件,这是CCL进行下一轮检测了。这样等啊等,期间不停的在生成文件图标上点滑鼠右键(不知道除了卡巴斯基,其他的杀毒软体需不需要这样的刺激),过了2分多钟,结果出来了。
-------------定位结果------------
序号 起始偏移 大小 结束偏移
0001 0000180C 00000014 00001820
0002 00002130 00000050 00002180
0003 00002810 00000028 00002838
0004 000028D8 00000014 000028EC
这个结果说明特徵码可能在这四段中。定位成功了?呵呵,不要急,这才刚刚完成了一半,下面还要对文件进行修改,并最后确定特徵码的位置与类型。小提示:四处结果不一定都需要改,如果只改动一处就成功,那是最好不过的。挑一处段大小最小的改吧,就第一项,从文件偏移0x180C开始的0x14个字节。我们用 OllyDbg打开升级器.exe,来到0x0040180C处。这里省略了文件偏移和记忆体偏移的转换,不知道要先补补课。代码如下:
0040180E 83C0 C1 add eax,-3F
00401811 83F8 39 cmp eax,39
00401814 0F87 5C01000> ja win.00401976
0040181A 33C9 xor ecx,ecx
0040181C 8A88 0C1A400> mov cl,byte ptr ds:[eax+401A0C]
00401822 FF248D E4194> jmp dword ptr ds:[ecx*4+4019E4]
怎么改呢?这里讲两个通用的方法。特徵码不可能只由某一句指令来确定,这样误报率会非常高,因此通常是多条指令的组合,我们只要将这个组合打乱既可。最简单的方法当然是两条指令调个顺序,我们把它叫做指令顺序调换法,它使用的范围仅限于互不干扰的两条指令。可有很多情况,指令的执行顺序是不能调的,比如上面的6条指令,这时就用第二种方法,那就是,咳咳,通用跳转法则:在文件中寻找一个空隙,(由于对齐的原因,PE文件中往往会有一些空隙处没有代码,全部为0。为什么?补课的先!)将原来的指令改成一个跳转,跳到这个空隙去执行,空隙处填入我们原来的指令,执行完毕再跳转回去。我们将OllyDbg的卷轴向下拉,Look,在0x00405D20处有空隙。
修改方法见下面(改之前别忘了先将原文件备份一下):
0040180E /E9 0D450000 jmp 升级器.00405D20
00401813 |90 nop
00401814 |0F87 5C010000 ja 升级器.00401976
为什么要改add和cmp两句?因为jmp指令占了5个字节,而add和cmp均为3字节
指令,只能两个一起改了。好,我们将0x0040180E处改为jmp 00405D20,多出一个字节我们改为nop。(不改nop也行,但是OllyDbg显示时会出现花指令,我们是追求完美的。)接着在空白处将原来的 add和cmp两条指令补上,尾部再来个jmp回去的代码。在jmp回去时,可以回到nop,也可以直接跳到ja处,这里选择跳回nop。
00405D20 83C0 C1 add eax,-3F
00405D23 83F8 39 cmp eax,39
00405D26 ^ E9 E8BAFFFF jmp 升级器.00401813
修改完毕,我们保存一下先。在OllyDbg窗口中单击右键选择“复制到可执行文件—>全部保存”,然后保存到升级器.exe中。OK,在功能表中选择“重新运行”,回到0040180E处,确定刚才的修改已经保存了。关闭OllyDbg,找到升级器.exe,用杀毒软体进行扫描。嘿嘿,卡巴斯基已经认不出它来了!打完收功!
你也许会问,不管什么杀毒软体都是这样修改吗?答案是:NO。各个杀毒软体对特徵码的定义是不一样的,唯一的方法就是分别对每个平台进行检测,再有针对性的修改。修改方法一样:指令顺序调换法(这种最简单)和通用跳转法!对了,还有一点:尽量在代码段中找空,但有时候代码段中的空隙实在是不够,就把跳转的代码写在别的段中。由于这些段的默认属性里没有“可执行”这一项,你把代码移过去执行自然会报错,这时用PE修改工具将段属性加上可执行就可以了。