首页
社区
课程
招聘
关于VMP的一个问题,求解。
发表于: 2012-9-23 02:53 4809

关于VMP的一个问题,求解。

2012-9-23 02:53
4809
刚开始看VMP的这篇文章,地址http://bbs.pediy.com/showthread.php?t=121412
遇到了一个问题,就是把DispatchTable(处理过程的派发表)里面的数据解密之后,每个handler(处理过程)里面都是被花指令弄的乱七八糟的,这里面的得怎么看额?  看了半天 , 那块就卡住了,好蛋疼, 求解答阿。

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
只需要关心对关键寄存器值操作的指令,其他的指令基本都是垃圾指令~~比如在VMP中,虚拟寻址寄存器esi,这就是一个关键寄存器,我们只需要关心对这个寄存器操作的指令。
同样拿NOTEPAD.exe作实例,截图如下:
截图中显示的是对opcode寻址寄存器esi值的解密操作,其中有效指令才4条(注释中打*的指令),4条共同的特点是都有直接对esi的操作,那么根据这个特点,其他对esi值无影响的指令基本就是垃圾指令了。
上传的附件:
  • 1.jpg (38.26kb,82次下载)
2012-9-23 14:17
0
雪    币: 10
活跃值: (231)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
你好,感谢您的回答。 你的意思是当是对重要寄存器例如EBP,EDI,esi,eax,ebx,ECX,Esp,EDX等这些寄存器操作的时候那就是重要的指令,其余的例如
0043D374   .  20D8          and al,bl
0043D376   .  F9            stc
0043D377   .  8A46 FF       mov al,byte ptr ds:[esi-0x1]
0043D37A   .  D2F2          sal dl,cl
0043D37C   .  FEC2          inc dl

这样的操作的时候也就是费指令了,这样理解对么?
能否麻烦你花一点时间把NOTEPAD.exe中的0043D374做一个例子让我看一下的, 截图如下
上传的附件:
  • 1.png (40.76kb,66次下载)
2012-9-23 21:24
0
雪    币: 10
活跃值: (231)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
刚继续看了 翻了那帖子, 似乎有点理解了。 要关心的是关键寄存器,对栈做了什么操作是么?
ebp edi esi 这3个上的操作是么?
2012-9-23 21:46
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
0043D374 > 20D8 AND AL,BL ;                                         由于地址0043D377回写了al的值,所以这条指令作废
0043D376 F9 STC
0043D377 8A46 FF MOV AL,BYTE PTR DS:[ESI-0x1] ; *取opcode值到al,此后重点关注对al值有直接影响的指令操作
0043D37A D2F2 SAL DL,CL
0043D37C FEC2 INC DL
0043D37E E9 C51D0000 JMP 0043F148 ; 0043F148

0043F148 30D8 XOR AL,BL                                         ; *解密al
0043F14A 9C PUSHFD
0043F14B ^ E9 0DE3FFFF JMP 0043D45D ; 0043D45D

0043D45D FF3424 PUSH DWORD PTR SS:[ESP]
0043D460 FEC0 INC AL                                                 ; *解密al
0043D462 66:BA A6E1 MOV DX,0xE1A6
0043D466 0F9BC6 SETPO DH
0043D469 C0C8 07 ROR AL,0x7                                 ; *解密al
0043D46C 50 PUSH EAX
0043D46D F6D2 NOT DL
0043D46F 66:0FBED2 MOVSX DX,DL
0043D473 FEC0 INC AL                                                 ; *解密al(al解密完毕)
0043D475 E8 95FDFFFF CALL 0043D20F ; 0043D20F

0043D20F 10E2 ADC DL,AH
0043D211 66:0FB3DA BTR DX,BX
0043D215 30C3 XOR BL,AL                                                 ; 这条语句也有对al的操作,但是并没有改变al的值。按理来说他是一条无效指令,实际上他是一条有效指令,因为他改变了bl的值,而bl的值将会影响到后面指令的解密
0043D217 E9 C4190000 JMP 0043EBE0 ; 0043EBE0

0043EBE0 E8 B3FEFFFF CALL 0043EA98 ; 0043EA98

0043EA98 FEC2 INC DL
0043EA9A FEC2 INC DL
0043EA9C 4E DEC ESI                                                  ; *esi后移一位,定位到下条指令地址
0043EA9D 80E6 D5 AND DH,0xD5
0043EAA0 66:8B55 00 MOV DX,WORD PTR SS:[EBP] ; *取出栈顶一个word量放到dx中(注意对寄存器ebp的操作)
0043EAA4 C60424 8D MOV BYTE PTR SS:[ESP],0x8D
0043EAA8 881C24 MOV BYTE PTR SS:[ESP],BL
0043EAAB F8 CLC

0043EAAC 83C5 02 ADD EBP,0x2                                 ; *栈顶下降2个字节

0043EAAF 9C PUSHFD
0043EAB0 897424 04 MOV DWORD PTR SS:[ESP+0x4],ESI ; NOTEPAD.0041E357
0043EAB4 ^ E9 21F1FFFF JMP 0043DBDA ; 0043DBDA

0043DBDA 881438 MOV BYTE PTR DS:[EAX+EDI],DL ; *dx的低位放到Vmcontext偏移eax的位置,dx在前面赋过值
0043DBDD C60424 1F MOV BYTE PTR SS:[ESP],0x1F
0043DBE1 9C PUSHFD
0043DBE2 50 PUSH EAX
0043DBE3 9C PUSHFD
0043DBE4 8D6424 24 LEA ESP,DWORD PTR SS:[ESP+0x24]
0043DBE8 E9 CE0A0000 JMP 0043E6BB                         ; Jmp VmDispatch,跳到Dispatch准备执行下一条指令
单独提取出有效指令如下:
0043D377 /MOV AL,BYTE PTR DS:[ESI-0x1]                 ; *取opcode值到al,此后重点关注对al值有直接影响的指令操作
0043F148 |XOR AL,BL                                                 ; *解密al
0043D460 |INC AL                                                         ; *解密al
0043D469 |ROR AL,0x7                                                 ; *解密al
0043D473 |INC AL                                                         ; *解密cal
0043D215 |XOR BL,AL
0043EA9C |DEC ESI                                                         ; esi后移一位,定位到下条指令地址
0043EAA0 |MOV DX,WORD PTR SS:[EBP]                         ; *取出栈顶一个word量放到dx中(注意对寄存器ebp的操作)
0043EAAC |ADD EBP,0x2                                                 ; *栈顶下降2个字节
0043DBDA \MOV BYTE PTR DS:[EAX+EDI],DL            ; dx的低位放到Vmcontext偏移eax的位置

看其有效操作,基本功能为从当前VMESP(实际ebp)中取出一个Byte量(Dl),放入VMContext(EDI)偏移为eax的内存中,实际上就是虚拟寄存器中。用伪指令可以这样描述:

mov VmReg,byte ptr:[ebp]
2012-9-24 21:40
0
雪    币: 10
活跃值: (231)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=kingcomer;1104014]0043D374 > 20D8 AND AL,BL ;                                         由于地址0043D377回写了al的值,所以这条指令作废
0043D376 F9 STC
0043D377 8A46 FF MOV AL,BYTE PTR DS:[ESI-0x1] ; *取opcode值到al,此后重点关注对al...[/QUOTE]

非常感谢, 很不错。
2012-9-25 11:34
0
雪    币: 437
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习中。。。
2013-1-24 17:19
0
游客
登录 | 注册 方可回帖
返回
//