老文章档案 · 2003 年

Assistant破解笔记

天下资讯 · 破解文章 · 2003-09-18 · 作者:辉仔Yock[DFCG] 人气: · 出处:赢政天下整理收藏

【下载页面】:http://www.wbj2000.com/

【软件大小】:364 KB

【应用平台】:WIN9X/WINNT/WIN2K/WINXP

【软件限制】:30天试用期!

【作者声明】:本人发表这篇文章只是为了学习!!!请不用于商业用途或是将本文方法制作的注册机任意传播,读者看了文章后所做的事情与我无关,我也不会负责,请读者看了文章后三思而后行!最后希望大家在经济基础好的时候,支持共享软件!

【破解工具】:TRW2K w32Dasm PEiD

—————————————————————————————————

【过 程】:

PEiD侦察出主程序Assistant.exe没有加壳!

用w32Dasm反汇编后,查找参考字串很快就找到关键!

运行主程序Assistant.exe-->提示注册-->输入用户名(用户名要大于5位)Yock[DFCG]-->注册码48484848

启动TRW2K动态跟踪!ctrl+n呼出-->下断点bpx 41BD29-->F5返回-->点注册来到下面!

:0041BD29 FFD5 call ebp \\取得用户名的长度!

:0041BD2B 8B4E14 mov ecx, dword ptr [esi+14]

:0041BD2E 53 push ebx

:0041BD2F 6A10 push 00000010

:0041BD31 6A0D push 0000000D

:0041BD33 682C040000 push 0000042C

:0041BD38 51 push ecx

:0041BD39 FFD5 call ebp \\取得注册码的长度!

:0041BD3B 8BBC2418010000 mov edi, dword ptr [esp+00000118]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041BCF9(C)

|

:0041BD42 8D9E80010000 lea ebx, dword ptr [esi+00000180]

:0041BD48 53 push ebx \\DEBX可以看到我输入的注册码!

:0041BD49 E81F0F0000 call 0041CC6D \\不算太重要,我个人觉得完全是多余的!

:0041BD4E 8B150C8A4200 mov edx, dword ptr [00428A0C]

:0041BD54 8DAE80000000 lea ebp, dword ptr [esi+00000080]

:0041BD5A 53 push ebx \\DEBP可以看见我输入的用户名!

:0041BD5B 55 push ebp

:0041BD5C 6A08 push 00000008

:0041BD5E 52 push edx

:0041BD5F E80CEAFFFF call 0041A770 \\关键CALL,F8追进去!!!

:0041BD64 A38C2E4300 mov dword ptr [00432E8C], eax

:0041BD69 8B4E18 mov ecx, dword ptr [esi+18]

:0041BD6C 83C414 add esp, 00000014

:0041BD6F 83F903 cmp ecx, 00000003

:0041BD72 7525 jne 0041BD99 \\跳向成功处!

:0041BD74 85C0 test eax, eax

:0041BD76 7525 jne 0041BD9D \\跳向成功处!不跳就死得好惨!

:0041BD78 50 push eax

* Possible StringData Ref from Data Obj ->"用户注册"

|

:0041BD79 68BC194300 push 004319BC

* Possible StringData Ref from Data Obj ->"注册码错误!请重新输入!"

|

:0041BD7E 68A0194300 push 004319A0

:0041BD83 57 push edi

* Reference To: USER32.MessageBoxA, Ord:01BEh

|

:0041BD84 FF15FC724200 Call dword ptr [004272FC] \\不知道这个CALL有什么用的话,就自己去刨书!

------------------------------------------------------------------

上面0041BD5F的CALL来到这里!!这里可是关键哦!

* Referenced by a CALL at Addresses:

|:0041AAA7 , :0041BD5F

|

:0041A770 81EC00020000 sub esp, 00000200

:0041A776 B940000000 mov ecx, 00000040

:0041A77B 33C0 xor eax, eax

:0041A77D 53 push ebx

:0041A77E 56 push esi

:0041A77F 57 push edi

:0041A780 8D7C240C lea edi, dword ptr [esp+0C]

:0041A784 F3 repz

:0041A785 AB stosd

:0041A786 8B842414020000 mov eax, dword ptr [esp+00000214]\\我输入注册码的位数!

\\下面是比较注册码位数!

\\如果注册码等于6、8、10、12、14、16位

\\就跳到0041A7AB

\\如果不是的话就跳到0041A7B0

:0041A78D 83F806 cmp eax, 00000006

:0041A790 7419 je 0041A7AB

:0041A792 83F808 cmp eax, 00000008

:0041A795 7414 je 0041A7AB

:0041A797 83F80A cmp eax, 0000000A

:0041A79A 740F je 0041A7AB

:0041A79C 83F80C cmp eax, 0000000C

:0041A79F 740A je 0041A7AB

:0041A7A1 83F80E cmp eax, 0000000E

:0041A7A4 7405 je 0041A7AB

:0041A7A6 83F810 cmp eax, 00000010

:0041A7A9 7505 jne 0041A7B0

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:

|:0041A790(C), :0041A795(C), :0041A79A(C), :0041A79F(C), :0041A7A4(C)

|

:0041A7AB A3C0AF4300 mov dword ptr [0043AFC0], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041A7A9(C)

|

:0041A7B0 8BBC2418020000 mov edi, dword ptr [esp+00000218]

:0041A7B7 83C9FF or ecx, FFFFFFFF

:0041A7BA 33C0 xor eax, eax

:0041A7BC 8D54240C lea edx, dword ptr [esp+0C]

:0041A7C0 F2 repnz

:0041A7C1 AE scasb

:0041A7C2 F7D1 not ecx

:0041A7C4 2BF9 sub edi, ecx

:0041A7C6 8BC1 mov eax, ecx

:0041A7C8 8BF7 mov esi, edi

:0041A7CA 8BFA mov edi, edx

:0041A7CC C1E902 shr ecx, 02

:0041A7CF F3 repz

:0041A7D0 A5 movsd

:0041A7D1 8BC8 mov ecx, eax

:0041A7D3 8B842410020000 mov eax, dword ptr [esp+00000210]

:0041A7DA 83E103 and ecx, 00000003

:0041A7DD 85C0 test eax, eax

:0041A7DF F3 repz \\假如注册码不大于6位,就死在这里!但我不知道为什么!!!

:0041A7E0 A4 movsb

:0041A7E1 7405 je 0041A7E8

:0041A7E3 A3C8AF4300 mov dword ptr [0043AFC8], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041A7E1(C)

|

:0041A7E8 8D4C240C lea ecx, dword ptr [esp+0C]

:0041A7EC 51 push ecx \\DECX可以看见用户名!

:0041A7ED E8DEF9FFFF call 0041A1D0 \\注册码A是怎么样炼成的,F8追!

:0041A7F2 68F84CBA01 push 01BA4CF8

:0041A7F7 8D942414010000 lea edx, dword ptr [esp+00000114]

* Possible StringData Ref from Data Obj ->"%lu"

|

:0041A7FE 68C8194300 push 004319C8 \\D 4319C8可以看见一些数字!

\\我看见的是3397255503

:0041A803 52 push edx

* Reference To: USER32.wsprintfA, Ord:02ACh

|

:0041A804 FF15F8714200 Call dword ptr [004271F8] \\这个CALL是生成注册码B

:0041A80A 8BBC242C020000 mov edi, dword ptr [esp+0000022C]\\DEDI可以看见我输入的注册码!

:0041A811 83C410 add esp, 00000010

:0041A814 8BF7 mov esi, edi \\EDI=ESI

:0041A816 8D4C240C lea ecx, dword ptr [esp+0C] \\DECX可以看见真注册码A!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041A83C(C) \\从这里开始到0041A83C是比较真假注册码每一位的ASCII码是否相等,不等就跳下去再比较!

|

:0041A81A 8A01 mov al, byte ptr [ecx]

:0041A81C 8A1E mov bl, byte ptr [esi]

:0041A81E 8AD0 mov dl, al

:0041A820 3AC3 cmp al, bl

:0041A822 751E jne 0041A842

:0041A824 84D2 test dl, dl

:0041A826 7416 je 0041A83E

:0041A828 8A4101 mov al, byte ptr [ecx+01]

:0041A82B 8A5E01 mov bl, byte ptr [esi+01]

:0041A82E 8AD0 mov dl, al

:0041A830 3AC3 cmp al, bl

:0041A832 750E jne 0041A842

:0041A834 83C102 add ecx, 00000002

:0041A837 83C602 add esi, 00000002

:0041A83A 84D2 test dl, dl

:0041A83C 75DC jne 0041A81A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041A826(C)

|

:0041A83E 33C9 xor ecx, ecx

:0041A840 EB05 jmp 0041A847

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:

|:0041A822(C), :0041A832(C)

|

:0041A842 1BC9 sbb ecx, ecx

:0041A844 83D9FF sbb ecx, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041A840(U)

|

:0041A847 85C9 test ecx, ecx

:0041A849 7446 je 0041A891

:0041A84B 8DB4240C010000 lea esi, dword ptr [esp+0000010C]\\DESI可以看见真的注册码B

:0041A852 8BC7 mov eax, edi \\这里是我输入的注册码!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041A876(C) \\从这里开始到0041A876是比较真假注册码每一位的ASCII码是否相等!

|

:0041A854 8A10 mov dl, byte ptr [eax]

:0041A856 8A1E mov bl, byte ptr [esi]

:0041A858 8ACA mov cl, dl

:0041A85A 3AD3 cmp dl, bl

:0041A85C 751E jne 0041A87C

:0041A85E 84C9 test cl, cl

:0041A860 7416 je 0041A878

:0041A862 8A5001 mov dl, byte ptr [eax+01]

:0041A865 8A5E01 mov bl, byte ptr [esi+01]

:0041A868 8ACA mov cl, dl

:0041A86A 3AD3 cmp dl, bl

:0041A86C 750E jne 0041A87C

:0041A86E 83C002 add eax, 00000002

:0041A871 83C602 add esi, 00000002

:0041A874 84C9 test cl, cl \\是否取完

:0041A876 75DC jne 0041A854 \\没有取完就跳回去!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041A860(C)

|

:0041A878 33C0 xor eax, eax

:0041A87A EB05 jmp 0041A881

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:

|:0041A85C(C), :0041A86C(C)

|

:0041A87C 1BC0 sbb eax, eax

:0041A87E 83D8FF sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041A87A(U)

|

:0041A881 85C0 test eax, eax

:0041A883 740C je 0041A891

:0041A885 5F pop edi

:0041A886 5E pop esi

:0041A887 33C0 xor eax, eax \\清零

:0041A889 5B pop ebx

:0041A88A 81C400020000 add esp, 00000200

:0041A890 C3 ret \\返回

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:

|:0041A849(C), :0041A883(C)

|

:0041A891 5F pop edi

:0041A892 5E pop esi

:0041A893 B801000000 mov eax, 00000001 \\赋值

:0041A898 5B pop ebx

:0041A899 81C400020000 add esp, 00000200

:0041A89F C3 ret \\返回

------------------------------------------------------------------

上面0041A7ED的CALL来到这里!注册码的生成和比较都再这里!关键!!!!!

* Referenced by a CALL at Addresses:

|:0041A575 , :0041A7ED

|

:0041A1D0 53 push ebx

:0041A1D1 56 push esi

:0041A1D2 57 push edi

:0041A1D3 8B7C2410 mov edi, dword ptr [esp+10] \\DEDI看见我输入的注册码!

:0041A1D7 32DB xor bl, bl

:0041A1D9 8BCF mov ecx, edi \\ECX=EDI

:0041A1DB 8A07 mov al, byte ptr [edi] \\我输入注册码的第一位数的ASCII码入EAX低位!

:0041A1DD 84C0 test al, al \\是否为空!

:0041A1DF 740A je 0041A1EB \\为空的话就跳走!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041A1E9(C) \\从这里到0041A1E9是把我输入注册码的ASCII码加再一起放进EBX低位!

|

:0041A1E1 02D8 add bl, al

:0041A1E3 8A4101 mov al, byte ptr [ecx+01]

:0041A1E6 41 inc ecx \\计数器

:0041A1E7 84C0 test al, al

:0041A1E9 75F6 jne 0041A1E1 \\循环!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041A1DF(C)

|

:0041A1EB A1C8AF4300 mov eax, dword ptr [0043AFC8]

:0041A1F0 33F6 xor esi, esi

:0041A1F2 A3D8AF4300 mov dword ptr [0043AFD8], eax

:0041A1F7 A1C0AF4300 mov eax, dword ptr [0043AFC0]

:0041A1FC 85C0 test eax, eax

:0041A1FE 7E2D jle 0041A22D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041A22B(C) \\从这里开始到0041A22B就把用户名的ASCII码循环计算出正确注册码的!

\\你把内存区的地址指向6AF20C就可以看见注册码的变化了!

|

:0041A200 8A0C3E mov cl, byte ptr [esi+edi]

:0041A203 32CB xor cl, bl

:0041A205 51 push ecx

:0041A206 E895FFFFFF call 0041A1A0 \\这个是运算CALL,F8追进去!

:0041A20B 83C404 add esp, 00000004

:0041A20E 88043E mov byte ptr [esi+edi], al

:0041A211 3C0A cmp al, 0A

:0041A213 0FBEC0 movsx eax, al

:0041A216 7D05 jge 0041A21D

:0041A218 83C030 add eax, 00000030

:0041A21B EB03 jmp 0041A220

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041A216(C)

|

:0041A21D 83C041 add eax, 00000041

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041A21B(U)

|

:0041A220 88043E mov byte ptr [esi+edi], al

:0041A223 A1C0AF4300 mov eax, dword ptr [0043AFC0]

:0041A228 46 inc esi \\计数器!

:0041A229 3BF0 cmp esi, eax \\比较用户名是否取完!

:0041A22B 7CD3 jl 0041A200 \\没有就跳回去!

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:0041A1FE(C)

|

:0041A22D C6043800 mov byte ptr [eax+edi], 00

:0041A231 5F pop edi

:0041A232 5E pop esi

:0041A233 5B pop ebx

:0041A234 C3 ret

------------------------------------------------------------------

上面0041A206的CALL来到这里!

* Referenced by a CALL at Address:

|:0041A206

|

:0041A1A0 0FBE442404 movsx eax, byte ptr [esp+04]

:0041A1A5 0305D8AF4300 add eax, dword ptr [0043AFD8]

:0041A1AB 69C0697DAE42 imul eax, 42AE7D69

:0041A1B1 0531D40000 add eax, 0000D431

:0041A1B6 A3D8AF4300 mov dword ptr [0043AFD8], eax

:0041A1BB C1F810 sar eax, 10

:0041A1BE 83E00F and eax, 0000000F

:0041A1C1 C3 ret

------------------------------------------------------------------

注册码A的内存注册机:

中断地址:0041A81A

中断次数:1

第一字节:BA

字节长度:2

注册码:内存方式-->寄存器ECX

注册码B的内存注册机:

中断地址:0041A852

中断次数:1

第一字节:8B

字节长度:2

注册码:内存方式-->寄存器ESI

------------------------------------------------------------------

【总 结】:

这个程序一共有两个注册码!

分别是注册码A和注册码B

注册码A是根据用户名注册的!(注册的用户名要大于5位)

注册码B是一机一码!用户名随便!(注册的用户名要大于5位)

一组可以用的注册码:

用户名:Yock[DFCG]

注册码:63532K04

-------------------------------------------------------------------

算法:(大家觉得是不是很熟悉啊?!)

我语文水平差,表达得不要请您帮我补充!谢谢!

把我输入注册码的ASCII码相加结果的最后两位!(假如注册码的ASCII码的和是123,那么最后两位是23)

再把注册码的每一位数的ASCII码XOR后的结果就到下面了!

(这里不知道怎么用文字表达,所以大家看汇编指令吧!这里要多谢师傅兔子,我也是看了它的文章才会这么表达的!)

:0041A1A0 0FBE442404 movsx eax, byte ptr [esp+04]

:0041A1A5 0305D8AF4300 add eax, dword ptr [0043AFD8]

:0041A1AB 69C0697DAE42 imul eax, 42AE7D69

:0041A1B1 0531D40000 add eax, 0000D431

:0041A1B6 A3D8AF4300 mov dword ptr [0043AFD8], eax

:0041A1BB C1F810 sar eax, 10

:0041A1BE 83E00F and eax, 0000000F

:0041A1C1 C3 ret

最后的结果保存在EDI

我个人觉得可以用keymake做一个算法注册机,可惜我不会!555555

哪个大哥会的话可以做一个,做好后如果方便的话可以把怎么做的过程给我看看吗??期待...

最后在这里真心感谢你花了那么多时间看这篇文章!谢谢了...

2003.05.17凌晨于清远

相关资讯:

·Tornado2之Licence暴力破解

·万能五笔2001注册码分析及暴力破解

·万能五笔2001注册码分析及暴力破解

·万能五笔2001注册码分析及暴力破解 ---可怜的思考者 (27千字)

·一个拨号软件的Win32Dasm暴力破解法

·CuteFTP V4.2.4之暴力破解

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)|

广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright (C) 1998-2004 winzheng.com All Rights Reserved.

特别感谢 蓝芒科技 提供下载站及论坛服务器

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。

档案馆里的相关老软件

🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史