- UID
- 56300
注册时间2008-9-7
阅读权限30
最后登录1970-1-1
龙战于野
TA的每日心情 | 开心 2024-8-15 13:22 |
---|
签到天数: 8 天 [LV.3]偶尔看看II
|
到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 [esi] ; //在这里断点→运行到选定位置(F4)
00537144 EB 00 jmp short 00537146
00537146 803E 1F cmp byte ptr [esi], 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 [ebp+3A8], 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/fi ... 5-5230OEP.rar/.page
-------------------------------------------------------------------------------------------------------
====脱壳+修复====
手动查找IAT:
具体看操作,我就不多打字了,
004014A0 /EB 10 jmp short 004014B2 ; 程序OEP!
004014A2 |66:623A bound di, dword ptr [edx]
004014A5 |43 inc ebx
004014A6 |2B2B sub ebp, dword ptr [ebx]
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 [4D908B]
004014B7 C1E0 02 shl eax, 2
004014BA A3 8F904D00 mov dword ptr [4D908F], eax
004014BF 52 push edx
004014C0 6A 00 push 0 ; F7跟进下面的CALL
004014C2 E8 4D620D00 call 004D7714 ; jmp 到 kernel32.GetModuleHandleA
头:004EE308 7C809BE7 kernel32.CloseHandle
尾:004EEFF8 770F4950 oleaut32.VariantInit
OEP= 004014A0-00400000=14A0
RVA= 004EE308-00400000=EE308
Size=004EEFF8-004EE308=CF0
注意:这里的减法用十六进制!!!
Borland C++ 1999
脱壳后程序正常运行,脱壳成功!
本部分动画教程下载:
http://down.qiannao.com/space/fi ... 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 [edi+10], 8
0040DCA5 |. 837D FC 00 cmp dword ptr [ebp-4], 0 ; //用户名与0比较
0040DCA9 |. 8D4D B4 lea ecx, dword ptr [ebp-4C]
0040DCAC |. 74 05 je short 0040DCB3 ; //相等则跳
0040DCAE |. 8B55 FC mov edx, dword ptr [ebp-4]
0040DCB1 |. EB 03 jmp short 0040DCB6
0040DCB3 |> 8D56 1C lea edx, dword ptr [esi+1C]
0040DCB6 |> 8BC3 mov eax, ebx
0040DCB8 |. E8 DF030000 call 0040E09C
0040DCBD |. 837D F8 00 cmp dword ptr [ebp-8], 0 ; //假注册码与0比较
0040DCC1 |. 74 05 je short 0040DCC8 ; //相等则跳
0040DCC3 |. 8B55 F8 mov edx, dword ptr [ebp-8]
0040DCC6 |. EB 03 jmp short 0040DCCB
0040DCC8 |> 8D56 1D lea edx, dword ptr [esi+1D]
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 [ebp-8], 0
0040DCE0 |. 74 05 je short 0040DCE7
0040DCE2 |. 8B4D F8 mov ecx, dword ptr [ebp-8]
0040DCE5 |. EB 03 jmp short 0040DCEA
0040DCE7 |> 8D4E 1E lea ecx, dword ptr [esi+1E]
0040DCEA |> 51 push ecx
0040DCEB |. 8D45 B4 lea eax, dword ptr [ebp-4C] ; //注册码以明码出现!
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 [edi+10], 2C
0040DD01 |. 8D56 1F lea edx, dword ptr [esi+1F]
0040DD04 |. 8D45 F4 lea eax, dword ptr [ebp-C]
0040DD07 |. E8 D88E0C00 call 004D6BE4
0040DD0C |. FF47 1C inc dword ptr [edi+1C]
0040DD0F |. 8B10 mov edx, dword ptr [eax]
0040DD11 |. 8B83 14050000 mov eax, dword ptr [ebx+514]
0040DD17 |. E8 3C530600 call 00473058
0040DD1C |. FF4F 1C dec dword ptr [edi+1C]
0040DD1F |. 8D45 F4 lea eax, dword ptr [ebp-C]
0040DD22 |. BA 02000000 mov edx, 2
0040DD27 |. E8 18900C00 call 004D6D44
0040DD2C |. 6A 10 push 10
0040DD2E |. 8D4E 60 lea ecx, dword ptr [esi+60]
0040DD31 |. 51 push ecx
0040DD32 |. 8D46 2D lea eax, dword ptr [esi+2D]
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 [edi+1C] ; //返回到这里!
==================================================================================================
跟进第一个关键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 [esi], 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 [eax] ; //逐位取假码转换成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 [esi+9] ; //注册码第10位=EDX
0040E3C0 |. 0FBE4E 0E movsx ecx, byte ptr [esi+E] ; //注册码第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里面,格式如下:
[Public]
SrcPath=
[Register]
[email protected]
Serial=ABCDEFGHIBKLMNYP
如果不是按照上面的算法分析的话,这里有一组通用注册码:55J8TNJVL9F1VP9K
程序有两处跳转跳向注册成功,所以有两种方法!
看来作者准备了两手哈……
不会编程,没法写注册机,遗憾……
[ 本帖最后由 樊盟 于 2010-1-7 17:12 编辑 ] |
|