【脱文作者】 巴黎人澳门官网:yeyu0808,首先我
分类:巴黎人-操作系统

  • 在深入分析/逆向 程序时,借使事先知道那类程序的片段表征,那将会是一箭双雕的;
  • 剖析/逆向 程序,和写程序差异,比喻的话:写程序像在违背法律,解析/逆向 程序如同在破案,对破案来说,重在假想和演绎;

转载:

Delphi & BC++

选择Detect it Easy工具明确软件应用的编写翻译器为Delphi或许是BC++,那多个编写翻译器的开关特征码一样。
巴黎人澳门官网 1
OD载入程序,反汇编窗口右键->查找->二进制字符串:
下一场在HEX窗口输入特征码,注意Delphi和BC++的特征码是一样的(“740E8BD38B83????????FF93????????”):
巴黎人澳门官网 2
瞩目勾选整个块。

特征码中的问号代表私自数据。
在特征码的上面都会传下叁个CALL,然后大家在每一个特征码的底下的CALL下断点:
巴黎人澳门官网 3
接下来CT本田CR-VL+L,在富有的特征码下边包车型客车CALL下断点。因为大家不知道是哪七个开关,所以供给在各样按键都下断点,假如程序不大,非常的慢,如若程序相当的大,按键事件很多,能够运用脚本来下断点。
断点下完之后,F9运转程序,然后点击关键的登记之类的开关,程序会停当前开关的CALL处,然后F7进CALL,就能够找关键CALL和重要性跳了。

率先大家先来讲说壳的法规吧,不难说下就好,带壳程序运维之后,都会做什么样事情啊? (想要了然越来越多的相恋的大家就去读看雪三弟的《加密与解密(第三版)》吧)

【脱文标题】 Obsidium V1.2 加壳的记事本脱壳

特色1:VC链接器版本

行事索要要脱三个VMP壳,笔者是二个向来没接触过脱壳的人。弹指间这种心思遇到的人相应都知道!不能硬着头皮找教程,7天看完了 《天草的壳的世界》尝试脱壳下边是自己的脱壳进度希望大腕多多指正!
1、绸缪工具,FEID(查壳工具)、DIE(查壳工具)、LordPE(dump工具)、ImpRec(IAT修复工具)、UIF(IAT修复工具)、CFF(文件优化工具)、OD(本身爱破解专版 调节和测验工具)
2、查壳 PEID
巴黎人澳门官网 4 
区段展现是vmp1,看来是VMP壳编写语言照旧不能够显著上DIE
巴黎人澳门官网 5 
来得编制程序语言是VC++的,VMP壳
3、开OD策动脱壳、OD设置如下
巴黎人澳门官网 6

VB

选拔一样的方法搜索VB的特征码(“816C24”):
巴黎人澳门官网 7
在各种jmp处下断点,然后运维程序,来到断点处,jmp跟过去现在正是开关事件的管理过程了。

1、保存现场(pushad/popad,pushfd/popfd)>>2、获取壳本人索要的API地址>>3、解密原程序各种区块>>4、IAT的开端化>>5、重平素>>6、Hook-API>>7、跳到 OEP

【脱文笔者】 yeyu0808

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++6.0的编写翻译器,两个的分别方法是,使用OD载入程序,在E窗口中,MFC的前后相继会调用二个mfc42.dll的动态链接库文件,而VC++的前后相继不会调用那些库。
巴黎人澳门官网 9
载入MFC程序,在E窗口中双击mfc42.dll,跟进去,然后反汇编窗口中右键->查找->命令:
“sub eax,0a”,找到之后,在特征码的上面会有二个je跳转,选中je命令行,然后按回车,程序会跟随到跳转处,来到目的地址,找下边包车型大巴壹个CALL,下断点:
巴黎人澳门官网 10
设若je跳转之后,未有CALL,那就无须管这么些特征码,继续找寻下多个特征码,知道找到全数的CALL结束。然后急忙启动程序,点击按键之后,程序会在断点处结束,然后在上下文找关键CALL和要害跳就能够。

 

【使用工具】 flyOD,Lordpe,PEID,ImportREC1.42

 

巴黎人澳门官网 11 
打开进度到进口看下
巴黎人澳门官网 12 
4、跑OEP
什么也卡不懂,然而没什么知道是VMP壳就好办,直接CTRL+G  输入 VirtualProtect 下断 如下图(假若提醒未知,先在内部存款和储蓄器窗口找到 kernel32.dll代码段 进去后在转到就到了)
巴黎人澳门官网 13 
F9跑起来,那是会段下
巴黎人澳门官网 14 
注意NewProtect 这项 等于 PAGE_READONLY 是终止,不然一向F9 按慢点别跑飞了
巴黎人澳门官网 15 
到0401000处看看,代码是还是不是已经解码
巴黎人澳门官网 16 
早就解码, 寻觅特征码 EB0B85F375078BC6C1E0100BF0
巴黎人澳门官网 17 
那是OEP第1个CALL的尾巴,依据她找到OEP 
巴黎人澳门官网 18 
OEP 正是 00a6f7c8,但是那才是率先步 那时候DUMP 是没用的 因为VMP加密了IAT 大家须要苏醒他
5、还原IAT
任凭找叁个IAT调用函数跟一下,刚好OEP底下就有八个 FF25 型的IAT 调用,跟进去看下
巴黎人澳门官网 19 
要么什么都看不懂,可是没什么 既然是调用IAT函数,确定会在某一随时调到真实函数地址去的 继续跟下边把全部跟的流水生产线贴上来
巴黎人澳门官网 20 
巴黎人澳门官网 21 
巴黎人澳门官网 22 
巴黎人澳门官网 23 
巴黎人澳门官网 24 
那是整整工艺流程的实际实施的代码 ,以后深入分析下
01059D91    53              push ebx                     爱慕情况
01059D92    66:0FB6DB       movzx bx,bl          垃圾代码
01059D96    66:BB 5D55      mov bx,0x555D   垃圾代码
01059D9A    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的原始值
00F9FC9D    C2 0400         retn 0x4                  还原EBX 并重返函数
这会儿看下货仓 栈顶出现真实函数的地点
<ignore_js_op>巴黎人澳门官网 25 
00F9FC9D    C2 0400         retn 0x4       深入分析下那条指令的推行流程,先EIP=栈顶的值 约等于一步一个足迹函数地址,栈顶+4+4 懂汇编的人就能够发觉,栈顶+8的职责保存是近日CALL的回来地址 那推行了那条指令后回到地址不是未曾了么?因为这么些IAT调用 没加密前是 FF25型的 也正是 jmp [????????] 所以无需再次来到地址 ,而调用这几个IAT的时候 是有叁个CALL的进CALL的时候就能够PUSH再次回到地址到库房,所以这么些IAT管理的很玄妙!实践完真实函数后一向就回来到调用IATCALL的上边继续实施了。
看图片开掘 这些CALL 上边有一条 RETN指令 看来那条 是VMP加上去的了,不过不要忽略了那条指令 因为那条指令很主要,VMP在获得IAT地址的最终RETN的地址 会随机JMP到代码他增多的RETN 上,并不完全部是在壳段 所以这几个RETN 要留到最后管理。
再找二个FF25 型的IAT调用看看
巴黎人澳门官网 26 
跟进去看下,上面是施行流程代码
00FB7DC7    90              nop
00FB7DC8    0FB7D6          movzx edx,si        垃圾代码
00FB7DCB    66:0FBED1       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 B7757D00     mov edx,007D75B7     计算地址
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 
以此FF25 CALL 的第四行 有个POP  edx 而进这一个CALL从前  有一个push edx ,能够看看 那么些push edx 也是垃圾堆代码是 VMP自身充裕上去的,看来VMP 会随机在上下 填充一个字节,在上边正是 PUSH 一个贮存器,在上面就是 retn
找一个 FF15型的CALL看看
巴黎人澳门官网 27 
跟进去看下流程
010B27B9    BE B34E6E0B     mov esi,0xB6E4EB3    垃圾代码
00EFFC5B    5E              pop esi               出栈
00EEB9B0    873424          xchg dword ptr ss:[esp],esi    交流栈顶的值,还原 ESI原始值
00F437BB    56              push esi   保存情状
00F8D827    BE 4B084800     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 04 呢?因为这些是 FF15 型调用,也正是 call [????????]  须要施行完后归来到call 上边继续实践
再找五个FF15型调用看看
巴黎人澳门官网 28 
跟进去看下流程
00E77D14    90              nop
00E77D15    51              push ecx            保存处境              
00E77D16    66: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  重新写入到重返处
01013FB9    B9 A1598A00     mov ecx,008A59A1 总括地址
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 5 6三行代码 就消除了,那写壳的人就是脑洞大开啊!
享有的IAT加密就这么完了啊??? NO  还或然有更脑洞大开的 往下看
巴黎人澳门官网 29 
跟进去看看
0119D768    90              nop
0106B2C9    872C24          xchg dword ptr ss:[esp],ebp           交流栈顶的值,还原栈顶
00F3E26F    55              push ebp                              保存重回地址
00F3E270    F7D5            not ebp                               垃圾代码
00F3E272    50              push eax                              保存碰着
00F3E273    B8 D41D4300     mov eax,00431DD4  计算地址
00F3E278    66:8BEB         mov bp,bx  垃圾代码
00F3E27B    8B80 41F7BE00   mov eax,dword ptr ds:[eax+0xBEF741]  计算地址
00F3E281    66:0F4FE8       cmovg bp,ax  垃圾代码
00F3E285    66:8BE8         mov bp,ax   垃圾代码
00F3E288    8D80 903F170C   lea eax,dword ptr ds:[eax+0xC173F90]  总括地址
00F3E28E    0FB7E8          movzx ebp,ax 垃圾代码
00F3E291    8BE8            mov ebp,eax     真实函数地址给 EBP
00F3E293    58              pop eax   还原 寄存器
011B5D71    C3              retn
那是在干啥啊?? 咋把实际函数地址 给了 EBP呢? 看调用处的上面 有四个call ebp 通晓了吧 那是把   mov xx,[????????]  整成了二个CALL哦,再来看下货仓 调用处pop  EBP , CALL内 第2行 有把栈顶的值还原了,然后把函数的回到地址重新PUSH进去,这里处理的很抢眼,全体调用处的 pop ebp也是污物指令,那就完了???NO还应该有往下看
巴黎人澳门官网 30 
跟进去看下
00E97E5D    90              nop
00E97E5E    0FBFDB          movsx ebx,bx  垃圾代码
010C1083    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重返地址+1给EAX
00E2EB42    0F45DB          cmovne ebx,ebx    垃圾代码
00E2EB45    66:0FB6DB       movzx bx,bl  垃圾代码
00E2EB49    894424 04       mov dword ptr ss:[esp+0x4],eax  保存再次回到地址
00E2EB4D    B8 012C4300     mov eax,00432C01 总括地址
00E2EB52    66:0FBEDB       movsx bx,bl 垃圾代码
00E2EB56    66:8BDF         mov bx,di 垃圾代码
01170378    8B80 F58CC000   mov eax,dword ptr ds:[eax+0xC08CF5] 总结地址
0117037E    0FB7DC          movzx ebx,sp 垃圾代码
01170381    0F41DE          cmovno ebx,esi      垃圾代码
01170384    F6D7            not bh 垃圾代码
01170386    8D80 145A2C32   lea eax,dword ptr ds:[eax+0x322C5A14] 总计地址
0117038C    B3 85           mov bl,0x85 垃圾代码
0117038E    8ADE            mov bl,dh 垃圾代码
01170390    8BD8            mov ebx,eax   真实函数地址给 EBX              
01170392    0FBFC2          movsx eax,dx 垃圾代码
01170395    C6C4 E2         mov ah,0xE2 垃圾代码
01170398    0FC8            bswap eax             垃圾代码            
0117039A    58              pop eax      还原意况                    
0117039B    C3              retn
相信是真的看 了地方的一些,这里简单领悟了啊, 4 5 8行管理调用处的 上边 retn 的,函数是收获 EBX的调用值的

易语言

瞩目,易语言编写的前后相继,使用PEiD查壳时,展现的编写翻译器也是Visual C++6.0,使用OD载入程序,直接在反汇编窗口中右键->查找->二进制字符串,输入易语言的特征码:“FF 25”,若是能够找到,就认证是易语言编写的程序。
易语言体:
巴黎人澳门官网 31
能够看到有一群的jmp指令,以上就会决断是易语言程序。

下一步查找易语言的按键事件:二进制字符串“FF 55 FC 5F 5E»ò(e-debug)”,找到之后,会到来CALL处,直接下断:
巴黎人澳门官网 32
检索剩下的,全数地点都下断点,然后F9运营程序起首调节和测验。

易语言程序仍可以够动用另一种艺术来索求开关事件,使用E-debug工具:
巴黎人澳门官网 33
应用OPEN载入易语言程序,然后点击START,运维程序,点击开关,博览会示事件产生的地点:
巴黎人澳门官网 34
记录事件爆发的地址,然后利用OD载入程序,追踪到这么些地点下断点:
Ctrl+G,输入要追随的表明式,输入刚才记录的地点,下断点:
巴黎人澳门官网 35
F9运转程序,触发断点事件,就可以断在这里。

率先大家先用DIE来查一下带壳程序是怎么样语言编写的,然后再用OD载入。

【破解平台】 WinXp

 

累计6种 IAT相关的拍卖,所以本人是 一边写脚本一边骂写 VMP壳的人,要不要如此坑啊,笔者要的脱的程序特别大 跑一次要 1个钟头,小编也不记得本人跑了多少遍了!哎!说来都以泪,菜鸟正是这么呀!相当少说了上面贴上脚本!要求的友好去下!

VC++

运用PEiD查壳,查找的编写翻译器为VC++6.0,假如找不到易语言和MFC的评释,那就足以看清是vc++写的程序,按键事件查找方法,直接OD载入程序,在反汇编窗口右键->查找->全部命令,输入特征码:“sub eax,0a”:
巴黎人澳门官网 36
双击跟进去,在上边会有叁个je:
巴黎人澳门官网 37
入选之后,回车,跟过去,在底下的CALL下断点:
巴黎人澳门官网 38
依照地方的秘籍找到全体的CALL下断点。
然后F9运营程序,点击开关,程序来到断点处,F7跟进去,注意,进去之后还不是主导按钮管理程序,按一回F8之后,才来到宗旨代码处:
巴黎人澳门官网 39

在脱壳在此之前呢,大家必然要知道次第语言的OEP特征是哪些,免获得时候尽管到了OEP,自个儿都不知底,那可就正剧了,这里列出各种语言的OEP(请忽略地址):

【软件名称】 notepad
     
【加壳方式】 Obsidium V1.2

 

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

万能断点

无需驾驭程序采用的编写翻译器和编写翻译语言,直接OD载入程序,直接运转程序,输入假码之后,不要点击按键:
巴黎人澳门官网 40
查看user32模块:
巴黎人澳门官网 41
来到user32模块然后,寻觅特征码,右键->查找->二进制字符串:“F3A58BC883E103F3ATENZAE8”
巴黎人澳门官网 42
然后下断点,找到全体的都要下断点。然后重回程序,点击按键,程序暂停,重回OD,alt+F9,实行到客户代码:
巴黎人澳门官网 43
接下来就到了开关事件管理的代码了。

 

【脱壳目标】 笔者是一头大菜鸟,只是为着学习才能而脱壳~!

 

VC++:

【脱壳内容】 Obs1.2版的壳也出来这么久了,一贯没人愿意放出脱壳方法,笔者在此处献丑了。此次OBS的

 

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

进级没有啥样太大的成形,加壳的次序跟1.1版的脱壳方法平常,照旧第4次除零老大后管理IAT,连代码

 

VB:

都尚未太大的变通,找OEP跟1.1版基本上是如出一辙,只是在IAT加密的时候,检查实验内部存款和储蓄器访问断点,断不

 

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

到1.1版直接加密IAT的地点,这就为找特殊函数设了少数阻碍,靠你本身去研商了~!

 

BC++:

用Obsidium V1.2版加壳的记事本,难度就大减少了,作者是新手,太难的搞不定,只可以脱个记事本~!

本文由巴黎人手机版发布于巴黎人-操作系统,转载请注明出处:【脱文作者】 巴黎人澳门官网:yeyu0808,首先我

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文