算法教学第四课
例一xx软件(这里不提供)
用户名输入abcd
注册码计算的关键部分见下:
==============▲=计算开始=▲===============
:004011E0 33DB xor ebx, ebx ---------->EBX清0。
:004011E2 8A5C05E4mov bl, byte ptr [ebp+eax-1C]--->依次取注册名字符的16进制值送入EBX的低位。
:004011E6 03D3 add edx, ebx ---------->EDX=EBX+EDX
其中,EDX的初始值为0。EDX用来保存每次循环后的结果。
:004011E8 40 inc eax --------->EAX加1,作为计数器
:004011E9 3BC8 cmp ecx, eax --------->取完了吗?? Ecx装姓名的长度
由于我们输入的abcd有4个字符,因此这里ecx=4
:004011EB 7FF3 jg 004011E0 --------->没取完就跳回循环。
=================计算结束=================
若用ollydbg,在这段儿时刻留心右上角各个寄存器的数值。
若用trw,在这段儿时刻留心顶部各个寄存器的数值。
追踪过程中各寄存器值的列表清单:
说明:C3=61+62; 126=C3+63; 18A=126+64
18A=61+62+63+64 十进制394
总结:用户名abcd 注册码394
它的注册算法就是将姓名的所有字母ascii码之和相加,就是注册码。
例二(也就是前一课的软件)
破解极酷桌面工具栏
[ 目 的 ] 找出注册码,去除次数限制,同时练习Ollydbg破解软件。
[破解工具] W32Dasm9.0汉化版 ollydbg1.07汉化增强版。
[破 解 人] 小白菜[OCN]
[破解过程]
1:用W32Dasm反汇编,点击参考--字符串数据参考;往下查到“注册失败”,
双击来到下面(我们将进行断点分析)
00406EBA|. 8B45 B8MOV EAX,DWORD PTR SS:[EBP-48]
00406EBD|. 8B80 00020000 MOV EAX,DWORD PTR DS:[EAX+200]
00406EC3|. E8 64170200 CALL Tbfof.0042862C
00406EC8|. 8D45 F4LEA EAX,DWORD PTR SS:[EBP-C]
00406ECB|. 5A POP EDX
00406ECC|. E8 F73F0500 CALL Tbfof.0045AEC8
;在上面這個CALL下斷點。EDX中就是真註冊碼的"地址"。EAX就是假註冊碼的"地址"。
如果你用TR2000的話。你可以下指令" d *edx "(注意:在EDX前要加"*"號,不然你
看到的只是註冊碼的地址)如果你用的是ollydbg的話,你可以在內存窗口點右鍵,
在彈出的窗口上選擇"Go to --->>expression",然後在跳出的窗口中輸入"EDX"指向
的內存地址的值(注意:不是EDX的值哦!如:在我的機子上edx的值是0012f850它指向
的內存中的值是00a3f000,那麽你就要輸入00a3f00,而不是0012f850 ).輸入地址後,
按OK,你就可以在內存窗口看到你的真註冊碼了。
00406ED1|. 50 PUSH EAX ;存註冊成功與否的標志。
00406ED2|. FF4D D8DEC DWORD PTR SS:[EBP-28]
00406ED5|. 8D45 F4LEA EAX,DWORD PTR SS:[EBP-C]
00406ED8|. BA 02000000 MOV EDX,2
00406EDD|. E8 163F0500 CALL Tbfof.0045ADF8
00406EE2|. FF4D D8DEC DWORD PTR SS:[EBP-28] ; |
00406EE5|. 8D45 F0LEA EAX,DWORD PTR SS:[EBP-10] ; |
00406EE8|. BA 02000000 MOV EDX,2 ; |
00406EED|. E8 063F0500 CALL Tbfof.0045ADF8 ; \Tbfof.0045ADF8
00406EF2|. 59 POP ECX ;取出註冊成功與否的標志。
00406EF3|. 84C9 TEST CL,CL
00406EF5|. 0F84 E0000000 JE Tbfof.00406FDB ;如果爲0就跳到出錯窗口了。
00406EFB|. 33C0 XOR EAX,EAX
00406EFD|. 8945 E8MOV DWORD PTR SS:[EBP-18],EAX
00406F00|. 8D55 E8LEA EDX,DWORD PTR SS:[EBP-18]
00406F03|. FF45 D8INC DWORD PTR SS:[EBP-28]
00406F06|. 8B4D B8MOV ECX,DWORD PTR SS:[EBP-48]
00406F09|. 8B81 F4010000 MOV EAX,DWORD PTR DS:[ECX+1F4]
00406F0F|. E8 18170200 CALL Tbfof.0042862C
00406F14|. 8D55 E8LEA EDX,DWORD PTR SS:[EBP-18]
00406F17|. 8D45 ECLEA EAX,DWORD PTR SS:[EBP-14]
00406F1A|. 8B0A MOV ECX,DWORD PTR DS:[EDX]
00406F1C|. BA 20E54500 MOV EDX,Tbfof.0045E520 ; ASCII "User"
00406F21|. 51 PUSH ECX
00406F22|. 66:C745 CC 2C0>MOV WORD PTR SS:[EBP-34],2C
00406F28|. E8 9B3D0500 CALL Tbfof.0045ACC8
00406F2D|. FF45 D8INC DWORD PTR SS:[EBP-28]
00406F30|. 8B10 MOV EDX,DWORD PTR DS:[EAX]
00406F32|. 8B45 B8MOV EAX,DWORD PTR SS:[EBP-48]
00406F35|. 59 POP ECX
00406F36|. E8 ADF5FFFF CALL Tbfof.004064E8
00406F3B|. FF4D D8DEC DWORD PTR SS:[EBP-28]
00406F3E|. 8D45 E8LEA EAX,DWORD PTR SS:[EBP-18]
00406F41|. BA 02000000 MOV EDX,2
00406F46|. E8 AD3E0500 CALL Tbfof.0045ADF8
00406F4B|. FF4D D8DEC DWORD PTR SS:[EBP-28]
00406F4E|. 8D45 ECLEA EAX,DWORD PTR SS:[EBP-14]
00406F51|. BA 02000000 MOV EDX,2
00406F56|. E8 9D3E0500 CALL Tbfof.0045ADF8
00406F5B|. 33C9 XOR ECX,ECX
00406F5D|. 894D E0MOV DWORD PTR SS:[EBP-20],ECX
00406F60|. 8D55 E0LEA EDX,DWORD PTR SS:[EBP-20]
00406F63|. FF45 D8INC DWORD PTR SS:[EBP-28]
00406F66|. 8B45 B8MOV EAX,DWORD PTR SS:[EBP-48]
00406F69|. 8B80 00020000 MOV EAX,DWORD PTR DS:[EAX+200]
00406F6F|. E8 B8160200 CALL Tbfof.0042862C
00406F74|. 8D55 E0LEA EDX,DWORD PTR SS:[EBP-20]
00406F77|. 8D45 E4LEA EAX,DWORD PTR SS:[EBP-1C]
00406F7A|. 8B0A MOV ECX,DWORD PTR DS:[EDX]
00406F7C|. BA 25E54500 MOV EDX,Tbfof.0045E525 ; ASCII "Reg"
00406F81|. 51 PUSH ECX
00406F82|. 66:C745 CC 380>MOV WORD PTR SS:[EBP-34],38
00406F88|. E8 3B3D0500 CALL Tbfof.0045ACC8
00406F8D|. FF45 D8INC DWORD PTR SS:[EBP-28]
00406F90|. 8B10 MOV EDX,DWORD PTR DS:[EAX]
00406F92|. 8B45 B8MOV EAX,DWORD PTR SS:[EBP-48]
00406F95|. 59 POP ECX
00406F96|. E8 4DF5FFFF CALL Tbfof.004064E8
00406F9B|. FF4D D8DEC DWORD PTR SS:[EBP-28]
00406F9E|. 8D45 E0LEA EAX,DWORD PTR SS:[EBP-20]
00406FA1|. BA 02000000 MOV EDX,2
00406FA6|. E8 4D3E0500 CALL Tbfof.0045ADF8
00406FAB|. FF4D D8DEC DWORD PTR SS:[EBP-28]
00406FAE|. 8D45 E4LEA EAX,DWORD PTR SS:[EBP-1C]
00406FB1|. BA 02000000 MOV EDX,2
00406FB6|. E8 3D3E0500 CALL Tbfof.0045ADF8
00406FBB|. A1 EC344600 MOV EAX,DWORD PTR DS:[4634EC]
00406FC0|. 6A 00 PUSH 0
00406FC2|. B9 34E54500 MOV ECX,Tbfof.0045E534
00406FC7|. BA 29E54500 MOV EDX,Tbfof.0045E529
00406FCC|. 8B00 MOV EAX,DWORD PTR DS:[EAX]
00406FCE|. E8 DD3C0500 CALL Tbfof.0045ACB0 ;註冊成功的提示。
00406FD3|. 66:C745 CC 200>MOV WORD PTR SS:[EBP-34],20
00406FD9|. EB 32 JMP SHORT Tbfof.0040700D
00406FDB|> A1 EC344600 MOV EAX,DWORD PTR DS:[4634EC]
00406FE0|. 6A 00 PUSH 0
00406FE2|. B9 4AE54500 MOV ECX,Tbfof.0045E54A
00406FE7|. BA 3FE54500 MOV EDX,Tbfof.0045E53F
00406FEC|. 8B00 MOV EAX,DWORD PTR DS:[EAX]
00406FEE|. E8 BD3C0500 CALL Tbfof.0045ACB0 ;註冊不成功的提示。
我們向上看有沒有跳轉
跳過這個出錯窗口。
00406FF3|. 8B55 B8MOV EDX,DWORD PTR SS:[EBP-48]
00406FF6|. 8B82 F4010000 MOV EAX,DWORD PTR DS:[EDX+1F4]
00406FFC|. 8B10 MOV EDX,DWORD PTR DS:[EAX]
00406FFE|. FF52 7CCALL DWORD PTR DS:[EDX+7C]
00407001|. 8B4D BCMOV ECX,DWORD PTR SS:[EBP-44]
00407004|. 64:890D 000000>MOV DWORD PTR FS:[0],ECX
2:好了,断点分析完毕,就是0045AEC8。运行Ollydbg装入软件,在右上角0045AEC8按F2
下断点,按F9运行软件,注意右下角是否出现Running字样,点击软件进行注册,我的是
用户名:xbc
注册号:98989898
然后按确定,被拦!返回ollydbg界面,在右下角往下找一下,呵呵!
在98989898上面是什么?哈~破解成功!
3:小白菜的注册码:
==================
用户名:xbc
注册号:34012224
==================
例三 FoldView 1.51算法分析 破解人:pzhccy
破解对象:FoldView 1.51
目标:了解算法并写出注册机
难度:简单,适合我这等初学者
各位初学的朋友们,想学注册算法的,一定要试下这个软件
1、检查是否加壳,无壳;
2、输入那些注册码,注册名;
3、打开TRW, bpx hmemcpy 万能中断 g
4、点注册,中断了
5、pmoude 来到领空下( 我用的是最新版的TRW,旧的会弹出错误的对话框)
如下:按几下F10到下面
* Possible Reference to Dialog: DialogID_0067, CONTROL_ID:03ED, ""
|
:00405934 68ED030000 push 000003ED
:00405939 56 push esi
:0040593A FFD7 call edi<<-----------此为取出注册码,当然是假的
:0040593C 8D442408 lea eax, dword ptr [esp+08]<<----------你输入的假的注册码
:00405940 8D8C2408010000 lea ecx, dword ptr [esp+00000108]<<--------你的注册名
:00405947 50 push eax
:00405948 51 push ecx
:00405949 E842030000 call 00405C90<<-----------过此,见真码,追入
:0040594E 83C408 add esp, 00000008
:00405951 85C0 test eax, eax
:00405953 5F pop edi
:00405954 7443 je 00405999<<---------- 一跳就死了
:00405956 8D542404 lea edx, dword ptr [esp+04]
:0040595A 8D842404010000 lea eax, dword ptr [esp+00000104]
:00405961 52 push edx
:00405962 50 push eax
* Possible StringData Ref from Data Obj ->"Software\FolderView\Registration"
| <<---不跳就幸福了,把注册名等放入注册表
:00405963 6824254100 push 00412524
:00405968 6801000080 push 80000001
:0040596D E85E030000 call 00405CD0
* Possible StringData Ref from Data Obj ->"Software\FolderView\Registration"
|
:00405972 6824254100 push 00412524
:00405977 6801000080 push 80000001
:0040597C E8BF010000 call 00405B40
:00405981 83C418 add esp, 00000018
* Possible Reference to String Resource ID=00001: "Registered to: %s"<<-----注册给谁了?
|
:00405984 6A01 push 00000001
:00405986 56 push esi
* Reference To: USER32.EndDialog, Ord:00C6h
|
:00405987 FF15CC014100 Call dword ptr [004101CC]
:0040598D 33C0 xor eax, eax
:0040598F 5E pop esi
:00405990 81C400020000 add esp, 00000200
:00405996 C21000 ret 0010
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405954(C)
|
:00405999 6A00 push 00000000<<-----------跳到这里,死硬了吧!55555
* Possible StringData Ref from Data Obj ->"FolderView"
|
:0040599B 6880254100 push 00412580
* Possible StringData Ref from Data Obj ->"Sorry, you have entered an incorrect "<<----可恶的字
->"registration code."
|
:004059A0 68CC284100 push 004128CC
:004059A5 56 push esi
追入:
* Referenced by a CALL at Addresses:
|:00405949 , :00405C0D
|
:00405C90 8B4C2404 mov ecx, dword ptr [esp+04]
:00405C94 81EC00010000 sub esp, 00000100
:00405C9A 8D442400 lea eax, dword ptr [esp]
:00405C9E 50 push eax
:00405C9F 51 push ecx
:00405CA0 E8AB000000 call 00405D50<<-----------------过此,见真码,追入
:00405CA5 8B842410010000 mov eax, dword ptr [esp+00000110]
:00405CAC 8D542408 lea edx, dword ptr [esp+08]
:00405CB0 52 push edx<<--------d edx
:00405CB1 50 push eax<<-----d eax 你看到什么了
:00405CB2 E889FFFFFF call 00405C40
:00405CB7 F7D8 neg eax
:00405CB9 1BC0 sbb eax, eax
:00405CBB F7D8 neg eax
:00405CBD 81C410010000 add esp, 00000110
:00405CC3 C3 ret
追入后如下:
|:00405CA0
|
:00405D50 81EC00010000 sub esp, 00000100
:00405D56 A02C574100 mov al, byte ptr [0041572C]
:00405D5B 53 push ebx
:00405D5C 55 push ebp
:00405D5D 56 push esi
:00405D5E 57 push edi
:00405D5F 88442410 mov byte ptr [esp+10], al
:00405D63 B93F000000 mov ecx, 0000003F
:00405D68 33C0 xor eax, eax
:00405D6A 8D7C2411 lea edi, dword ptr [esp+11]
:00405D6E F3 repz
:00405D6F AB stosd
:00405D70 66AB stosw
:00405D72 AA stosb
:00405D73 8BBC2414010000 mov edi, dword ptr [esp+00000114]
:00405D7A 57 push edi
* Reference To: KERNEL32.lstrlenA, Ord:03AEh
|
:00405D7B FF1550014100 Call dword ptr [00410150]
:00405D81 8BF0 mov esi, eax
:00405D83 33C9 xor ecx, ecx
:00405D85 33C0 xor eax, eax
:00405D87 85F6 test esi, esi<<-----------用户为空吗?
:00405D89 7613 jbe 00405D9E<<----------为空则跳走了
:00405D8B 8B15BC284100 mov edx, dword ptr [004128BC]<<---------edx=32H
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405D9C(C)
|
:00405D91 0FBE1C38 movsx ebx, byte ptr [eax+edi]<<-----逐个取出用户名对应的ASCII码
:00405D95 03DA add ebx, edx<<-----逐个+32
:00405D97 03CB add ecx, ebx<<------求和
:00405D99 40 inc eax<<------计数器加1
:00405D9A 3BC6 cmp eax, esi<<---比较是否取完
:00405D9C 72F3 jb 00405D91<<---------循环结束则继续
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405D89(C)
|
:00405D9E 8B9C2418010000 mov ebx, dword ptr [esp+00000118]
:00405DA5 51 push ecx
* Possible StringData Ref from Data Obj ->"%u-"<<--------这里转为十进制并加上-,记为M1
|
:00405DA6 6814294100 push 00412914
:00405DAB 53 push ebx
* Reference To: USER32.wsprintfA, Ord:02D6h
|
:00405DAC FF15C4014100 Call dword ptr [004101C4]
:00405DB2 83C40C add esp, 0000000C
:00405DB5 33C9 xor ecx, ecx
:00405DB7 33C0 xor eax, eax
:00405DB9 85F6 test esi, esi
:00405DBB 7614 jbe 00405DD1
:00405DBD 8B15C0284100 mov edx, dword ptr [004128C0]<<-------edx=28H
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405DCF(C)
|
:00405DC3 0FBE2C38 movsx ebp, byte ptr [eax+edi]
:00405DC7 0FAFEA imul ebp, edx<<----------------相乘
:00405DCA 03CD add ecx, ebp<<--------求和
:00405DCC 40 inc eax
:00405DCD 3BC6 cmp eax, esi
:00405DCF 72F2 jb 00405DC3
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405DBB(C)
|
:00405DD1 51 push ecx
:00405DD2 8D4C2414 lea ecx, dword ptr [esp+14]
* Possible StringData Ref from Data Obj ->"%u-"<<--------这里转为十进制并加上-,记为M2
|
:00405DD6 6814294100 push 00412914
:00405DDB 51 push ecx
* Reference To: USER32.wsprintfA, Ord:02D6h
|
:00405DDC FF15C4014100 Call dword ptr [004101C4]<<--------这里是把M1+M2
:00405DE2 83C40C add esp, 0000000C
:00405DE5 8D542410 lea edx, dword ptr [esp+10]
:00405DE9 52 push edx
:00405DEA 53 push ebx
* Reference To: KERNEL32.lstrcatA, Ord:039Fh
|
:00405DEB FF1588014100 Call dword ptr [00410188]
:00405DF1 33C9 xor ecx, ecx
:00405DF3 33C0 xor eax, eax
:00405DF5 85F6 test esi, esi
:00405DF7 7613 jbe 00405E0C
:00405DF9 8B15C4284100 mov edx, dword ptr [004128C4]<<-------edx=1eH
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405E0A(C)
|
:00405DFF 0FBE2C38 movsx ebp, byte ptr [eax+edi]
:00405E03 03EA add ebp, edx<<--------------相加
:00405E05 03CD add ecx, ebp<<--------求和
:00405E07 40 inc eax
:00405E08 3BC6 cmp eax, esi
:00405E0A 72F3 jb 00405DFF
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405DF7(C)
|
:00405E0C 51 push ecx
:00405E0D 8D442414 lea eax, dword ptr [esp+14]
* Possible StringData Ref from Data Obj ->"%u-"
|
:00405E11 6814294100 push 00412914
:00405E16 50 push eax
* Reference To: USER32.wsprintfA, Ord:02D6h
|
:00405E17 FF15C4014100 Call dword ptr [004101C4]
:00405E1D 83C40C add esp, 0000000C
:00405E20 8D4C2410 lea ecx, dword ptr [esp+10]
:00405E24 51 push ecx
:00405E25 53 push ebx
* Reference To: KERNEL32.lstrcatA, Ord:039Fh
|
:00405E26 FF1588014100 Call dword ptr [00410188]
:00405E2C 33C9 xor ecx, ecx
:00405E2E 33C0 xor eax, eax
:00405E30 85F6 test esi, esi
:00405E32 7614 jbe 00405E48
:00405E34 8B15C8284100 mov edx, dword ptr [004128C8]<<------edx=0bH
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405E46(C)
|
:00405E3A 0FBE2C38 movsx ebp, byte ptr [eax+edi]
:00405E3E 0FAFEA imul ebp, edx<<-------------相乘
:00405E41 03CD add ecx, ebp<<------求和
:00405E43 40 inc eax
:00405E44 3BC6 cmp eax, esi
:00405E46 72F2 jb 00405E3A
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405E32(C)
|
:00405E48 51 push ecx
:00405E49 8D542414 lea edx, dword ptr [esp+14]
* Possible StringData Ref from Data Obj ->"%u"
|
:00405E4D 6898274100 push 00412798
:00405E52 52 push edx
* Reference To: USER32.wsprintfA, Ord:02D6h
|
:00405E53 FF15C4014100 Call dword ptr [004101C4]<<--------全部连起来
:00405E59 83C40C add esp, 0000000C
:00405E5C 8D442410 lea eax, dword ptr [esp+10]
:00405E60 50 push eax
:00405E61 53 push ebx
* Reference To: KERNEL32.lstrcatA, Ord:039Fh
|
:00405E62 FF1588014100 Call dword ptr [00410188]
:00405E68 5F pop edi
:00405E69 5E pop esi
:00405E6A 5D pop ebp
:00405E6B 5B pop ebx
:00405E6C 81C400010000 add esp, 00000100
:00405E72 C3 ret
举例:注册名:pzhccy[bcg]
M1= p z h c c y [ b c g ]
70+32+ 7A+32+ 68+32+ 63+32+ 63+32+ 79+32+ 5B+32+ 62+32+ 63+32+ 67+32+ 5D+32=69B=1691 再在后面加-
以下就如此类推,就可以得出真码。
注册机应该很容易写吧! 反正我已经写好了。
整理:注册名:pzhccy[bcg] 注册码:1691-45640-1471-12551
例四 极速火龙CD压缩器 1.28 算法分析 破解人:pzhccy
破解目标:极速火龙CD压缩器 1.28
下载地址:
www.softreg.com 1、检查是否加壳,unpetite脱壳
2、打开TRW,下命令 bpx hmemcpy
g 被拦
大约按F10 N下,来到下面(已经记不清了,但很容易,因为它按几下一个ret)
注册算法如下:
|:0047694A(U)
|
:00476958 0FBE45FC movsx eax, byte ptr [ebp-04]<<------ 取用户名的第一个字符的ASCII码
:0047695C 0FBE55FD movsx edx, byte ptr [ebp-03] <<------- 取出第二个
:00476960 03C2 add eax, edx<<---------------------第一、二ASCII码相加
:00476962 0FBE55FE movsx edx, byte ptr [ebp-02]<<-------取出第三个
:00476966 03C2 add eax, edx<<-----------------第一、二、三相加,值在eax中
:00476968 0FBE55FF movsx edx, byte ptr [ebp-01]<<----------取出第四个
:0047696C 03C2 add eax, edx<<-----------------第一、二、三、四全部加起来到eax中
:0047696E 69C04E61BC00 imul eax, 00BC614E<<----------和乘以BC614E(十进制为12345678,哈哈…)
:00476974 B9BB000000 mov ecx, 000000BB<<---------ecx等于BB
:00476979 99 cdq<<--------------------双字扩展,edx清零
:0047697A F7F9 idiv ecx<<-------------eax除以ecx,商在eax,余数在edx中
:0047697C 3BD8 cmp ebx, eax<<-------比较来了,?ebx ,? eax 看到什么了
:0047697E 0F85DB000000 jne 00476A5F<<---------- 一跳就死
:00476984 3DE8030000 cmp eax, 000003E8<<------这里实在不敢恭惟,可能作者故意加上去的,但一点用处
都没有,比较你的注册码是否少于3E8,十进制为1000,你试一下就知道,随便输,算出来的结果都不会被它小。
:00476989 0F8ED0000000 jle 00476A5F<<--------------少于等于都要死
:0047698F 6A00 push 00000000
:00476991 8D55F0 lea edx, dword ptr [ebp-10]
:00476994 A1DC474800 mov eax, dword ptr [004847DC]
:00476999 E8BEEFF8FF call 0040595C
:0047699E 8B45F0 mov eax, dword ptr [ebp-10]
:004769A1 E8EED5F8FF call 00403F94
:004769A6 50 push eax
:004769A7 8D55EC lea edx, dword ptr [ebp-14]
:004769AA A14C4B4800 mov eax, dword ptr [00484B4C]
:004769AF E8A8EFF8FF call 0040595C
:004769B4 8B45EC mov eax, dword ptr [ebp-14]
:004769B7 E8D8D5F8FF call 00403F94
:004769BC 8BD0 mov edx, eax
:004769BE A18C4A4800 mov eax, dword ptr [00484A8C]
:004769C3 8B00 mov eax, dword ptr [eax]
:004769C5 59 pop ecx
:004769C6 E8B549FDFF call 0044B380
:004769CB B201 mov dl, 01
* Possible StringData Ref from Data Obj ->"
"
|
:004769CD A1C05D4700 mov eax, dword ptr [00475DC0]
:004769D2 E8E9F4FFFF call 00475EC0
:004769D7 8BD8 mov ebx, eax
:004769D9 BA01000080 mov edx, 80000001
:004769DE 8BC3 mov eax, ebx
:004769E0 E87BF5FFFF call 00475F60
:004769E5 B101 mov cl, 01
* Possible StringData Ref from Data Obj ->"\Software\Microsoft\Windows\CurrentVersion\Exp"
->"lorer\tips"<<----------注册后,把信息放在这里
|
:004769E7 BADC6A4700 mov edx, 00476ADC
:004769EC 8BC3 mov eax, ebx
:004769EE E8D1F5FFFF call 00475FC4
:004769F3 B901000000 mov ecx, 00000001
* Possible StringData Ref from Data Obj ->"TipsForAllSkip"
|
:004769F8 BA206B4700 mov edx, 00476B20
:004769FD 8BC3 mov eax, ebx
:004769FF E800F8FFFF call 00476204
:00476A04 8BC3 mov eax, ebx
:00476A06 E825F5FFFF call 00475F30
:00476A0B 8BC3 mov eax, ebx
:00476A0D E8F2C3F8FF call 00402E04
:00476A12 6A30 push 00000030
:00476A14 8D55E8 lea edx, dword ptr [ebp-18]
:00476A17 A1DC484800 mov eax, dword ptr [004848DC]
:00476A1C E83BEFF8FF call 0040595C
:00476A21 8B45E8 mov eax, dword ptr [ebp-18]
:00476A24 E86BD5F8FF call 00403F94
:00476A29 50 push eax
:00476A2A 8D55E4 lea edx, dword ptr [ebp-1C]
:00476A2D A10C484800 mov eax, dword ptr [0048480C]
:00476A32 E825EFF8FF call 0040595C
:00476A37 8B45E4 mov eax, dword ptr [ebp-1C]
:00476A3A E855D5F8FF call 00403F94
:00476A3F 8BD0 mov edx, eax
:00476A41 A18C4A4800 mov eax, dword ptr [00484A8C]
:00476A46 8B00 mov eax, dword ptr [eax]
:00476A48 59 pop ecx
:00476A49 E83249FDFF call 0044B380
:00476A4E A18C4A4800 mov eax, dword ptr [00484A8C]
:00476A53 8B00 mov eax, dword ptr [eax]
:00476A55 8B4038 mov eax, dword ptr [eax+38]
:00476A58 E83F15FDFF call 00447F9C
:00476A5D EB3C jmp 00476A9B<<-----------------跳向成功处
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0047697E(C), :00476989(C)
|
:00476A5F 6A00 push 00000000<<---------------下到这里就硬又冰了
:00476A61 8D55E0 lea edx, dword ptr [ebp-20]
:00476A64 A1DC474800 mov eax, dword ptr [004847DC]
:00476A69 E8EEEEF8FF call 0040595C
:00476A6E 8B45E0 mov eax, dword ptr [ebp-20]
:00476A71 E81ED5F8FF call 00403F94
:00476A76 50 push eax
:00476A77 8D55DC lea edx, dword ptr [ebp-24]
:00476A7A A1AC484800 mov eax, dword ptr [004848AC]
:00476A7F E8D8EEF8FF call 0040595C
:00476A84 8B45DC mov eax, dword ptr [ebp-24]
:00476A87 E808D5F8FF call 00403F94
:00476A8C 8BD0 mov edx, eax
:00476A8E A18C4A4800 mov eax, dword ptr [00484A8C]
:00476A93 8B00 mov eax, dword ptr [eax]
:00476A95 59 pop ecx
:00476A96 E8E548FDFF call 0044B380
举例:pzhccy
只取前四个去算,如不够四位,则其它位数为0,
p z h c
70 +7a +68 +63=1b5
1b5 * bc614e / bb = 59c3e7H = 5882855
整理:注册名:pzhccy 注册码: 5882855
例4五folderview1.46 破解人:pzhccy
破解对象:folderview 1.46 和 supercleaner 2.41 的算法一模一样
难度:一般
1、查壳,无壳
2、有出错信息,反汇编,找不到出错信息,无办法,唯有用动态跟踪了,
3、打开tr,
bpx getdlgitemtexta
g 确定,被拦
按F10单步跟踪到下面,大约按10多下。
016F:00405018 CALL EDI
016F:0040501A LEA EDX,[ESP+08]
016F:0040501E PUSH DWORD 0100
016F:00405023 PUSH EDX
016F:00405024 PUSH DWORD 03FC
016F:00405029 PUSH ESI
016F:0040502A CALL EDI 取出注册名、码的CALL
016F:0040502C LEA EAX,[ESP+08]
016F:00405030 LEA ECX,[ESP+0108]
016F:00405037 PUSH EAX d eax,d ecx 可见注册名、码
016F:00405038 PUSH ECX
016F:00405039 CALL 004053B0 这里为重要CALL,因为下面不跳就死,所以,这个是关键的CALL
016F:0040503E ADD ESP,BYTE +08
016F:00405041 TEST EAX,EAX
016F:00405043 POP EDI
016F:00405044 JZ 00405089 不跳就死
我们进入405039这个CALL,如下:算法分析:注册码由四部分组成,a1-b1-c1-d1
016F:004053B0 MOV ECX,[ESP+04]
016F:004053B4 SUB ESP,0100
016F:004053BA LEA EAX,[ESP+00]
016F:004053BE PUSH EAX
016F:004053BF PUSH ECX 你的注册名
016F:004053C0 CALL 00405470 重要CALL,因为过此CALL后,你已见到真码
016F:004053C5 MOV EAX,[ESP+0110]
016F:004053CC LEA EDX,[ESP+08]
016F:004053D0 PUSH EDX d eax,d edx 一真一假码
016F:004053D1 PUSH EAX
016F:004053D2 CALL 00405360 此为比较真假的CALL
016F:004053D7 NEG EAX
016F:004053D9 SBB EAX,EAX
016F:004053DB NEG EAX
016F:004053DD ADD ESP,0110
ret
我们进入4053C0这个CALL
016F:00405470 SUB ESP,0100
016F:00405476 MOV AL,[004145AC]
016F:0040547B PUSH EBX
016F:0040547C PUSH EBP
016F:0040547D PUSH ESI
016F:0040547E PUSH EDI
016F:0040547F MOV [ESP+10],AL
016F:00405483 MOV ECX,3F
016F:00405488 XOR EAX,EAX
016F:0040548A LEA EDI,[ESP+11]
016F:0040548E REP STOSD
016F:00405490 STOSW
016F:00405492 STOSB
016F:00405493 MOV EDI,[ESP+0114]
016F:0040549A PUSH EDI
016F:0040549B CALL `KERNEL32!lstrlenA`
016F:004054A1 MOV ESI,EAX
016F:004054A3 XOR ECX,ECX
016F:004054A5 XOR EAX,EAX
016F:004054A7 TEST ESI,ESI esi为名字的长度,看名字是否为空
016F:004054A9 JNA 004054BE 为空即跳走
016F:004054AB MOV EDX,[00411744] ? edx ,edx=32H 这是16进制
016F:004054B1 MOVSX EBX,BYTE [EAX+EDI] 提取姓名的一个字符 (计算a1部分)
016F:004054B5 ADD EBX,EDX ebx+edx=ebx 即每一个字符的16进制+32H
016F:004054B7 ADD ECX,EBX 结果送入ecx,即为储数器
016F:004054B9 INC EAX 寄存器每次加一,即第一位,再第二位数,直到结束
016F:004054BA CMP EAX,ESI 这时就是比较是否完结
016F:004054BC JC 004054B1 循环结束即继续
016F:004054BE MOV EBX,[ESP+0118]
016F:004054C5 PUSH ECX
016F:004054C6 PUSH DWORD 0041179C
016F:004054CB PUSH EBX
016F:004054CC CALL `USER32!wsprintfA`
016F:004054D2 ADD ESP,BYTE +0C
016F:004054D5 XOR ECX,ECX
016F:004054D7 XOR EAX,EAX
016F:004054D9 TEST ESI,ESI 同上
016F:004054DB JNA 004054F1
016F:004054DD MOV EDX,[00411748] 计算b1部分 edx=28
016F:004054E3 MOVSX EBP,BYTE [EAX+EDI] 同上
016F:004054E7 IMUL EBP,EDX 即每一个字符的16进制*28H
016F:004054EA ADD ECX,EBP
016F:004054EC INC EAX
016F:004054ED CMP EAX,ESI 同上
016F:004054EF JC 004054E3
016F:004054F1 PUSH ECX
016F:004054F2 LEA ECX,[ESP+14]
016F:004054F6 PUSH DWORD 0041179C
016F:004054FB PUSH ECX
016F:004054FC CALL `USER32!wsprintfA`
016F:00405502 ADD ESP,BYTE +0C
016F:00405505 LEA EDX,[ESP+10]
016F:00405509 PUSH EDX
016F:0040550A PUSH EBX
016F:0040550B CALL `KERNEL32!lstrcatA`
016F:00405511 XOR ECX,ECX
016F:00405513 XOR EAX,EAX
016F:00405515 TEST ESI,ESI 同上
016F:00405517 JNA 0040552C
016F:00405519 MOV EDX,[0041174C] edx=1e
016F:0040551F MOVSX EBP,BYTE [EAX+EDI] 提取姓名的一个字符 (计算c1部分)
016F:00405523 ADD EBP,EDX
016F:00405525 ADD ECX,EBP
016F:00405527 INC EAX
016F:00405528 CMP EAX,ESI
016F:0040552A JC 0040551F
016F:0040552C PUSH ECX
016F:0040552D LEA EAX,[ESP+14]
016F:00405531 PUSH DWORD 0041179C
016F:00405536 PUSH EAX
016F:00405537 CALL `USER32!wsprintfA`
016F:0040553D ADD ESP,BYTE +0C
016F:00405540 LEA ECX,[ESP+10]
016F:00405544 PUSH ECX
016F:00405545 PUSH EBX
016F:00405546 CALL `KERNEL32!lstrcatA`
016F:0040554C XOR ECX,ECX
016F:0040554E XOR EAX,EAX
016F:00405550 TEST ESI,ESI 同上
016F:00405552 JNA 00405568
016F:00405554 MOV EDX,[00411750] edx=0b
016F:0040555A MOVSX EBP,BYTE [EAX+EDI] 计算d1部分
016F:0040555E IMUL EBP,EDX
016F:00405561 ADD ECX,EBP
016F:00405563 INC EAX 同上
016F:00405564 CMP EAX,ESI
016F:00405566 JC 0040555A
016F:00405568 PUSH ECX
016F:00405569 LEA EDX,[ESP+14]
016F:0040556D PUSH DWORD 00411620
016F:00405572 PUSH EDX
016F:00405573 CALL `USER32!wsprintfA`
016F:00405579 ADD ESP,BYTE +0C
016F:0040557C LEA EAX,[ESP+10]
016F:00405580 PUSH EAX
016F:00405581 PUSH EBX
016F:00405582 CALL `KERNEL32!lstrcatA`
016F:00405588 POP EDI
016F:00405589 POP ESI
016F:0040558A POP EBP
016F:0040558B POP EBX
016F:0040558C ADD ESP,0100
整理:注册名:pzhccy 注册码:957-26280-837-7227
例6破解社区游戏伴侣
[下载地址]
http://www.softreg.com.cn/download.asp?id={6A697B98-6D96-4CF1-A14C-A060A31D299C}
[破解工具]PEiD0.8英文版,AspackDie 1.4 汉化版、W32Dasm9.00汉化版,Ollydbg1.07汉化增强版
[破解人] 小白菜
[破解目的]找出注册码
[破解时间]2002年8月25日
[破解过程]
1 探测:用PEiD装入软件,发现软件有壳,为ASPack 2.12 -> Alexey Solodovnikov。
2 脱壳:用AspackDie 1.4 汉化版脱壳,生成脱壳文件unpacked.ExE。
3 用W32Dasm9.00汉化版反汇编,点击参考-字符串数据参考,发现我们比较感兴趣的字样:
"感谢您注册使用本软件,您注册码已保存在本机,以后",以及"注册码错误!!如您没有注册,
不必输入也可以直接进?”正常应该是双击"注册码错误!!如您没有注册,不必输入也可以直接进?”
字样,可是我双击以后提示“数据没发现”!晕倒~不知道是不是版本太低的原因;没办法,只好
双击"感谢您注册使用本软件,您注册码已保存在本机,以后"字样并来到下面,分析断点
联众断点分析:
00469DA0 /. 55 PUSH EBP;仅仅是判断函数入口
。。。。。。
00469DC8 |. 8B80 08030000 MOV EAX,DWORD PTR DS:[EAX+308]
00469DCE |. E8 FDE9FCFF CALL unpacked.004387D0 ;读入注册码
00469DD3 |. 8B45 C8MOV EAX,DWORD PTR SS:[EBP-38]
00469DD6 |. 33D2 XOR EDX,EDX
00469DD8 |. E8 33EDF9FF CALL unpacked.00408B10 ;转化成数值
00469DDD |. 8BC8 MOV ECX,EAX
00469DDF |. 81F9 80969800 CMP ECX,989680 ;十进制10000000
00469DE5 |. 7D 0F JGE SHORT unpacked.00469DF6 ;小于就不是8位数,失败
。。。。。。
00469E00 |. 8B80 08030000 MOV EAX,DWORD PTR DS:[EAX+308]
00469E06 |. E8 C5E9FCFF CALL unpacked.004387D0 ;注册码
00469E0B |. 8B45 C0MOV EAX,DWORD PTR SS:[EBP-40]
00469E0E |. B9 04000000 MOV ECX,4
00469E13 |. 33D2 XOR EDX,EDX
00469E15 |. E8 7EABF9FF CALL unpacked.00404998 ;注册码的前4位
00469E1A |. 8B45 C4MOV EAX,DWORD PTR SS:[EBP-3C]
00469E1D |. E8 B2ECF9FF CALL unpacked.00408AD4 ;转化成数值
00469E22 |. 8945 F0MOV DWORD PTR SS:[EBP-10],EAX ;存放起来,后面有用哟!
00469E25 |. 8D55 B8LEA EDX,DWORD PTR SS:[EBP-48]
00469E28 |. 8B45 FCMOV EAX,DWORD PTR SS:[EBP-4]
00469E2B |. 8B80 04030000 MOV EAX,DWORD PTR DS:[EAX+304]
00469E31 |. E8 9AE9FCFF CALL unpacked.004387D0 ;读入注册名
00469E36 |. 8B45 B8MOV EAX,DWORD PTR SS:[EBP-48]
00469E39 |. 8D55 BCLEA EDX,DWORD PTR SS:[EBP-44]
00469E3C |. E8 37E9F9FF CALL unpacked.00408778 ;转换成小写
00469E41 |. 8B45 BCMOV EAX,DWORD PTR SS:[EBP-44]
00469E44 |. 8D55 F4LEA EDX,DWORD PTR SS:[EBP-C]
00469E47 |. E8 08EAF9FF CALL unpacked.00408854
00469E4C |. 8D45 B4LEA EAX,DWORD PTR SS:[EBP-4C]
00469E4F |. 50 PUSH EAX
00469E50 |. 8D55 B0LEA EDX,DWORD PTR SS:[EBP-50]
00469E53 |. 8B45 FCMOV EAX,DWORD PTR SS:[EBP-4]
00469E56 |. 8B80 08030000 MOV EAX,DWORD PTR DS:[EAX+308]
00469E5C |. E8 6FE9FCFF CALL unpacked.004387D0 ;还是注册码
00469E61 |. 8B45 B0MOV EAX,DWORD PTR SS:[EBP-50]
00469E64 |. B9 04000000 MOV ECX,4
00469E69 |. BA 05000000 MOV EDX,5
00469E6E |. E8 25ABF9FF CALL unpacked.00404998 ;取出后面的4位
00469E73 |. 8B55 B4MOV EDX,DWORD PTR SS:[EBP-4C]
00469E76 |. 8D45 F4LEA EAX,DWORD PTR SS:[EBP-C]
00469E79 |. E8 CAA8F9FF CALL unpacked.00404748 ;放在注册名后面(例如upfeed0000)
00469E7E |. 8B45 F4MOV EAX,DWORD PTR SS:[EBP-C]
00469E81 |. E8 BAA8F9FF CALL unpacked.00404740 ;上面串的长度
00469E86 |. 8945 F8MOV DWORD PTR SS:[EBP-8],EAX
00469E89 |. 8D45 CDLEA EAX,DWORD PTR SS:[EBP-33]
00469E8C |. 8B55 F4MOV EDX,DWORD PTR SS:[EBP-C]
00469E8F |. E8 1CF0F9FF CALL unpacked.00408EB0
00469E94 |. BB DE040000 MOV EBX,4DE
。。。。。。这里略去的就是一段对上面那个串的计算
00469EE9 |> 8BC3 MOV EAX,EBX ;验证的最后了,ebx出来的是计算的结果
00469EEB |. B9 10270000 MOV ECX,2710
00469EF0 |. 99 CDQ
00469EF1 |. F7F9 IDIV ECX;ebx模10000
00469EF3 |. 8BDA MOV EBX,EDX
00469EF5 |. 81FB E8030000 CMP EBX,3E8
00469EFB |. 7D 06 JGE SHORT unpacked.00469F03
00469EFD |. 81C3 70170000 ADD EBX,1770
00469F03 |> 3B5D F0CMP EBX,DWORD PTR SS:[EBP-10] ;注意到这里就是前面存放的注册码的前四位;好了关键的比较,至于注册码很明显了把!
00469F06 |. 74 0C JE SHORT unpacked.00469F14
---------------
好了,断点就下在00469F03
边锋断点分析:
由于以上分析比较详细,这里忽略,只指出关键call了!
继续往下面寻找可以发现:
:0046A228 3B5DF0 cmp ebx, dword ptr [ebp-10] ;关键比较,在这里下断点
:0046A22B 740Cje 0046A239 ;相等或为零则跳转
* Possible StringData Ref from Code Obj ->"注册码错误!!如您没有注册,不必输入也可以直接进?
->"胗蜗?但功能受限.."
|
:0046A22D B838A34600 mov eax, 0046A338
:0046A232 E8897DFCFF call 00431FC0
:0046A237 EB74jmp 0046A2AD
---------------
好了断点就下在0046A228
4 用Ollydbg装入脱壳以后的软件,按Ctrl+G,并填入00469F03,按F2下断点!
5 按F9运行软件,分别填入
联众
用户ID:xbc
注册码:98989898
6 按确定以后,右下角在98989898出现9898,这时我们注意左上角处的字样:
Stack SS:[0012EAA0]=000026aa
EBX=000019C5
用右键点击修改寄存器内容你会发现[0012EAA0]=000026aa的值为9898而EBX=000019C5的值为6597。
开始我也不明白,原来是拦截后。EBX值转为十进制就可以了,并将转换后的数填入前四位;破解成功!
7 换断点:0046A228
边锋
用户ID:xbc
注册码:989898989
重复4~6,破解成功!
8 整理一下
联众
用户ID:xbc
注册码:65979898
边锋
用户ID:xbc
注册码:884728989