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 编辑 ] 不错,写得很详细,学习学习
回复 2# 月之精灵 的帖子
谢谢月之精灵斑斑,小菜鸟会继续努力的!:loveliness: 又有新的知识被吸收。。谢谢楼主哈 牛人 适合我这样的新手 UP/:good 学习了,/:good 学习了,谢谢 很厉害!! 最新版通用注册码不行,楼主提供的可以。 写得很细,应该花了不少时间,支持/:good
页:
[1]
2