VPROTECTOR反跟踪代码的去除
Vcasm的vprotector是一款比较优秀的加密软件,本人用了大量的时间也没有它的壳脱掉,只是去掉了部分反跟踪代码。现将自己的方法简单说一下,希望大家指正。
现在的加壳程序采用的反跟踪方法我认为主要用两种。一是利用比较先进的方法,这种方法知道的人很少。但其缺陷是实效时间较短,一旦有人公布了细节,这种方法就不成其为方法了。第二种是加大数量,使手动跟踪的人失去耐心(xprotextor就是其中之一),但加大数量必须有计算机程序来完成,这就必然尤其规律性。如果不消除这种规律,利用程序就很容易去处这部分反跟踪代码。
vprotector程序中的部分反跟踪代码就是由于规律性太强,才让我钻了空子;)
1 代码使用了大量的seh 垃圾代码,花指令等,一共有11种。利用程序就很容易去除。
c的代码如下:
for(i=0;i<filelen-0x20;i++) //filelen为文件长度,m_buffe是打开文件的缓冲区指针
{
len=0;
//seh 垃圾代码一共有11种,判断去除
switch (*(DWORD*)((char*)m_buffer+i))
{
case 0x3e8:
if(*(DWORD*)((char*)m_buffer+i+5)==0x580084c7)len=19;
break;
case 0x7e8:
if(*(DWORD*)((char*)m_buffer+i+5)==0xc08383c7)len=26;
break;
case 0x4b9:
if(*(DWORD*)((char*)m_buffer+i+5)==0x1fe8)len=0x2c;
break;
case 0x16e8:
if(*(DWORD*)((char*)m_buffer+i+5)==0xc245c8b)len=0x2f;
break;
case 0x5e8:
if(*(DWORD*)((char*)m_buffer+i+5)==0x5eb010f)len=17;
break;
case 0x10e8:
if(*(DWORD*)((char*)m_buffer+i+5)==0x824648b)len=0x26;
break;
case 0x8e8:
if(*(DWORD*)((char*)m_buffer+i+5)==0xc083010f)len=22;
break;
case 0x24e8:
if(*(DWORD*)((char*)m_buffer+i+5)==0x424448b)len=0x4d;
break;
case 0x64e8:
if(*(DWORD*)((char*)m_buffer+i+5)==0x424448b)len=0xe5;
break;
case 0x310f01eb:
if(*(DWORD*)((char*)m_buffer+i+5)==0xc8330ceb)len=22;
break;
case 0x477ed87:
if(*(DWORD*)((char*)m_buffer+i+5)==0x700074db)len=0x1e;
break;
}
//保留seh的设置,其他的代码去掉
if(len==0xe5)
{
for(j=5;j<0x87;j++)*(char*)((char*)m_buffer+i+j)=(char)0x90;
for(j=0x8e;j<0xac;j++)*(char*)((char*)m_buffer+i+j)=(char)0x90;
for(j=0xb3;j<len;j++)*(char*)((char*)m_buffer+i+j)=(char)0x90;
}
else
for(j=0;j<len;j++)*(char*)((char*)m_buffer+i+j)=(char)0x90;
if(len!=0)i+=(len-1);
}
但这种方法不能去处加密的部分,我采用的方法是将解密后的代码写到文件的后面,将最后一个段的长度增加,将可选头部的image size 增加。由于我为了方便没有改全,win98下可以运行,win2000以上版本可能有问题。
改完以后用以上代码在处理一次,ok了。
2 int3的去除
同样还是规律的事;程序中所有的int3的位置都在跳转语句指向的位置,跳转有两种jmp short和jmp far对应机器码0xeb和0xe9,余下的几个用简单的判断就能去除。
//本来想安语句分析,后来去掉了,disasm.cpp
//asmserv.cpp没去掉以待将来有用,
for(i=0x2e000;i<filelen-20;i++)
{
//去掉jmp short jmp far指向的int3
switch(*(char*)((char*)m_buffer+i))
{
case 0xffffffeb:
jmpeb=*(signed char*)((char*)m_buffer+i+1);
if(i+jmpeb+2>filelen)break;
if(*(char*)((char*)m_buffer+i+jmpeb+2)==(char)0xcc)
*(short*)((char*)m_buffer+i+jmpeb+2)=(short)0x9090;
break;
case 0xffffffe9:
jmpe9=*(signed long*)((char*)m_buffer+i+1);
if(i+jmpe9+5>filelen)break;
if(*(char*)((char*)m_buffer+i+jmpe9+5)==(char)0xcc)
*(short*)((char*)m_buffer+i+jmpe9+5)=(short)0x9090;
break;
}
}
3 import 的指向问题将mov [esp+1c],esi,去掉就可以了
if(*(DWORD*)((char*)m_buffer+i)==0x1c247489)
*(DWORD*)((char*)m_buffer+i)=0x90909090;
4 程序用createfile判断跟踪程序是否存在,但程序判断过程利用了一个子程序处理。这样只要将子程序的入口改成ret 04,判断程序就不起作用了。
5 isdebugpresent的判断我没有处理
6 antidump代码我没有处理
7 部分call的代码会指向壳部分,这段代码太复杂,也太有新意,我没法处理
8 import没有修复
处理后的代码如下
附件:VPro2.rar
程序如下:
附件:a.rar
手工增加解压缩代码如下
附件:VProtector.rar
不当指出,大家指正 谢谢