eXeScope V6.41 的注册算法破解
【软件名称】:eXeScope V6.41
【软件语言】:英文
【应用平台】:Win9x/NT/2000/XP
【难 度】:简单,献给像我等这样的菜鸟学习
【破解工具】TRW2000 1.23,winDasm V8.93汉化版(写教程用)
【软件介绍】:
功能强大的软件资源分析工具(地球人都知道),升到了6.41版了。
近来闲来无事,就分析了这个软件的算法,启动TRW2000,点击帮助/注册,输入:
用户名:小虾
假 码:7878787878 ←必须输够十位,等下就知道。
按快捷键:Ctrl+N弹出TRW2000调试界面。输入万能断点:Hmemcpy,按F5键返回,点击注册按钮,被TRW拦到,来到以下地方:
:004C2170 8B1528EE4C00 mov edx, dword ptr [004CEE28]
:004C2176 8B12 mov edx, dword ptr [edx] ←EDX为你输入的注册码
:004C2178 A130EC4C00 mov eax, dword ptr [004CEC30]
:004C217D 8B00 mov eax, dword ptr [eax]
:004C217F E82C8F0000 call 004CB0B0 ←关键Call,按F8进入
:004C2184 84C0 test al, al ←测试al值是否为1
:004C2186 0F848D000000 je 004C2219 ←经典跳转,跳就死,暴力破解的话将这里NOP就行了。
:004C218C A1C4EE4C00 mov eax, dword ptr [004CEEC4]
:004C2191 8B00 mov eax, dword ptr [eax]
:004C2193 E8B82AF4FF call 00404C50
:004C2198 85C0 test eax, eax
:004C219A 7E7D jle 004C2219
:004C219C 8D55F0 lea edx, dword ptr [ebp-10]
:004C219F A1D8EE4C00 mov eax, dword ptr [004CEED8]
:004C21A4 8B00 mov eax, dword ptr [eax]
:004C21A6 E8B904FDFF call 00492664
:004C21AB 8B45F0 mov eax, dword ptr [ebp-10]
:004C21AE 8D4DF4 lea ecx, dword ptr [ebp-0C]
* Possible StringData Ref from Code Obj ->".ini"
|
:004C21B1 BA78224C00 mov edx, 004C2278
:004C21B6 E85D79F4FF call 00409B18
:004C21BB 8B4DF4 mov ecx, dword ptr [ebp-0C]
:004C21BE B201 mov dl, 01
:004C21C0 A124BE4300 mov eax, dword ptr [0043BE24]
:004C21C5 E80A9DF7FF call 0043BED4
:004C21CA 8BF0 mov esi, eax
:004C21CC A1C4EE4C00 mov eax, dword ptr [004CEEC4]
:004C21D1 8B00 mov eax, dword ptr [eax]
:004C21D3 50 push eax
* Possible StringData Ref from Code Obj ->"Name"
|
:004C21D4 B988224C00 mov ecx, 004C2288
* Possible StringData Ref from Code Obj ->"Reg"
|
:004C21D9 BA98224C00 mov edx, 004C2298
:004C21DE 8BC6 mov eax, esi
:004C21E0 8B38 mov edi, dword ptr [eax]
:004C21E2 FF5704 call [edi+04]
:004C21E5 A128EE4C00 mov eax, dword ptr [004CEE28]
:004C21EA 8B00 mov eax, dword ptr [eax]
:004C21EC 50 push eax
* Possible StringData Ref from Code Obj ->"Reg"
|
:004C21ED BA98224C00 mov edx, 004C2298
:004C21F2 B9A4224C00 mov ecx, 004C22A4
:004C21F7 8BC6 mov eax, esi
:004C21F9 8B38 mov edi, dword ptr [eax]
:004C21FB FF5704 call [edi+04]
:004C21FE 8BC6 mov eax, esi
:004C2200 E8DB19F4FF call 00403BE0
:004C2205 A138EC4C00 mov eax, dword ptr [004CEC38]
:004C220A C60001 mov byte ptr [eax], 01
:004C220D C7834C02000001000000 mov dword ptr [ebx+0000024C], 00000001
:004C2217 EB20 jmp 004C2239
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004C2186(C), :004C219A(C)
|
:004C2219 6A00 push 00000000 ←跳到这里你以经完了。
:004C221B 8D55EC lea edx, dword ptr [ebp-14]
* Possible StringData Ref from Code Obj ->"错误注册码或姓名!;搊榐ID傑偨偼柤慜偑柍岠偱偡"
|
:004C221E B8B0224C00 mov eax, 004C22B0
:004C2223 E8280C0000 call 004C2E50 ←出错的对话框
这里是上面按F8进的Call里面,分析算法就在这里。
:004CB0B0 55 push ebp
:004CB0B1 8BEC mov ebp, esp
:004CB0B3 51 push ecx
:004CB0B4 53 push ebx
:004CB0B5 8955FC mov dword ptr [ebp-04], edx
:004CB0B8 8B45FC mov eax, dword ptr [ebp-04]
:004CB0BB E8809DF3FF call 00404E40
:004CB0C0 33C0 xor eax, eax
:004CB0C2 55 push ebp
:004CB0C3 684FB14C00 push 004CB14F
:004CB0C8 64FF30 push dword ptr fs:[eax]
:004CB0CB 648920 mov dword ptr fs:[eax], esp
:004CB0CE 33DB xor ebx, ebx
:004CB0D0 8B45FC mov eax, dword ptr [ebp-04] ←EAX为你的假码
:004CB0D3 E8789BF3FF call 00404C50 ←取得假码的位数
:004CB0D8 83F80A cmp eax, 0000000A ←比较假码是不是十位,
:004CB0DB 755C jne 004CB139 ←不到十位或超过十位送你上西天
:004CB0DD 8B55FC mov edx, dword ptr [ebp-04]
* Possible StringData Ref from Code Obj ->"A1910"
|
:004CB0E0 B864B14C00 mov eax, 004CB164 ←EAX为A1910
:004CB0E5 E8AA9EF3FF call 00404F94 ←检查你的注册码前五位是不是A1910
:004CB0EA 48 dec eax
:004CB0EB 7410 je 004CB0FD ←是就跳到004CB0FD继续。不是就接着往下比较
:004CB0ED 8B55FC mov edx, dword ptr [ebp-04]
* Possible StringData Ref from Code Obj ->"A1423"
|
:004CB0F0 B874B14C00 mov eax, 004CB174 ←如果你的注册码前五位不是A1910就走到这里,现EAX值是A1423
:004CB0F5 E89A9EF3FF call 00404F94 ←比较注册码前五位是不是A1423
:004CB0FA 48 dec eax
:004CB0FB 753C jne 004CB139 ←不是就跳,送你上西天。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CB0EB(C)
|
:004CB0FD B802000000 mov eax, 00000002
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CB117(C)
|
:004CB102 8B55FC mov edx, dword ptr [ebp-04] ←EDX值为假码
:004CB105 8A5402FF mov dl, byte ptr [edx+eax-01] ←依次取出假码的第二位
:004CB109 80FA30 cmp dl, 30 ←比较
:004CB10C 722B jb 004CB139 ←小于30就送你上西天
:004CB10E 80FA39 cmp dl, 39 ←比较
:004CB111 7726 ja 004CB139 ←大于39就送你上西天
:004CB113 40 inc eax ←计数加1
:004CB114 83F80B cmp eax, 0000000B ←比较
:004CB117 75E9 jne 004CB102 ←EAX小于0B继续跳到上面比较下一个假码。
:004CB119 8B45FC mov eax, dword ptr [ebp-04] ←EAX为假码
:004CB11C 0FB64008 movzx eax, byte ptr [eax+08] ←取出假码的第九位数
:004CB120 8B55FC mov edx, dword ptr [ebp-04] ←EDX为假码
:004CB123 0FB65209 movzx edx, byte ptr [edx+09] ←取出假码的第十位数
:004CB127 03C2 add eax, edx ←EAX和EDX相加
:004CB129 B90A000000 mov ecx, 0000000A ←ECX值为0000000A
:004CB12E 33D2 xor edx, edx ←EDX清0
:004CB130 F7F1 div ecx ←EAX和ECX相除,整数保存在EAX中,余数保存在EDX
:004CB132 83FA04 cmp edx, 00000004 ←比较
:004CB135 7502 jne 004CB139 ←若相除的余数不相等就送你上西天。算法到这里也就结束了,以下不管它了
:004CB137 B301 mov bl, 01
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004CB0DB(C), :004CB0FB(C), :004CB10C(C), :004CB111(C), :004CB135(C)
|
:004CB139 33C0 xor eax, eax
:004CB13B 5A pop edx
:004CB13C 59 pop ecx
:004CB13D 59 pop ecx
:004CB13E 648910 mov dword ptr fs:[eax], edx
:004CB141 6856B14C00 push 004CB156
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CB154(U)
|
:004CB146 8D45FC lea eax, dword ptr [ebp-04]
:004CB149 E84298F3FF call 00404990
:004CB14E C3 ret ←返回子程序
经过以上分析,得出算法:
1、与用户名无关,
2、注册码前五位必须是:A1910和A1423
3、第二位以后的注册码必须是数字0~9
4、注册码第六位和第八位可以是任意数。
5、注册码第九位和第十位注册码也可任意输入,但他们相加再除的余数必须余4,否则注册不成功
例如:A1910XXX08或A1423XXX08就可以注册成功。
好了,有以上信息,可以写注册机了(我的编程技术太烂,注册机就让你们去写吗!呵呵~~),我也累了,分析这个软件花了几分钟,但写这个教程用了半个钟头呀。
作者:小虾
2004年5月3日