[转] 菜鸟手脱VMP,附上脱壳进度和温馨写的脚本,可跨平台

【VC6】的OEP第一个API调用是GetVersion

6、用UIf 修复IAT 
7、用lodepe dump
8、用imprec 修复IAT
玖、用cff 去掉壳段
迄今VMP脱壳完成!

bet365网址,万能断点

不需求知道程序行使的编译器和编译语言,直接OD载入程序,直接运维程序,输入假码之后,不要点击按钮:
365bet手机客户端下载 1
查看user32模块:
365bet手机客户端下载 2
过来user32模块然后,搜索特征码,右键->查找->2进制字符串:“F三A5八BC8八三E十3F3亚洲龙E八”
365bet手机客户端下载 3
下一场下断点,找到全体的都要下断点。然后回来程序,点击按钮,程序暂停,重回OD,alt+F九,执行到用户代码:
365bet手机客户端下载 4
然后就到了按键事件处理的代码了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
EAX 00000000                                              ;这是执行pushad后各个寄存器的值
ECX 0012FFB0
EDX 7C92E514 ntdll.KiFastSystemCallRet
EBX 7FFD5000
ESP 0012FFA4                                              ;我们在0012fff0处下个硬件断点,然后运行
EBP 0012FFF0
ESI 7C9A0620 ntdll.7C9A0620
EDI 7C930460 ntdll.7C930460
EIP 00413001 RebPE.00413001
================================================================================================
00150283    68 30114000     push 0x401130                 ;断在这里了,我们单步跟踪
00150288    C3              retn
00150289    3011            xor byte ptr ds:[ecx],dl
0015028B    0000            add byte ptr ds:[eax],al
0015028D    0100            add dword ptr ds:[eax],eax
================================================================================================到达OEP
00401130    55              push ebp
00401131    8BEC            mov ebp,esp
00401133    6A FF           push -0x1
00401135    68 B8504000     push RebPE.004050B8
0040113A    68 FC1D4000     push RebPE.00401DFC
0040113F    64:A1 00000000  mov eax,dword ptr fs:[0]
00401145    50              push eax

 365bet手机客户端下载 5

累计陆种 IAT相关的拍卖,所以本身是 1边写脚本1边骂写
VMP壳的人,要不要这么坑啊,作者要的脱的主次更大 跑一遍要
2个钟头,作者也不记得自个儿跑了稍稍遍了!哎!说来都以泪,新手正是那样啊!不多说了上边贴上脚本!必要的友好去下!

易语言

注意,易语言编写的先后,使用PEiD查壳时,展现的编写翻译器也是Visual
C++陆.0,使用OD载入程序,直接在反汇编窗口中右键->查找->贰进制字符串,输入易语言的特征码:“FF
二五”,假如能够找到,就表明是易语言编写的顺序。
易语言体:
365bet手机客户端下载 6
能够看来有一群的jmp指令,以上就能判断是易语言程序。

下一步查找易语言的按钮事件:2进制字符串“FF 5伍 FC 伍F
5E»ò(e-debug)”,找到之后,会赶到CALL处,直接下断:
365bet手机客户端下载 7
摸索剩下的,全体地点都下断点,然后F九运行程序初始调节和测试。

易语言程序还是能运用另壹种办法来搜寻按钮事件,使用E-debug工具:
365bet手机客户端下载 8
使用OPEN载入易语言程序,然后点击STA奥德赛T,启动程序,点击按钮,会来得事件时有产生的地方:
365bet手机客户端下载 9
笔录事件发生的地方,然后使用OD载入程序,跟踪到那几个地址下断点:
Ctrl+G,输入要跟随的表明式,输入刚才记录的地点,下断点:
365bet手机客户端下载 10
F九运行程序,触发断点事件,即可断在此处。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
1、od载入后运行
2、我们去堆栈的最下面,开始向上找,找第一个程序领空地址的
=================================================================================================
0012FFA4  |FFFFFFFF
0012FFA8  |0012FF4C
0012FFAC  |0012FFF0
0012FFB0  |0012FFE0  指向下一个 SEH 记录的指针
0012FFB4  |00401DFC  SE处理程序
0012FFB8  |004050B8  RebPE.004050B8                          ;就是这个,RebPE是程序名,注意左边有个框把这段给框起来了,说明这是一个函数堆栈
0012FFBC  |00000000
0012FFC0  \0012FFF0
0012FFC4   7C816037  返回到 kernel32.7C816037
0012FFC8   7C930460  返回到 ntdll.7C930460
0012FFCC   7C9A0620  ntdll.7C9A0620
=================================================================================================我们继续向上翻,找这个框的开头
 
0012FF14  |00000000
0012FF18  |7FFDE000
          \
向下找,‘返回到’的,这个例子有3个
0012FF1C  /0012FFC0                                                      ;这个就是函数的头部了
0012FF20  |0040101B  返回到 RebPE.0040101B 来自 user32.DialogBoxParamA    ;这个肯定不是,user32.DialogBoxParamA
0012FF24  |00400000  RebPE.00400000
0012FF28  |00000065
0012FF2C  |00000000
0012FF30  |00401080  RebPE.00401080
0012FF38  |004011FE  返回到 RebPE.004011FE 来自 RebPE.00401000            ;排除第一个和第三个,也只剩下这个了,我们右键反汇编跟随
0012FF3C  |00400000  RebPE.00400000
0012FF40  |00000000
0012FF44  |002823C8
0012FF48  |0000000A
0012FF4C  |7C930460  返回到 ntdll.7C930460                                ;这个也肯定不是,都跑系统领空去了
0012FF50  |7C9A0620  ntdll.7C9A0620
0012FF54  |7FFDD000
=================================================================================================反汇编跟随后,向上找断首,就是OEP了
00401130  /.  55            push ebp
00401131  |.  8BEC          mov ebp,esp
00401133  |.  6A FF         push -0x1
00401135  |.  68 B8504000   push RebPE.004050B8
0040113A  |.  68 FC1D4000   push RebPE.00401DFC                      ;  SE 处理程序安装
0040113F  |.  64:A1 0000000>mov eax,dword ptr fs:[0]
00401145  |.  50            push eax
00401146  |.  64:8925 00000>mov dword ptr fs:[0],esp
0040114D  |.  83EC 58       sub esp,0x58
00401150  |.  53            push eb

365bet手机客户端下载 11

做事须要要脱2个VMP壳,小编是贰个平昔没接触过脱壳的人。眨眼之间间那种心思遇到的人相应都领悟!无法硬着头皮找教程,一周看完了
《天草的壳的世界》尝试脱壳下边是自个儿的脱壳进程希望大咖多多指正!
1、准备工具,FEID(查壳工具)、DIE(查壳工具)、LordPE(dump工具)、ImpRec(IAT修复工具)、UIF(IAT修复工具)、CFF(文件优化学工业具)、OD(自个儿爱破解专版
调节和测试工具)
2、查壳 PEID
365bet手机客户端下载 12 
区段突显是vmp一,看来是VMP壳编写语言依旧不可能分明上DIE
365bet手机客户端下载 13 
体现编制程序语言是VC++的,VMP壳
三、开OD准备脱壳、OD设置如下
365bet手机客户端下载 14

Delphi & BC++

选用Detect it
Easy工具鲜明软件应用的编写翻译器为Delphi恐怕是BC++,那七个编写翻译器的按钮特征码相同。
365bet手机客户端下载 15
OD载入程序,反汇编窗口右键->查找->贰进制字符串:
接下来在HEX窗口输入特征码,注意Delphi和BC++的特征码是1模壹样的(“740E八BD38B八三????????FF93????????”):
365bet手机客户端下载 16
留神勾选整个块。

特征码中的问号代表私下数据。
在特征码的底下都会传下三个CALL,然后大家在各样特征码的下边包车型地铁CALL下断点:
365bet手机客户端下载 17
接下来CT奥迪Q7L+L,在具有的特征码上面包车型地铁CALL下断点。因为大家不明了是哪1个按钮,所以必要在每一个按钮都下断点,假诺程序比较小,非常快,如若程序比较大,按钮事件比较多,可以选用脚本来下断点。
断点下完之后,F玖运维程序,然后点击关键的登记之类的按钮,程序会停当前按钮的CALL处,然后F7进CALL,就足以找关键CALL和重点跳了。

1
2
3
4
5
1、在od的调试选项把异常的那个对话框所有异常的勾选全部去掉,ctrl+f2重新载入
2、反复按shift+f9,记录你按下的次数n
3、重新载入,这次按n-1次shift+f9
4、看堆栈,有个se处理程序,反汇编跟随
5、单步跟踪,直到有大跳转

 

 365bet手机客户端下载 18

VB

动用同壹的不二等秘书籍寻找VB的特征码(“816C二四”):
365bet手机客户端下载 19
在各样jmp处下断点,然后运营程序,来到断点处,jmp跟过去未来便是按钮事件的处理进度了。

 

【VB5】的OEP平衡堆栈是 sub
esp,0x5四

365bet手机客户端下载 20 
开拓进度到进口看下
365bet手机客户端下载 21 
4、跑OEP
什么也卡不懂,可是没什么知道是VMP壳就好办,直接CTCR-VL+G  输入 VirtualProtect
下断 如下图(假若提醒未知,先在内部存款和储蓄器窗口找到 kernel3二.dll代码段
进去后在转到就到了)
365bet手机客户端下载 22 
F玖跑起来,那是会段下
365bet手机客户端下载 23 
注意NewProtect 这项 等于 PAGE_READONLY 是终止,不然平素F玖按慢点别跑飞了
365bet手机客户端下载 24 
到0401000处看看,代码是还是不是已经解码
365bet手机客户端下载 25 
现已解码, 搜索特征码 EB0B85F37507八BC陆C壹E0十0BF0
365bet手机客户端下载 26 
那是OEP首个CALL的尾巴,依据她找到OEP 
365bet手机客户端下载 27 
OEP 正是 00a6f7c八,不过那才是第3步 那时候DUMP 是没用的 因为VMP加密了IAT
大家要求苏醒他
5、还原IAT
甭管找二个IAT调用函数跟一下,刚好OEP底下就有四个 FF二五 型的IAT
调用,跟进去看下
365bet手机客户端下载 28 
抑或啥都看不懂,然而没什么
既然是调用IAT函数,肯定会在某壹每一天调到真实函数地址去的
继续跟下边把全路跟的流水生产线贴上来
365bet手机客户端下载 29 
365bet手机客户端下载 30 
365bet手机客户端下载 31 
365bet手机客户端下载 32 
365bet手机客户端下载 33 
365bet手机客户端下载,那是整套工艺流程的莫过于施行的代码 ,未来分析下
0十5玖D玖一    五三              push ebx                     珍贵环境
0105玖D玖二    6六:0FB陆DB       movzx bx,bl          垃圾代码
0十5玖D⑨六    6陆:BB 伍D5伍      mov bx,0x55伍D   垃圾代码
01059D9A    BB 五AC27200     mov ebx,0072C二伍A 
 那才是最后对EBX操作所以上边两条都是没用的代码
00F3BBFF    8B9B 25697400   mov ebx,dword ptr ds:[ebx+0x746925]   
总计地址
01196B98    8D9B 5071F632   lea ebx,dword ptr
ds:[ebx+0x32F67150]  总计地址
00EA9FC2    871C24          xchg dword ptr ss:[esp],ebx 
 和栈顶交流,并还原EBX的原始值
00F九FC玖D    C二 0400         retn 0x四                  还原EBX
并再次来到函数
那会儿看下堆栈 栈顶出现真实函数的地方
<ignore_js_op>365bet手机客户端下载 34 
00F九FC9D    C二 0400         retn 0x4      
分析下那条指令的履行流程,先EIP=栈顶的值 也正是忠实函数地址,栈顶+四+4懂汇编的人就会意识,栈顶+8的岗位保存是时下CALL的归来地址
那执行了那条指令后赶回地址不是未曾了么?因为这几个IAT调用 没加密前是
FF2伍型的 也便是 jmp [????????] 所以不须要回到地址
,而调用这一个IAT的时候
是有一个CALL的进CALL的时候就会PUSH重返地址到库房,所以那么些IAT处理的很抢眼!执行完真实函数后直接就回到到调用IATCALL的下边继续执行了。
看图片发现 那些CALL 下边有一条 RETN指令 看来那条
是VMP加上去的了,然则毫无忽视了那条指令 因为这条指令很重点,VMP在收获
IAT地址的最后RETN的地点 会随机JMP到代码他加上的RETN 上,并不完全是在壳段
所以这些RETN 要留到最终处理。
再找三个FF2五 型的IAT调用看看
365bet手机客户端下载 35 
跟进去看下,上面是履行流程代码
00FB7DC7    90              nop
00FB七DC捌    0FB7D⑥          movzx edx,si        垃圾代码
00FB七DCB    6六:0FBED1       movsx dx,cl       垃圾代码
00FB7DCF    5A              pop edx                   出栈             
  
00FB7DD0    871424          xchg dword ptr ss:[esp],edx       
   调换栈顶的值,还原 EDX原始值
00FB七DD三    5二              push edx                            
 爱护环境
00FB7DD4    66:0FBED1       movsx dx,cl     垃圾
00FB7DD8    0FB7D6          movzx edx,si      垃圾
00FB7DDB    BA B77五七D00     mov edx,00七D7五B七     总括地址
010DFDAD    8B92 3D036900   mov edx,dword ptr ds:[edx+0x69033D]   
总计地址
0102B837    8D92 B52FE512   lea edx,dword ptr ds:[edx+0x12E52FB5] 
   总结地址
00EACB30    871424          xchg dword ptr ss:[esp],edx 
 函数实际地址给栈顶 并苏醒环境          
0115D36E    C2 0400         retn 0x4 
那几个FF二5 CALL 的第5行 有个POP  edx 而进那几个CALL在此以前  有二个push edx
,能够见到 这几个push edx 也是废品代码是 VMP自身加上上去的,看来VMP
会随机在内外 填充二个字节,在上头正是 PUSH 一个寄存器,在底下便是 retn
找一个 FF15型的CALL看看
365bet手机客户端下载 36 
跟进去看下流程
010B27B玖    BE B34E陆E0B     mov esi,0xB6E四EB三    垃圾代码
00EFFC5B    5E              pop esi               出栈
00EEB9B0    873424          xchg dword ptr ss:[esp],esi   
交流栈顶的值,还原 ESI原始值
00F肆37BB    56              push esi   保存环境
00F8D捌贰柒    BE 四B084800     mov esi,004808四B    总计地址
00FA55B3    8BB6 C005B900   mov esi,dword ptr
ds:[esi+0xB905C0]  计算地址
010E8053    8DB6 3F68AD31   lea esi,dword ptr ds:[esi+0x31AD683F]
总计地址
00F44191    873424          xchg dword ptr ss:[esp],esi 
 真实函数地址给栈顶,还原环境
0057A761    C3              retn 
其次行 pop esi  看来那个CALL 的push esi 是废品指令了,不过 发现那么些是retn 为何不是,retn 0四 呢?因为那个是 FF一伍 型调用,也便是 call
[????????]  须要进行完后回到到call 上面继续执行
再找2个FF1五型调用看看
365bet手机客户端下载 37 
跟进去看下流程
00E77D14    90              nop
00E7柒D一5    5一              push ecx            保存环境              
00E77D1陆    6六:F7D一         not cx           垃圾代码
00E77D19    8B4C24 04       mov ecx,dword ptr ss:[esp+0x4]   
栈顶+四(调用CALL的回来地址)给ECX,
00FB7CFF    8D49 01         lea ecx,dword ptr ds:[ecx+0x1]   取
重返地址+1的值 给ECX
01013FB5    894C24 04       mov dword ptr
ss:[esp+0x4],ecx  重新写入到重返处
010一3FB玖    B⑨ A159八A00     mov ecx,00八A59A壹 总括地址
010566B2    8B89 94C36C00   mov ecx,dword ptr ds:[ecx+0x6CC394]
计算地址
00E95200    8D89 19378077   lea ecx,dword ptr ds:[ecx+0x77803719]
计算地址
00FEA363    870C24          xchg dword ptr
ss:[esp],ecx  真实函数地址给栈顶,还原环境       
010ABADE    C3              retn
以此 有点不1致啊,很简短 看调用CALL 的底下有二个 RETN啊,那如果例行重临程序还不得跑飞啊,VMP巧妙的行使 肆 5 陆叁行代码
就解决了,那写壳的人便是脑洞大开啊!
享有的IAT加密就那样完了吗??? NO  还有更脑洞大开的 往下看
365bet手机客户端下载 38 
跟进去看看
0119D768    90              nop
0106B2C9    872C24          xchg dword ptr ss:[esp],ebp       
   调换栈顶的值,还原栈顶
00F3E二陆F    5五              push ebp                            
 保存再次回到地址
00F三E270    F七D5            not ebp                              
垃圾代码
00F叁E272    50              push eax                            
 保存环境
00F三E27叁    B八 D四壹D4300     mov eax,00431DD4  计算地址
00F三E27八    66:8BEB         mov bp,bx  垃圾代码
00F3E27B    8B80 41F7BE00   mov eax,dword ptr
ds:[eax+0xBEF741]  计算地址
00F三E2捌1    6陆:0F四FE八       cmovg bp,ax  垃圾代码
00F叁E28五    6陆:8BE八         mov bp,ax   垃圾代码
00F3E288    8D80 903F170C   lea eax,dword ptr
ds:[eax+0xC173F90]  计算地址
00F三E2八E    0FB7E八          movzx ebp,ax 垃圾代码
00F三E2九壹    8BE八            mov ebp,eax     真实函数地址给 EBP
00F3E293    58              pop eax   还原 寄存器
011B5D71    C3              retn
那是在干啥呢?? 咋把实事求是函数地址 给了 EBP呢? 看调用处的底下 有二个call ebp 掌握了吧 那是把   mov
xx,[????????]  整成了1个CALL哦,再来看下堆栈 调用处pop  EBP , CALL内
第二行
有把栈顶的值还原了,然后把函数的回来地址重新PUSH进去,那里处理的很巧妙,全体调用处的 pop ebp也是废品指令,那就完了???NO还有往下看
365bet手机客户端下载 39 
跟进去看下
00E97E5D    90              nop
00E97E伍E    0FBFDB          movsx ebx,bx  垃圾代码
0十C10八3    50              push eax                    保存环境     
010C1084    8B4424 04       mov eax,dword ptr ss:[esp+0x4]    
 获取当前CALL的归来地址给EAX
00E2EB3F    8D40 01         lea eax,dword ptr ds:[eax+0x1] 
 获取当前CALL重返地址+一给EAX
00E二EB42    0F4伍DB          cmovne ebx,ebx    垃圾代码
00E二EB四伍    6陆:0FB6DB       movzx bx,bl  垃圾代码
00E2EB49    894424 04       mov dword ptr
ss:[esp+0x4],eax  保存重返地址
00E2EB四D    B八 012C4300     mov eax,00432C0一 总计地址
00E二EB5二    6陆:0FBEDB       movsx bx,bl 垃圾代码
00E2EB5陆    6陆:八BDF         mov bx,di 垃圾代码
01170378    8B80 F58CC000   mov eax,dword ptr ds:[eax+0xC08CF5]
总计地址
01170三七E    0FB7DC          movzx ebx,sp 垃圾代码
011703八一    0F四壹DE          cmovno ebx,esi      垃圾代码
01170384    F六D7            not bh 垃圾代码
01170386    8D80 145A2C32   lea eax,dword ptr ds:[eax+0x322C5A14]
总括地址
011703捌C    B3 85           mov bl,0x8伍 垃圾代码
0117038E    八ADE            mov bl,dh 垃圾代码
01170390    八BD八            mov ebx,eax   真实函数地址给 EBX          
   
011703九2    0FBFC二          movsx eax,dx 垃圾代码
011703九伍    C陆C四 E二         mov ah,0xE二 垃圾代码
011703九八    0FC八            bswap eax             垃圾代码            
0117039A    5八              pop eax      还原环境                    
0117039B    C3              retn
信以为真看 了上边的有的,那里不难了然了吧, 4 5 八行处理调用处的 上面 retn
的,函数是获得 EBX的调用值的

MFC

注意,使用MFC和VC++编写的次第,使用PEiD查壳时,都会来得是Visual
C++六.0的编写翻译器,两者的界别方法是,使用OD载入程序,在E窗口中,MFC的先后会调用二个mfc4二.dll的动态链接库文件,而VC++的次序不会调用那些库。
365bet手机客户端下载 40
载入MFC程序,在E窗口中双击mfc4二.dll,跟进去,然后反汇编窗口中右键->查找->命令:
“sub
eax,0a”,找到之后,在特征码的上面会有2个je跳转,选中je命令行,然后按回车,程序会尾随到跳转处,来到指标地方,找上边包车型客车三个CALL,下断点:
365bet手机客户端下载 41
1旦je跳转之后,未有CALL,那就不用管那一个特征码,继续搜寻下三个特征码,知道找到全部的CALL停止。然后不慢运行程序,点击按钮之后,程序会在断点处截至,然后在上下文找关键CALL和首要跳即可。

脱壳方法:

 

转载:

VC++

选择PEiD查壳,查找的编写翻译器为VC++陆.0,假若找不到易语言和MFC的标志,那就足以判明是vc++写的次第,按钮事件查找方法,直接OD载入程序,在反汇编窗口右键->查找->全体命令,输入特征码:“sub
eax,0a”:
365bet手机客户端下载 42
双击跟进去,在底下会有一个je:
365bet手机客户端下载 43
当选之后,回车,跟过去,在下边的CALL下断点:
365bet手机客户端下载 44
根据地点的形式找到全部的CALL下断点。
然后F玖运维程序,点击按钮,程序来到断点处,F七跟进去,注意,进去现在还不是主导按键处理程序,按五回F8之后,才来到中央代码处:
365bet手机客户端下载 45

 

365bet手机客户端下载 46

咱俩拿《加密与解密》的RebPE.exe举栗子,die查VC++写的,来探望吧:

 

1、保存现场(pushad/popad,pushfd/popfd)>>2、获取壳自身索要的API地址>>三、解密原程序各种区块>>4、IAT的早先化>>5、重一贯>>6、Hook-API>>7、跳到 OEP

365bet手机客户端下载 47

脱壳方法七:sfx法,那办法正是太慢了

 

明白了入口大家就早先脱壳吧!

VS版本 链接器版本
VS2017 14.12
VS2015 14.0, 14.1
VS2013 12.0
VS2012 11.0
VS2010 10.0
VS2008 9.0
VS2005 8.0
VC2003 7.0, 7.1
VC6/VB6/E语言 6.0
VC5/BC++ 5.0
Delphi 2.25
VB5

4.20

 

 

Delphi:

【VB5】的OEP第一个API调用是GetStartupInfoA

1
2
3
4
5
6
7
8
9
10
00509CB0 > $  55            PUSH EBP
00509CB1   .  8BEC          MOV EBP,ESP
00509CB3   .  83C4 EC       ADD ESP,-14
00509CB6   .  53            PUSH EBX
00509CB7   .  56            PUSH ESI
00509CB8   .  57            PUSH EDI
00509CB9   .  33C0          XOR EAX,EAX
00509CBB   .  8945 EC       MOV DWORD PTR SS:[EBP-14],EAX
00509CBE   .  B8 20975000   MOV EAX,unpack.00509720
00509CC3   .  E8 84CCEFFF   CALL unpack.0040694C

 

脱壳方法8:一步到达法

发表评论

电子邮件地址不会被公开。 必填项已用*标注