首页
社区
课程
招聘
[讨论]如何清理VMP的变形代码
发表于: 2012-2-24 10:37 13735

[讨论]如何清理VMP的变形代码

2012-2-24 10:37
13735
有没有人研究过VMP的变形代码是如何生成的,有什么规律没?

我看来看去,没找到什么规律。。 至少themida的是模板的递归嵌套,不过VMP完全是一个不同的东西

贴一段变形前后的代码,大家帮忙看看能不能找出什么规律。。程序如何实现变形的还原。

//
// 原始代码如下
//

01007568  /$  68 BA750001   push    <jmp.&msvcrt._except_handler3>
0100756D  |.  64:A1 0000000>mov     eax, dword ptr fs:[0]
01007573  |.  50            push    eax
01007574  |.  8B4424 10     mov     eax, dword ptr [esp+10]
01007578  |.  896C24 10     mov     dword ptr [esp+10], ebp
0100757C  |.  8D6C24 10     lea     ebp, dword ptr [esp+10]
01007580  |.  2BE0          sub     esp, eax
01007582  |.  53            push    ebx
01007583  |.  56            push    esi
01007584  |.  57            push    edi
01007585  |.  8B45 F8       mov     eax, dword ptr [ebp-8]
01007588  |.  8965 E8       mov     dword ptr [ebp-18], esp
0100758B  |.  50            push    eax
0100758C  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
0100758F  |.  C745 FC FFFFF>mov     dword ptr [ebp-4], -1
01007596  |.  8945 F8       mov     dword ptr [ebp-8], eax
01007599  |.  8D45 F0       lea     eax, dword ptr [ebp-10]
0100759C  |.  64:A3 0000000>mov     dword ptr fs:[0], eax
010075A2  \.  C3            retn

=======================================================================================

//
// 变形后代码
//
01034926    98                    cwde                                    
01034927    68 BA750001           push    010075BA                        
0103492C    68 E6582DAC           push    AC2D58E6                        
01034931    64:A1 00000000        mov     eax, dword ptr fs:[0]           
01034937    60                    pushad                                 
01034938    F8                    clc                                    
01034939    66:0FA3CF             bt      di, cx                          
0103493D    874424 20             xchg    dword ptr [esp+20], eax         
01034941    66:35 1C44            xor     ax, 441C                        
01034945    9F                    lahf                                    
01034946    80C4 BF               add     ah, 0BF                        
01034949    66:0FBAF0 0C          btr     ax, 0C                          
0103494E    8B4424 30             mov     eax, dword ptr [esp+30]         
01034952    E9 80820000           jmp     0103CBD7                        
0103CBD7    E8 C0DAFFFF           call    0103A69C                        
0103A69C    9C                    pushfd                                 
0103A69D    F8                    clc                                    
0103A69E    896C24 38             mov     dword ptr [esp+38], ebp         
0103A6A2    66:D3E5               shl     bp, cl                          
0103A6A5    66:D3F5               sal     bp, cl                          
0103A6A8    8DAC24 072A27BC       lea     ebp, dword ptr [esp+BC272A07]   
0103A6AF    66:0FA4E5 06          shld    bp, sp, 6                       
0103A6B4    8D6C24 38             lea     ebp, dword ptr [esp+38]         
0103A6B8    39FD                  cmp     ebp, edi                        
0103A6BA    F9                    stc                                    
0103A6BB    66:0FBAE5 07          bt      bp, 7                           
0103A6C0    8D6424 28             lea     esp, dword ptr [esp+28]         
0103A6C4    2BE0                  sub     esp, eax                        
0103A6C6    60                    pushad                                 
0103A6C7    E9 9B590000           jmp     01040067                        
01040067    F6D4                  not     ah                              
01040069    68 4FA672F0           push    F072A64F                        
0104006E    895C24 20             mov     dword ptr [esp+20], ebx         
01040072    8D04AD C67280D0       lea     eax, dword ptr [ebp*4+D08072C6]
01040079    0F96C0                setbe   al                              
0104007C    897424 1C             mov     dword ptr [esp+1C], esi         
01040080    E8 13A1FFFF           call    0103A198                        
0103A198    98                    cwde                                    
0103A199    897C24 1C             mov     dword ptr [esp+1C], edi         
0103A19D    66:0FB6C3             movzx   ax, bl                          
0103A1A1    98                    cwde                                    
0103A1A2    8D80 BEFD2DCB         lea     eax, dword ptr [eax+CB2DFDBE]   
0103A1A8    8B45 F8               mov     eax, dword ptr [ebp-8]         
0103A1AB    E9 5B1E0000           jmp     0103C00B                        
0103C00B    E9 680AFFFF           jmp     0102CA78                        
0102CA78    C64424 08 1A          mov     byte ptr [esp+8], 1A            
0102CA7D    8D6424 1C             lea     esp, dword ptr [esp+1C]         
0102CA81    8965 E8               mov     dword ptr [ebp-18], esp         
0102CA84    E9 D5860000           jmp     0103515E                        
0103515E    0F8F 44A80000         jg      0103F9A8                        
0103F9A8    E8 5FEAFEFF           call    0102E40C                        
0102E40C    870424                xchg    dword ptr [esp], eax            
0102E40F    9F                    lahf                                    
0102E410    8B45 FC               mov     eax, dword ptr [ebp-4]         
0102E413    60                    pushad                                 
0102E414    68 17737B60           push    607B7317                        
0102E419    C745 FC FFFFFFFF      mov     dword ptr [ebp-4], -1           
0102E420    C64424 04 D0          mov     byte ptr [esp+4], 0D0           
0102E425    9C                    pushfd                                 
0102E426    9C                    pushfd                                 
0102E427    E8 1E0E0100           call    0103F24A                        
0103F24A    8945 F8               mov     dword ptr [ebp-8], eax         
0103F24D    8D85 CA57CB98         lea     eax, dword ptr [ebp+98CB57CA]   
0103F253    8D45 F0               lea     eax, dword ptr [ebp-10]         
0103F256    E9 52CAFEFF           jmp     0102BCAD                        
0102BCAD    66:C74424 08 88C4     mov     word ptr [esp+8], 0C488         
0102BCB4    E9 E5200000           jmp     0102DD9E                        
0102DD9E    E9 68270100           jmp     0104050B                        
0104050B    64:A3 00000000        mov     dword ptr fs:[0], eax           
01040511    FF3424                push    dword ptr [esp]                 
01040514    68 D9BC5C38           push    385CBCD9                        
01040519    52                    push    edx                             
0104051A    FF7424 3C             push    dword ptr [esp+3C]              
0104051E    C2 4000               retn    40

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2

知道怎么干掉垃圾代码但是不知道如何生成……
2012-2-24 11:17
0
雪    币: 576
活跃值: (1163)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
怎么干掉? 堆栈平衡吗?
2012-2-24 12:00
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
就我的感觉,不需要清理 vmp 那些垃圾指令的,如果 handler 的意思已经知道了,那么有必要清理吗 ?

我也不懂,等大牛出现指点
2012-2-24 16:25
0
雪    币: 576
活跃值: (1163)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
呵呵,对于handler的识别确实是不需要清理的,但是假设有段很长的代码加了变形后,你要怎么看?我觉得会看的糊里糊涂的。。
2012-2-24 22:31
0
雪    币: 4200
活跃值: (4178)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
求HANDLE 的意思
2012-2-25 00:40
0
雪    币: 135
活跃值: (106)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
7
VMP的变形,只变了栈操作的指令,改变了esp的偏移,其他指令没有改变

另外就是插入无用指令,这个类似于花吧

还有就是jmp/call乱序。貌似正常call用retn模拟。

要还原的话,我觉得要写一个分析器,第一步清除无用花指令,第二步恢复栈操作指令。

个人见解。。。
2012-3-28 23:58
0
雪    币: 135
活跃值: (106)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
8
他的无用花指令我觉得是根据这个原理来生成的:

比如原指令中有一条

mov eax, 1

那么在VMP可以在这条之前,插入任意条对eax进行操作的指令,
最终执行到这条指令的时候, eax还是会被覆盖成正确的值。

比如你贴的变形代码里面

01034941    66:35 1C44            xor     ax, 441C                        
01034945    9F                    lahf                                    
01034946    80C4 BF               add     ah, 0BF                        
01034949    66:0FBAF0 0C          btr     ax, 0C                          
0103494E    8B4424 30             mov     eax, dword ptr [esp+30]  

01034941这里对ax进行了操作,但是其后一直到0103494E这里ax并没有被使用,
0103494E这里又把eax覆盖了,所以之前对ax操作的那条指令必定就是无用的花指令了.

如果写还原器的话,也肯定要根据这个原理来清理无用花指令。

个人意见, 最近在研究VMP的虚拟啊,大牛貌似很强的样子,加起来交流下吧
2012-3-29 00:10
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
2.10的vmp壳又加了资源效验,脱掉壳还原更麻烦
2012-3-30 17:05
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
10
关注ing,期待大鸟出现...
2012-3-30 18:10
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
强大的老外。。。。
2012-7-13 00:21
0
雪    币: 316
活跃值: (128)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
12
小弟觉得要清理变形代码必须写个汇编代码优化引擎.
2012-7-13 00:32
0
雪    币: 1361
活跃值: (1052)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
基本块 123456
2012-7-13 00:50
0
雪    币: 54
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
handler的意思是“原子处理函数”,是由一条或数条汇编指令构成的一个代码段。比如在CV中,可能将一条X86指令ADD EAX,08H变成了虚拟指令,然后在执行的时候需要将这条指令的效果实现。那么在基于堆栈的虚拟机中,可能会分解为以下几个操作:1,将源操作数的值放入栈顶,2,将目的操作数的值放入栈顶,3,将栈顶的两个值相加放入对应的位置,也就是虚拟机的Virtual_EAX中,4,因为这条指令执行的结果会修改标识寄存器,所以还会有个操作将真实标志寄存器的值放入虚拟的标志寄存器中。可能上述操作的顺序会有所差别,但是基本上一个指令的实现都需要包含上面这几个操作。而上面的每一步操作都有可能是由一个或几个handler来实现。而handler中就会有频繁的堆栈操作。如果能把每条handler都拿到,并知道具体的功能是什么,那么虚拟机就分析的差不多了。不过不论是CV,还是VMP,最后在程序中的handler都是经过变形的,分析清楚不是那么容易。
2012-7-13 09:44
0
雪    币: 54
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
handler的意思是“原子处理函数”,是由一条或数条汇编指令构成的一个代码段。比如在CV中,可能将一条X86指令ADD EAX,08H变成了虚拟指令,然后在执行的时候需要将这条指令的效果实现。那么在基于堆栈的虚拟机中,可能会分解为以下几个操作:1,将源操作数的值放入栈顶,2,将目的操作数的值放入栈顶,3,将栈顶的两个值相加放入对应的位置,也就是虚拟机的Virtual_EAX中,4,因为这条指令执行的结果会修改标识寄存器,所以还会有个操作将真实标志寄存器的值放入虚拟的标志寄存器中。可能上述操作的顺序会有所差别,但是基本上一个指令的实现都需要包含上面这几个操作。而上面的每一步操作都有可能是由一个或几个handler来实现。而handler中就会有频繁的堆栈操作。如果能把每条handler都拿到,并知道具体的功能是什么,那么虚拟机就分析的差不多了。不过不论是CV,还是VMP,最后在程序中的handler都是经过变形的,分析清楚不是那么容易。
2012-7-13 09:46
0
游客
登录 | 注册 方可回帖
返回
//