菜单

澳门金沙国际[转] 菜鸟手脱VMP,附上脱壳进程和调谐写的本子,可跨平台

2019年4月14日 - www6165com

转载:

Delphi & BC++

动用Detect it
Easy工具分明软件应用的编译器为Delphi或许是BC++,那四个编写翻译器的按钮特征码相同。
澳门金沙国际 1
OD载入程序,反汇编窗口右键->查找->贰进制字符串:
下一场在HEX窗口输入特征码,注意Delphi和BC++的特征码是壹律的(“740E八BD38B八三????????FF玖三????????”):
澳门金沙国际 2
小心勾选整个块。

特征码中的问号代表私自数据。
在特征码的下边都会传下二个CALL,然后大家在每种特征码的上边的CALL下断点:
澳门金沙国际 3
下一场CTLANDL+L,在有着的特征码下边包车型大巴CALL下断点。因为大家不知道是哪3个按钮,所以须要在各样按钮都下断点,要是程序相比较小,非常快,要是程序相比较大,按钮事件相比较多,能够利用脚本来下断点。
断点下完之后,F九运转程序,然后点击关键的注册之类的按钮,程序会停当前按钮的CALL处,然后F7进CALL,就足以找关键CALL和严重性跳了。

第二我们先来说说壳的原理吧,简单说下就好,带壳程序运转之后,都会做怎么着工作吗?
(想要精通更加多的对象们就去读看雪哥哥的《加密与解密(第1版)》吧)

特点一:VC链接器版本

干活亟待要脱二个VMP壳,小编是3个一向没接触过脱壳的人。眨眼之间间那种心绪碰着的人应该都晓得!不能硬着头皮找教程,柒天看完了
《天草的壳的世界》尝试脱壳下边是自身的脱壳进程希望大咖多多指正!
一、准备工具,FEID(查壳工具)、DIE(查壳工具)、LordPE(dump工具)、ImpRec(IAT修复工具)、UIF(IAT修复工具)、CFF(文件优化学工业具)、OD(咱爱破解专版
调试工具)
2、查壳 PEID
澳门金沙国际 4 
区段呈现是vmp1,看来是VMP壳编写语言依旧不可能确定上DIE
澳门金沙国际 5 
来得编制程序语言是VC++的,VMP壳
叁、开OD准备脱壳、OD设置如下
澳门金沙国际 6

VB

运用相同的艺术寻找VB的特征码(“81陆C二四”):
澳门金沙国际 7
在每一种jmp处下断点,然后运营程序,来到断点处,jmp跟过去之后正是按钮事件的处理进程了。

壹、保存现场(pushad/popad,pushfd/popfd)>>②、获取壳本人索要的API地址>>三、解密原程序各样区块>>肆、IAT的初叶化>>五、重一向>>6、Hook-API>>7、跳到 OEP

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

 澳门金沙国际 8

MFC

专注,使用MFC和VC++编写的次第,使用PEiD查壳时,都会议及展览示是Visual
C++陆.0的编写翻译器,两者的区分方法是,使用OD载入程序,在E窗口中,MFC的顺序会调用三个mfc4二.dll的动态链接库文件,而VC++的先后不会调用那些库。
澳门金沙国际 9
载入MFC程序,在E窗口中双击mfc4二.dll,跟进去,然后反汇编窗口中右键->查找->命令:
“sub
eax,0a”,找到之后,在特征码的底下会有贰个je跳转,选中je命令行,然后按回车,程序会尾随到跳转处,来到指标地方,找上边包车型大巴一个CALL,下断点:
澳门金沙国际 10
假定je跳转之后,未有CALL,那就毫无管那几个特征码,继续搜寻下1个特征码,知道找到全体的CALL结束。然后十分的快运维程序,点击按钮之后,程序会在断点处结束,然后在上下文找关键CALL和根本跳即可。

 

 

澳门金沙国际 11 
开辟进度到进口看下
澳门金沙国际 12 
4、跑OEP
啥也卡不懂,可是没什么知道是VMP壳就好办,直接CT普拉多L+G  输入 VirtualProtect
下断 如下图(如果提醒未知,先在内部存款和储蓄器窗口找到 kernel32.dll代码段
进去后在转到就到了)
澳门金沙国际 13 
F九跑起来,这是会段下
澳门金沙国际 14 
注意NewProtect 这项 等于 PAGE_READONLY 是终止,不然平素F玖按慢点别跑飞了
澳门金沙国际 15 
到0401000处看看,代码是或不是曾经解码
澳门金沙国际 16 
早已解码, 搜索特征码 EB0B捌五F37507八BC6C一E0十0BF0
澳门金沙国际 17 
那是OEP第2个CALL的尾巴部分,依据他找到OEP 
澳门金沙国际 18 
OEP 正是 00a六f7c8,不过那才是第3步 那时候DUMP 是没用的 因为VMP加密了IAT
我们须要还原他
5、还原IAT
无论找多个IAT调用函数跟一下,刚好OEP上边就有八个 FF25 型的IAT
调用,跟进去看下
澳门金沙国际 19 
抑或啥都看不懂,然而没什么
既然是调用IAT函数,肯定会在某目前时调到真实函数地址去的
继续跟上边把全体跟的流水生产线贴上来
澳门金沙国际 20 
澳门金沙国际 21 
澳门金沙国际 22 
澳门金沙国际 23 
澳门金沙国际 24 
那是全方位工艺流程的实际上履行的代码 ,今后分析下
0105玖D九一    5叁              push ebx                     爱惜环境
0105玖D9贰    66:0FB六DB       movzx bx,bl          垃圾代码
01059D玖六    6陆:BB 伍D5伍      mov bx,0x555D   垃圾代码
0十59D9A    BB 5AC27200     mov ebx,0072C25A 
 那才是最终对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>澳门金沙国际 25 
00F玖FC九D    C二 0400         retn 0x四      
分析下那条指令的实施流程,先EIP=栈顶的值 也正是真实函数地址,栈顶+4+四懂汇编的人就会发觉,栈顶+八的职分保存是最近CALL的回来地址
那执行了那条指令后回到地址不是未曾了么?因为那一个IAT调用 没加密前是
FF25型的 也正是 jmp [????????] 所以不须求回到地址
,而调用那个IAT的时候
是有八个CALL的进CALL的时候就会PUSH重返地址到库房,所以那些IAT处理的很抢眼!执行完真实函数后直接就回去到调用IATCALL的上边继续执行了。
看图片发现 那几个CALL 下边有一条 RETN指令 看来那条
是VMP加上去的了,但是不用忽视了那条指令 因为那条指令很要紧,VMP在收获
IAT地址的尾声RETN的地方 会随机JMP到代码他丰盛的RETN 上,并不完全是在壳段
所以那么些RETN 要留到最终处理。
再找三个FF贰伍 型的IAT调用看看
澳门金沙国际 26 
跟进去看下,下边是推行流程代码
00FB7DC7    90              nop
00FB七DC捌    0FB七D六          movzx edx,si        垃圾代码
00FB七DCB    6陆:0FBED壹       movsx dx,cl       垃圾代码
00FB7DCF    5A              pop edx                   出栈             
  
00FB7DD0    871424          xchg dword ptr ss:[esp],edx       
   沟通栈顶的值,还原 EDX原始值
00FB7DD3    52              push edx                            
 爱慕环境
00FB7DD4    66:0FBED1       movsx dx,cl     垃圾
00FB7DD8    0FB7D6          movzx edx,si      垃圾
00FB7DDB    BA B77伍七D00     mov edx,00七D7伍B7     总计地址
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二伍 CALL 的第5行 有个POP  edx 而进这些CALL在此之前  有1个push edx
,能够观望 那么些push edx 也是废品代码是 VMP自身足够上去的,看来VMP
会随机在上下 填充二个字节,在地方正是 PUSH 三个寄存器,在上边正是 retn
找一个 FF15型的CALL看看
澳门金沙国际 27 
跟进去看下流程
010B贰柒B九    BE B3四E陆E0B     mov esi,0xB陆E4EB三    垃圾代码
00EFFC5B    5E              pop esi               出栈
00EEB9B0    873424          xchg dword ptr ss:[esp],esi   
交流栈顶的值,还原 ESI原始值
00F437BB    5六              push esi   保存环境
00F8D八二柒    BE 四B084800     mov esi,0048084B    总括地址
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 上边继续执行
再找贰个FF一伍型调用看看
澳门金沙国际 28 
跟进去看下流程
00E77D14    90              nop
00E7七D一5    51              push ecx            保存环境              
00E77D1陆    6陆:F7D1         not cx           垃圾代码
00E77D19    8B4C24 04       mov ecx,dword ptr ss:[esp+0x4]   
栈顶+4(调用CALL的回来地址)给ECX,
00FB7CFF    8D49 01         lea ecx,dword ptr ds:[ecx+0x1]   取
重回地址+1的值 给ECX
01013FB5    894C24 04       mov dword ptr
ss:[esp+0x4],ecx  重新写入到再次回到处
0拾一三FB玖    B玖 A159八A00     mov ecx,00八A59A1 总括地址
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
本条 有点不均等啊,很粗大略 看调用CALL 的下边有一个 RETN啊,那固然健康再次回到程序还不行跑飞啊,VMP巧妙的利用 4 伍 陆三行代码
就化解了,这写壳的人当成脑洞大开啊!
享有的IAT加密就这么完了啊??? NO  还有更脑洞大开的 往下看
澳门金沙国际 29 
跟进去看看
0119D768    90              nop
0106B2C9    872C24          xchg dword ptr ss:[esp],ebp       
   沟通栈顶的值,还原栈顶
00F三E二陆F    5伍              push ebp                            
 保存重临地址
00F3E270    F柒D伍            not ebp                              
垃圾代码
00F三E272    50              push eax                            
 保存环境
00F3E27叁    B八 D4一D4300     mov eax,0043一DD四  计算地址
00F三E278    6陆:八BEB         mov bp,bx  垃圾代码
00F3E27B    8B80 41F7BE00   mov eax,dword ptr
ds:[eax+0xBEF741]  总结地址
00F3E2八1    6六:0F四FE八       cmovg bp,ax  垃圾代码
00F三E2八伍    6陆:八BE8         mov bp,ax   垃圾代码
00F3E288    8D80 903F170C   lea eax,dword ptr
ds:[eax+0xC173F90]  计算地址
00F三E2八E    0FB七E8          movzx ebp,ax 垃圾代码
00F叁E2玖1    8BE八            mov ebp,eax     真实函数地址给 EBP
00F3E293    58              pop eax   还原 寄存器
011B5D71    C3              retn
那是在干啥啊?? 咋把真正函数地址 给了 EBP呢? 看调用处的上面 有二个call ebp 通晓了吧 那是把   mov
xx,[????????]  整成了四个CALL哦,再来看下堆栈 调用处pop  EBP , CALL内
第3行
有把栈顶的值还原了,然后把函数的回到地址重新PUSH进去,这里处理的很抢眼,全数调用处的 pop ebp也是污物指令,那就完了???NO还有往下看
澳门金沙国际 30 
跟进去看下
00E97E5D    90              nop
00E玖柒E5E    0FBFDB          movsx ebx,bx  垃圾代码
0拾C拾捌叁    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    0F四5DB          cmovne ebx,ebx    垃圾代码
00E贰EB肆伍    6陆:0FB陆DB       movzx bx,bl  垃圾代码
00E2EB49    894424 04       mov dword ptr
ss:[esp+0x4],eax  保存重返地址
00E2EB四D    B八 012C4300     mov eax,00432C01 总结地址
00E二EB5②    6陆:0FBEDB       movsx bx,bl 垃圾代码
00E2EB56    6陆:八BDF         mov bx,di 垃圾代码
01170378    8B80 F58CC000   mov eax,dword ptr ds:[eax+0xC08CF5]
总结地址
01170三七E    0FB七DC          movzx ebx,sp 垃圾代码
011703八一    0F四一DE          cmovno ebx,esi      垃圾代码
011703八四    F陆D7            not bh 垃圾代码
01170386    8D80 145A2C32   lea eax,dword ptr ds:[eax+0x322C5A14]
计算地址
011703八C    B三 85           mov bl,0x85 垃圾代码
011703八E    捌ADE            mov bl,dh 垃圾代码
01170390    8BD八            mov ebx,eax   真实函数地址给 EBX          
   
011703玖二    0FBFC2          movsx eax,dx 垃圾代码
011703九伍    C6C四 E二         mov ah,0xE2 垃圾代码
011703玖八    0FC八            bswap eax             垃圾代码            
0117039A    5捌              pop eax      还原环境                    
0117039B    C3              retn
当真看 了地方的一些,那里简单掌握了吗, 四 5 8行处理调用处的 下边 retn
的,函数是收获 EBX的调用值的

易语言

专注,易语言编写的先后,使用PEiD查壳时,显示的编写翻译器也是Visual
C++陆.0,使用OD载入程序,直接在反汇编窗口中右键->查找->二进制字符串,输入易语言的特征码:“FF
二五”,要是能够找到,就证实是易语言编写的顺序。
易语言体:
澳门金沙国际 31
可以见到有一批的jmp指令,以上就能断定是易语言程序。

下一步查找易语言的按钮事件:2进制字符串“FF 5五 FC 伍F
5E»ò(e-debug)”,找到之后,会来到CALL处,直接下断:
澳门金沙国际 32
摸索剩下的,全体地点都下断点,然后F玖运维程序初阶调剂。

易语言程序还足以选择另1种格局来搜寻按钮事件,使用E-debug工具:
澳门金沙国际 33
选择OPEN载入易语言程序,然后点击START,运营程序,点击按钮,会展现事件产生的地址:
澳门金沙国际 34
笔录事件发生的地址,然后接纳OD载入程序,跟踪到这些地方下断点:
Ctrl+G,输入要追随的表达式,输入刚才记录的地方,下断点:
澳门金沙国际 35
F九运维程序,触发断点事件,即可断在此间。

率先我们先用DIE来查一下带壳程序是何等语言编写的,然后再用OD载入。

 

累计陆种 IAT相关的拍卖,所以自身是 一边写脚本1边骂写
VMP壳的人,要不要如此坑啊,笔者要的脱的顺序更大 跑2遍要
二个钟头,小编也不记得自身跑了多少遍了!哎!说来都以泪,新手便是这么呀!不多说了下边贴上脚本!必要的亲善去下!

VC++

运用PEiD查壳,查找的编写翻译器为VC++6.0,借使找不到易语言和MFC的注脚,那就能够断定是vc++写的程序,按钮事件查找方法,间接OD载入程序,在反汇编窗口右键->查找->全部命令,输入特征码:“sub
eax,0a”:
澳门金沙国际 36
双击跟进去,在底下会有二个je:
澳门金沙国际 37
入选之后,回车,跟过去,在底下的CALL下断点:
澳门金沙国际 38
依据地点的主意找到全部的CALL下断点。
接下来F9运转程序,点击按钮,程序来到断点处,F七跟进去,注意,进去以后还不是中央按键处理程序,按五次F八之后,才赶到主题代码处:
澳门金沙国际 39

在脱壳在此之前呢,我们一定要理解依次语言的OEP特色是何等,免获得时候就算到了OEP,自个儿都不明了,那可就悲剧了,那里列出各种语言的OEP(请忽略地址):

 

6、用UIf 修复IAT 
7、用lodepe dump
8、用imprec 修复IAT
九、用cff 去掉壳段
至此VMP脱壳完毕!

万能断点

不供给精晓程序行使的编写翻译器和编写翻译语言,直接OD载入程序,直接运维程序,输入假码之后,不要点击按钮:
澳门金沙国际 40
查看user32模块:
澳门金沙国际 41
到来user32模块然后,搜索特征码,右键->查找->二进制字符串:“F三A58BC8八三E十三F三飞度E8”
澳门金沙国际 42
然后下断点,找到全数的都要下断点。然后再次来到程序,点击按钮,程序暂停,再次回到OD,alt+F九,执行到用户代码:
澳门金沙国际 43
下一场就到了按键事件处理的代码了。

 

 

VC++:

 

1
2
3
4
5
6
7
8
9
00496EB8 >/$  55            PUSH EBP                        
00496EB9  |.  8BEC          MOV EBP,ESP
00496EBB  |.  6A FF         PUSH -1
00496EBD  |.  68 40375600   PUSH Screensh.00563740
00496EC2  |.  68 8CC74900   PUSH Screensh.0049C78C              
00496EC7  |.  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
00496ECD  |.  50            PUSH EAX
00496ECE  |.  64:8925 00000>MOV DWORD PTR FS:[0],ESP
00496ED5  |.  83EC 58       SUB ESP,58

 

VB:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
00401166  - FF25 6C104000   JMP DWORD PTR DS:[<&MSVBVM60.#100>]      ; MSVBVM60.ThunRTMain
0040116C >  68 147C4000     PUSH PACKME.00407C14                     ;这是第一种入口格式
00401171    E8 F0FFFFFF     CALL <JMP.&MSVBVM60.#100>
00401176    0000            ADD BYTE PTR DS:[EAX],AL
00401178    0000            ADD BYTE PTR DS:[EAX],AL
0040117A    0000            ADD BYTE PTR DS:[EAX],AL
0040117C    3000            XOR BYTE PTR DS:[EAX],AL
 
00401FBC >  68 D0D44000        push dumped_.0040D4D0
00401FC1    E8 EEFFFFFF        call <jmp.&msvbvm60.ThunRTMain>        ;这是第二种入口格式
00401FC6    0000               add byte ptr ds:[eax],al
00401FC8    0000               add byte ptr ds:[eax],al
00401FCA    0000               add byte ptr ds:[eax],al
00401FCC    3000               xor byte ptr ds:[eax],al
00401FCE    0000               add byte ptr ds:[eax],al

 

BC++:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
0040163C > $ /EB 10         JMP SHORT BCLOCK.0040164E
0040163E     |66            DB 66                                    ;  CHAR 'f'
0040163F     |62            DB 62                                    ;  CHAR 'b'
00401640     |3A            DB 3A                                    ;  CHAR ':'
00401641     |43            DB 43                                    ;  CHAR 'C'
00401642     |2B            DB 2B                                    ;  CHAR '+'
00401643     |2B            DB 2B                                    ;  CHAR '+'
00401644     |48            DB 48                                    ;  CHAR 'H'
00401645     |4F            DB 4F                                    ;  CHAR 'O'
00401646     |4F            DB 4F                                    ;  CHAR 'O'
00401647     |4B            DB 4B                                    ;  CHAR 'K'
00401648     |90            NOP
00401649     |E9            DB E9
0040164A   . |98E04E00      DD OFFSET BCLOCK.___CPPdebugHook
0040164E   > \A1 8BE04E00   MOV EAX,DWORD PTR DS:[4EE08B]
00401653   .  C1E0 02       SHL EAX,2
00401656   .  A3 8FE04E00   MOV DWORD PTR DS:[4EE08F],EAX
0040165B   .  52            PUSH EDX
0040165C   .  6A 00         PUSH 0                                   ; /pModule = NULL
0040165E   .  E8 DFBC0E00   CALL <JMP.&KERNEL32.GetModuleHandleA>    ; \GetModuleHandleA
00401663   .  8BD0          MOV EDX,EAX

 

Delphi:

 

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

相关文章

发表评论

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

网站地图xml地图