樊盟 发表于 2010-1-7 16:36:58

Image To PDF v2.6.0 2005 脱壳+修复+算法分析

到OEP:

这里只介绍Aspack壳到OEP的三种方法:

ASPack 2.12 -> Alexey Solodovnikov

第一种方法:

00537001 >60            pushad                                 ; //壳的入口点!F8单步!
00537002    E8 03000000   call    0053700A                         ; //在这里F8单步程序会运行起来(俗称:跑飞),所以我们F7跟进CALL!
00537007- E9 EB045D45   jmp   45B074F7
0053700C    55            push    ebp
0053700D    C3            retn
0053700E    E8 01000000   call    00537014                         ; //在这里F8单步程序会运行起来(俗称:跑飞),所以我们F7跟进CALL!
-----------------------------------------------------------------------------------------
00537140^\EB EB         jmp   short 0053712D                   ; //不能让它往回跳!
00537142    8B06            mov   eax, dword ptr              ; //在这里断点→运行到选定位置(F4)
00537144    EB 00         jmp   short 00537146
00537146    803E 1F         cmp   byte ptr , 1F
00537149^ 75 F3         jnz   short 0053713E                   ; //对于跳转没有实现的我们不必理会!
0053714B    24 00         and   al, 0                            ; //跳转实现与否可以看箭头是什么颜色的(红色:实现,灰色:未实现)
0053714D    C1C0 18         rol   eax, 18                        ; //也可以看信息窗口的提示!
-----------------------------------------------------------------------------------------

这种方法称为“单步法”,初学不要嫌麻烦,慢慢来,基础要扎实进步才快!

═════════════════════════════════════════════

第二种方法:

00537001 >60            pushad                                 ; //壳的入口点!
00537002    E8 03000000   call    0053700A
00537007- E9 EB045D45   jmp   45B074F7
0053700C    55            push    ebp
0053700D    C3            retn

Ctrl+S:popad
然后Ctrl+L查找下一处,直到:

005373A9    8985 A8030000   mov   dword ptr , eax         ; //下面这就是Aspack壳的出口点的标志!
005373AF    61            popad                                    ; //壳的出口点!Ctrl+L三次之后来到这里!
005373B0    75 08         jnz   short 005373BA                   ; //这个跳转实现
005373B2    B8 01000000   mov   eax, 1
005373B7    C2 0C00         retn    0C
005373BA    68 00000000   push    0
005373BF    C3            retn                                     ; //在这里F2下断,然后F9运行到这里,再F8就会跳向程序OEP!

由于Aspack壳比较简单,因为壳有入口点(pushad)和出口点(popad),利用壳的这个特点我们可以直接查找popad来找到壳的出口点,然后最后的retn就是返回到程序入口点(OEP)的,这种方法叫“一步到位法”,只适用于特别简单的压缩壳!

═════════════════════════════════════════════

第三种方法:ESP定律法(堆栈平衡原理),在此感谢fly大侠!

F8运行一步,寄存器ESP变红,在ESP上面点击右键,数据窗口中跟随,在第一行上面点击右键,断点,硬件访问,word,然后F9运行,断下来后取消硬件访问断点,F8单步到OEP;
快速方法:F8,在命令行下hr esp断点,回车,F9运行,断下来后取消硬件访问断点,F8单步到OEP;

Borland C++ 1999

脱壳后程序能正常运行的话就说明脱壳成功了!

下一个教程主讲脱壳修复,现在我们的目标是到达程序OEP就行了!

三种方法演示完了,会了吗?

由于附件太大,上传到千脑了,
本部分动画教程下载:
http://down.qiannao.com/space/file/yates426/share/2010/01/07/-4e09-79cd-65b9-6cd5-5230OEP.rar/.page
-------------------------------------------------------------------------------------------------------

====脱壳+修复====

手动查找IAT:

具体看操作,我就不多打字了,

004014A0   /EB 10         jmp   short 004014B2                   ; 程序OEP!
004014A2   |66:623A         bound   di, dword ptr
004014A5   |43            inc   ebx
004014A6   |2B2B            sub   ebp, dword ptr
004014A8   |48            dec   eax
004014A9   |4F            dec   edi
004014AA   |4F            dec   edi
004014AB   |4B            dec   ebx
004014AC   |90            nop
004014AD-|E9 98904D00   jmp   008DA54A
004014B2   \A1 8B904D00   mov   eax, dword ptr
004014B7    C1E0 02         shl   eax, 2
004014BA    A3 8F904D00   mov   dword ptr , eax
004014BF    52            push    edx
004014C0    6A 00         push    0                              ; F7跟进下面的CALL
004014C2    E8 4D620D00   call    004D7714                         ; jmp 到 kernel32.GetModuleHandleA

头:004EE3087C809BE7kernel32.CloseHandle
尾:004EEFF8770F4950oleaut32.VariantInit

OEP= 004014A0-00400000=14A0
RVA= 004EE308-00400000=EE308
Size=004EEFF8-004EE308=CF0

注意:这里的减法用十六进制!!!

Borland C++ 1999

脱壳后程序正常运行,脱壳成功!

本部分动画教程下载:
http://down.qiannao.com/space/file/yates426/share/2010/01/07/-8131-58f3-0020-4fee-590d.rar/.page
-------------------------------------------------------------------------------------------------------
Image To PDF v2.6.0 2005算法分析

下载地址:http://www.skycn.com/soft/14828.html

这个软件下载的时候,天空上面写的是Image To PDF V3.0 版本的,分析完以后才发现是2.6版本的,⊙﹏⊙b汗!

试炼信息:

用户名:[email protected]
注册码:1234567890abcdef

点击OK弹出错误提示框:Series number error,please check it and try again.

下消息框断点:bp MessageBoxA,断下来后,Alt+F9返回到关键位置,然后找到段首下断点开始分析:

经分析调整假注册信息:
ABCDEFGHIJKLMNOP
再次调整:
ABCDEFGHIBKLMNYP

42H=B
59H=Y
B+Y=9B
==================================================================================================
0040DC9A|.E8 89530600   call    00473028
0040DC9F|.66:C747 10 08>mov   word ptr , 8
0040DCA5|.837D FC 00    cmp   dword ptr , 0             ;//用户名与0比较
0040DCA9|.8D4D B4       lea   ecx, dword ptr
0040DCAC|.74 05         je      short 0040DCB3                   ;//相等则跳
0040DCAE|.8B55 FC       mov   edx, dword ptr
0040DCB1|.EB 03         jmp   short 0040DCB6
0040DCB3|>8D56 1C       lea   edx, dword ptr
0040DCB6|>8BC3          mov   eax, ebx
0040DCB8|.E8 DF030000   call    0040E09C
0040DCBD|.837D F8 00    cmp   dword ptr , 0             ;//假注册码与0比较
0040DCC1|.74 05         je      short 0040DCC8                   ;//相等则跳
0040DCC3|.8B55 F8       mov   edx, dword ptr
0040DCC6|.EB 03         jmp   short 0040DCCB
0040DCC8|>8D56 1D       lea   edx, dword ptr
0040DCCB|>8BC3          mov   eax, ebx
0040DCCD|.E8 AA060000   call    0040E37C                         ;//关键CALL
0040DCD2|.84C0          test    al, al
0040DCD4|.0F85 97000000 jnz   0040DD71                         ;//关键跳转,F7跟进分析
0040DCDA|.6A 10         push    10
0040DCDC|.837D F8 00    cmp   dword ptr , 0
0040DCE0|.74 05         je      short 0040DCE7
0040DCE2|.8B4D F8       mov   ecx, dword ptr
0040DCE5|.EB 03         jmp   short 0040DCEA
0040DCE7|>8D4E 1E       lea   ecx, dword ptr
0040DCEA|>51            push    ecx
0040DCEB|.8D45 B4       lea   eax, dword ptr           ;//注册码以明码出现!
0040DCEE|.50            push    eax
0040DCEF|.E8 BCDA0B00   call    004CB7B0                         ;//关键CALL
0040DCF4|.83C4 0C       add   esp, 0C
0040DCF7|.85C0          test    eax, eax
0040DCF9|.74 76         je      short 0040DD71                   ;//关键跳转
0040DCFB|.66:C747 10 2C>mov   word ptr , 2C
0040DD01|.8D56 1F       lea   edx, dword ptr
0040DD04|.8D45 F4       lea   eax, dword ptr
0040DD07|.E8 D88E0C00   call    004D6BE4
0040DD0C|.FF47 1C       inc   dword ptr
0040DD0F|.8B10          mov   edx, dword ptr
0040DD11|.8B83 14050000 mov   eax, dword ptr
0040DD17|.E8 3C530600   call    00473058
0040DD1C|.FF4F 1C       dec   dword ptr
0040DD1F|.8D45 F4       lea   eax, dword ptr
0040DD22|.BA 02000000   mov   edx, 2
0040DD27|.E8 18900C00   call    004D6D44
0040DD2C|.6A 10         push    10
0040DD2E|.8D4E 60       lea   ecx, dword ptr
0040DD31|.51            push    ecx
0040DD32|.8D46 2D       lea   eax, dword ptr
0040DD35|.50            push    eax
0040DD36|.8BC3          mov   eax, ebx
0040DD38|.E8 FFB90600   call    0047973C                         ;//下面的CALL调用错误提示框
0040DD3D|.50            push    eax                              ; |hOwner
0040DD3E|.E8 8DA10C00   call    <jmp.&user32.MessageBoxA>      ; \MessageBoxA
0040DD43|.FF4F 1C       dec   dword ptr                ;//返回到这里!
==================================================================================================
跟进第一个关键CALL来到这里:

0040E37C/$56            push    esi
0040E37D|.8BF2          mov   esi, edx                         ;//EDX=ESI
0040E37F|.85F6          test    esi, esi                         ;//比较ESI
0040E381|.75 04         jnz   short 0040E387                   ;//相等则跳
0040E383|.33C0          xor   eax, eax
0040E385|.5E            pop   esi
0040E386|.C3            retn
0040E387|>803E 00       cmp   byte ptr , 0                ;//假码第一位与0比较
0040E38A|.75 04         jnz   short 0040E390                   ;//不等则跳
0040E38C|.33C0          xor   eax, eax
0040E38E|.5E            pop   esi
0040E38F|.C3            retn
0040E390|>56            push    esi
0040E391|.E8 12D20B00   call    004CB5A8
0040E396|.59            pop   ecx                              ;//假码位数放入EAX
0040E397|.83F8 10       cmp   eax, 10                        ;//比较注册码是不是10H(16位)
0040E39A|.74 04         je      short 0040E3A0                   ;//相等则跳
0040E39C|.33C0          xor   eax, eax
0040E39E|.5E            pop   esi
0040E39F|.C3            retn
0040E3A0|>33D2          xor   edx, edx                         ;//EDX清零
0040E3A2|.8BC6          mov   eax, esi                         ;//ESI=EAX
0040E3A4|>0FBE08      /movsx   ecx, byte ptr              ;//逐位取假码转换成ASCII值放入ECX
0040E3A7|.83F9 41       |cmp   ecx, 41                         ;//ECX与41H(A)则跳转
0040E3AA|.7C 05         |jl      short 0040E3B1
0040E3AC|.83F9 5A       |cmp   ecx, 5A                         ;//ECX与5AH(Z)则跳转
0040E3AF|.7E 04         |jle   short 0040E3B5
0040E3B1|>33C0          |xor   eax, eax                        ;//EAX清零
0040E3B3|.5E            |pop   esi
0040E3B4|.C3            |retn
0040E3B5|>42            |inc   edx                           ;//EDX+1
0040E3B6|.40            |inc   eax                           ;//逐位验证假码
0040E3B7|.83FA 10       |cmp   edx, 10                         ;//EDX与10H比较
0040E3BA|.^ 7C E8         \jl      short 0040E3A4
0040E3BC|.0FBE56 09   movsx   edx, byte ptr             ;//注册码第10位=EDX
0040E3C0|.0FBE4E 0E   movsx   ecx, byte ptr             ;//注册码第15位=ECX
0040E3C4|.03D1          add   edx, ecx                         ;//ECX+EDX结果存入EDX
0040E3C6|.81FA 9B000000 cmp   edx, 9B                        ;//EDX与9BH相比较
0040E3CC|.74 04         je      short 0040E3D2                   ;//相等则跳
0040E3CE|.33C0          xor   eax, eax                         ;//EAX清零
0040E3D0|.5E            pop   esi
0040E3D1|.C3            retn
0040E3D2|>B0 01         mov   al, 1                            ;//al=1
0040E3D4|.5E            pop   esi
0040E3D5\.C3            retn
==================================================================================================
算法总结:
1.用户名不参加计算;
2.注册码必须是10H(16)位;
3.假码第一位不能为0;
4.A≤注册码≤Z,按照ASCII表顺序;
5.注册码第10位+注册码第15位=9B;

一组可用注册码:
E-mail:[email protected]
Serial:ABCDEFGHIBKLMNYP

注册信息保存在程序安装目录下的setup.ini里面,格式如下:

SrcPath=

[email protected]
Serial=ABCDEFGHIBKLMNYP

如果不是按照上面的算法分析的话,这里有一组通用注册码:55J8TNJVL9F1VP9K
程序有两处跳转跳向注册成功,所以有两种方法!

看来作者准备了两手哈……

不会编程,没法写注册机,遗憾……

[ 本帖最后由 樊盟 于 2010-1-7 17:12 编辑 ]

月之精灵 发表于 2010-1-7 16:41:28

不错,写得很详细,学习学习

樊盟 发表于 2010-1-7 16:58:44

回复 2# 月之精灵 的帖子

谢谢月之精灵斑斑,小菜鸟会继续努力的!:loveliness:

yanhuohua999 发表于 2010-1-7 17:00:44

又有新的知识被吸收。。谢谢楼主哈

yangbing1990 发表于 2010-1-7 18:12:28

牛人 适合我这样的新手 UP/:good

assume 发表于 2010-1-7 21:30:57

学习了,/:good

老万 发表于 2010-1-9 20:19:38

学习了,谢谢

tianxj 发表于 2010-1-9 21:27:20

很厉害!!

wxq 发表于 2010-1-9 22:14:40

最新版通用注册码不行,楼主提供的可以。

wan 发表于 2010-1-10 00:45:44

写得很细,应该花了不少时间,支持/:good
页: [1] 2
查看完整版本: Image To PDF v2.6.0 2005 脱壳+修复+算法分析