本帖最后由 cpujazz 于 2022-1-13 20:08 编辑
最近在研究vmp, 花了2天时间写了个vmp3.x Jcc爆破插件
源程序代码
[Asm] 纯文本查看 复制代码 004010A9 /. 55 push ebp
004010AA |. 8BEC mov ebp,esp
004010AC |. 81EC 08000000 sub esp,0x8
004010B2 |. 6A FF push -0x1
004010B4 |. 6A 08 push 0x8
004010B6 |. 68 06000116 push 0x16010006
004010BB |. 68 01000152 push 0x52010001
004010C0 |. E8 CF000000 call 无壳.00401194
004010C5 |. 83C4 10 add esp,0x10
004010C8 |. 8945 FC mov [local.1],eax ; kernel32.BaseThreadInitThunk
004010CB |. 68 FC084800 push 无壳.004808FC ; ASCII "123"
004010D0 |. FF75 FC push [local.1]
004010D3 |. E8 2CFFFFFF call 无壳.00401004
004010D8 |. 83C4 08 add esp,0x8
004010DB |. 83F8 00 cmp eax,0x0
004010DE |. B8 00000000 mov eax,0x0
004010E3 |. 0f94c0 sete al
004010E6 |. 8945 F8 mov [local.2],eax ; kernel32.BaseThreadInitThunk
004010E9 |. 8B5D FC mov ebx,[local.1]
004010EC |. 85DB test ebx,ebx
004010EE |. 74 09 je short 无壳.004010F9
004010F0 |. 53 push ebx
004010F1 |. E8 98000000 call 无壳.0040118E
004010F6 |. 83C4 04 add esp,0x4
004010F9 |> 837D F8 00 cmp [local.2],0x0
004010FD |. 0F84 34000000 je 无壳.00401137
00401103 |. BB 06000000 mov ebx,0x6
00401108 |. E8 94FFFFFF call 无壳.004010A1
0040110D |. 68 01030080 push 0x80000301
00401112 |. 6A 00 push 0x0
00401114 |. 68 00000000 push 0x0
00401119 |. 68 04000080 push 0x80000004
0040111E |. 6A 00 push 0x0
00401120 |. 68 FC084800 push 无壳.004808FC ; ASCII "123"
00401125 |. 68 04000000 push 0x4
0040112A |. BB 60124000 mov ebx,无壳.00401260
0040112F |. E8 54000000 call 无壳.00401188
00401134 |. 83C4 34 add esp,0x34
00401137 |> 8BE5 mov esp,ebp
00401139 |. 5D pop ebp ; kernel32.776F347D
0040113A \. C3 retn
加了vmp
[Asm] 纯文本查看 复制代码 004010A9 55 push ebp
004010AA 8BEC mov ebp,esp
004010AC 81EC 08000000 sub esp,0x8
004010B2 - E9 5A3D2900 jmp vmp3_5加.00694E11
; 无效代码省略
00401139 C3 retn
下面简单演示一下怎么用的
首先到vm入口停下来
然后单步一下,改变一下eip
VM入口
就可以右键分析了
这个时候有一个jcc,先记录下来
分析结果
出现了一个错误,这个可以不用管它,直接到OD把异常点运行过去
单步步过异常点
接下就是记录Jcc,直到走出vm代码
这是我记录的jcc
记录的jcc
现在就可以粗略的判断
最后一个可以直接排除,这个涉及到vmp的原理,这里不多讲,看第一个操作数为40的jcc就行了
现在倒着找Jcc
将eax改成0 (是0改成1,是1改成0)
运行,发现没反应,这时候去找倒数第二个
在堆栈发现了一些奇怪的字符串
还是先爆破,将edx改成1
发现还是没反应
继续找倒数第三个00764DC3
运行,发现弹窗了,这个就是爆破成功了
结尾
插件使用了udis86+unicorn来跑的代码,
可能会有一些bug,可以回帖来反馈一下
打算后面写vmp2.x 等虚拟化代码爆破
|