首页
社区
课程
招聘
VProtector加壳工具测试版
发表于: 2004-12-4 14:13 15801

VProtector加壳工具测试版

2004-12-4 14:13
15801
收藏
免费 1
支持
分享
最新回复 (63)
雪    币: 212
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
51
跟踪了一下vprot的主程序。发表一下自己的观点(板砖N个)
vprot的加密思路比较新颖,强度较好
采用了大量seh,花指令,跳转改变流程,antidump,api加密,动态解压缩
call指令的加密等。

担忧几个问题需要改进一下,否则跟踪起来很容易
1 seh,花指令的共有11种,代码固定,利用程序几行指令就去掉了,应该采用一下多态变形技术,xpro1.07用的就很好
2 没有文件和的校验,去掉seh,花指令后执行正常,hying的壳油文件校验,脱壳的难度就大多了。
3 api的处理相对简单,只要将mov [esp+1c],eax去掉就可以了,因为程序并没有将部分代码移动。
4 解密段中的int3的代码形式太固定了,用程序找jmp short和jmp far 跳到的位置是int3 改成两个获四个nop就行。
5 call的变形恢复起来比较麻烦。我没想出好办法

希望见到的正式版能加密强度有质的提高!
2004-12-9 11:31
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
52
syy 兄很强了
2004-12-9 12:27
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
53
syy
你说的几个问题的确是这个壳的弱点,我也在想办法解决 :(

你的分析能力真的让人佩服:)
2004-12-9 12:30
0
雪    币: 212
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
54
to vcasm
阁下知道的跟踪软件总类真多:)判断的有20多种吧
BTW:
去掉反跟踪后的VPROT程序(但没脱掉壳)可以公开出来讨论吗?
2004-12-9 15:23
0
雪    币: 154
活跃值: (216)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
55
最初由 fly 发布
syy 兄很强了

这家伙发贴全是强壳的贴。XPROTECTOR,现在又盯上这个了。
2004-12-9 16:13
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
56
最初由 syy 发布
to vcasm
阁下知道的跟踪软件总类真多:)判断的有20多种吧
BTW:
去掉反跟踪后的VPROT程序(但没脱掉壳)可以公开出来讨论吗?


:) 没事的  能听到强人的分析 对论坛大伙技术一定有很大帮助的
2004-12-9 16:30
0
雪    币: 212
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
57
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

不当指出,大家指正 谢谢
2004-12-9 20:20
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
58
强!  佩服:)
2004-12-9 20:27
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
59
很有耐心和功力
佩服

把你的手工增加解压缩代码文件修了一下
可以在WinXP SP2下跑起来

附件:F_VProtector.rar
2004-12-9 20:33
0
雪    币: 319
活跃值: (2439)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
60
一群BT:D
2004-12-9 20:39
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
61
这段破解的过程看的很舒服 呵呵,可能是我喜欢看C代码的关系吧
2004-12-9 20:48
0
雪    币: 212
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
62
xprotector1.07增加多态垃圾代码的程序很有意思
如果VCASM能用上就更好了

希望能看到破解CALL加密的方法,我是不行了:(
2004-12-9 21:03
0
雪    币: 255
活跃值: (266)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
63
:D too nb
2004-12-9 21:25
0
雪    币: 260
活跃值: (162)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
64
加入多态垃圾代码编程实现应该不难 不过我想到一个可能更好的方法 呵呵 改天有充分的时间我写上晚上替换目前的int3的思路
2004-12-9 21:53
0
游客
登录 | 注册 方可回帖
返回
//