老文章档案 · 2003 年

破解心得之CHMMaker(耶書制造)篇

天下资讯 · 破解文章 · 2003-06-12 · 作者:时空幻影 人气: · 出处:嬴政天下整理收藏)

破解心得之CHMMaker(耶書制造)篇

作者:时空幻影

时间:2002年1月20日

使用工具:W32DASM汉化版黄金版、TRW2000 v1.22、UPX v1.20W

软件名称:CHMMaker(耶書制造)

软件版本:v2.87中文版

这个软件使用了UPX加壳,所以我们用UPX脱壳。然后用TRW2000载入它,随便输入几个数字后,按CTRL+N激活TRW2000,

设置断点BPX HMEMCPY,按F5回到程序,点击按钮“注册”,会被拦下,然后按F10经过几个DELPHI或者C++ BUILDER程序的

几个固定的RET后会来到如下的地方:

* Possible StringData Ref from Code Obj ->"Q2lA5rM6zI7sK8eO9aL2wP3q3pZ4mW5V5vT6gG7y9iC2bR"

->"3hF4uB8cY9fH2tN3kS6oX7nE8jDxU4dJ" <--注意这个字符串,设它为s

|

:0048EB72 BA3CF44800 mov edx, 0048F43C

:0048EB77 E8DC50F7FF call 00403C58

:0048EB7C 8D45F0 lea eax, dword ptr [ebp-10]

:0048EB7F BA94F44800 mov edx, 0048F494

:0048EB84 E8CF50F7FF call 00403C58

:0048EB89 8D45F0 lea eax, dword ptr [ebp-10]

:0048EB8C E8FFFEFFFF call 0048EA90

:0048EB91 8BD8 mov ebx, eax

:0048EB93 8BC3 mov eax, ebx

:0048EB95 E8928AF7FF call 0040762C

:0048EB9A 0FB7C0 movzx eax, ax

:0048EB9D 8BF0 mov esi, eax

:0048EB9F C1E602 shl esi, 02

:0048EBA2 0FB7C3 movzx eax, bx

:0048EBA5 8BF8 mov edi, eax

:0048EBA7 03FF add edi, edi

:0048EBA9 8D3C7F lea edi, dword ptr [edi+2*edi]

:0048EBAC 81C70D260000 add edi, 0000260D

:0048EBB2 8D95C8FEFFFF lea edx, dword ptr [ebp+FFFFFEC8]

:0048EBB8 8BC7 mov eax, edi

:0048EBBA E8419FF7FF call 00408B00

:0048EBBF FFB5C8FEFFFF push dword ptr [ebp+FFFFFEC8]

:0048EBC5 8BC3 mov eax, ebx

:0048EBC7 33D2 xor edx, edx

:0048EBC9 52 push edx

:0048EBCA 50 push eax

:0048EBCB 8D85C4FEFFFF lea eax, dword ptr [ebp+FFFFFEC4]

:0048EBD1 E85A9FF7FF call 00408B30

:0048EBD6 FFB5C4FEFFFF push dword ptr [ebp+FFFFFEC4]

:0048EBDC 8D95C0FEFFFF lea edx, dword ptr [ebp+FFFFFEC0]

:0048EBE2 8BC6 mov eax, esi

:0048EBE4 E8179FF7FF call 00408B00

:0048EBE9 FFB5C0FEFFFF push dword ptr [ebp+FFFFFEC0]

:0048EBEF 8D45F0 lea eax, dword ptr [ebp-10]

:0048EBF2 BA03000000 mov edx, 00000003

:0048EBF7 E80453F7FF call 00403F00

:0048EBFC C745D401000000 mov [ebp-2C], 00000001

:0048EC03 8D95B8FEFFFF lea edx, dword ptr [ebp+FFFFFEB8]

:0048EC09 8BC7 mov eax, edi

:0048EC0B E8F09EF7FF call 00408B00

:0048EC10 FFB5B8FEFFFF push dword ptr [ebp+FFFFFEB8]

:0048EC16 68A0F44800 push 0048F4A0

:0048EC1B 8BC3 mov eax, ebx

:0048EC1D 33D2 xor edx, edx

:0048EC1F 52 push edx

:0048EC20 50 push eax

:0048EC21 8D85B4FEFFFF lea eax, dword ptr [ebp+FFFFFEB4]

:0048EC27 E8049FF7FF call 00408B30

:0048EC2C FFB5B4FEFFFF push dword ptr [ebp+FFFFFEB4]

:0048EC32 68A0F44800 push 0048F4A0

:0048EC37 8D95B0FEFFFF lea edx, dword ptr [ebp+FFFFFEB0]

:0048EC3D 8BC6 mov eax, esi

:0048EC3F E8BC9EF7FF call 00408B00

:0048EC44 FFB5B0FEFFFF push dword ptr [ebp+FFFFFEB0]

:0048EC4A 8D85BCFEFFFF lea eax, dword ptr [ebp+FFFFFEBC]

:0048EC50 BA05000000 mov edx, 00000005

:0048EC55 E8A652F7FF call 00403F00

:0048EC5A 8B95BCFEFFFF mov edx, dword ptr [ebp+FFFFFEBC]

:0048EC60 A1E81F4900 mov eax, dword ptr [00491FE8]

:0048EC65 8B00 mov eax, dword ptr [eax]

:0048EC67 8B8098060000 mov eax, dword ptr [eax+00000698]

:0048EC6D E8CA31FAFF call 00431E3C

:0048EC72 8B45F0 mov eax, dword ptr [ebp-10] <--会停在这里

:0048EC75 E8C651F7FF call 00403E40 <--取出去掉字符"-"的机器码字符串的长度放到eax中

:0048EC7A 83F804 cmp eax, 00000004 <--长度与4进行比较

:0048EC7D 0F8C4C010000 jl 0048EDCF <--长度小于4的话跳转,一般不会跳转

:0048EC83 8945D8 mov dword ptr [ebp-28], eax

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

|:0048EDC9(C)

|

:0048EC86 8D85ACFEFFFF lea eax, dword ptr [ebp+FFFFFEAC]

:0048EC8C 50 push eax

:0048EC8D B901000000 mov ecx, 00000001

:0048EC92 8B55D8 mov edx, dword ptr [ebp-28] <--edx为偏移量

:0048EC95 8B45F0 mov eax, dword ptr [ebp-10] <--eax中为存放去掉"-"的机器码字符串的首地址

:0048EC98 E8AB53F7FF call 00404048 <--取[eax+edx]中的一个字符

:0048EC9D FFB5ACFEFFFF push dword ptr [ebp+FFFFFEAC]

:0048ECA3 8D85A8FEFFFF lea eax, dword ptr [ebp+FFFFFEA8]

:0048ECA9 50 push eax

:0048ECAA 8B55D8 mov edx, dword ptr [ebp-28] <--edx为偏移量

:0048ECAD 4A dec edx

:0048ECAE B901000000 mov ecx, 00000001

:0048ECB3 8B45F0 mov eax, dword ptr [ebp-10] <--eax中为存放去掉"-"的机器码字符串

:0048ECB6 E88D53F7FF call 00404048 <--取[eax+edx]中的一个字符

:0048ECBB FFB5A8FEFFFF push dword ptr [ebp+FFFFFEA8]

:0048ECC1 8D85A4FEFFFF lea eax, dword ptr [ebp+FFFFFEA4]

:0048ECC7 50 push eax

:0048ECC8 8B55D8 mov edx, dword ptr [ebp-28] <--edx为偏移量

:0048ECCB 83EA02 sub edx, 00000002

:0048ECCE B901000000 mov ecx, 00000001

:0048ECD3 8B45F0 mov eax, dword ptr [ebp-10] <--eax中为存放去掉"-"的机器码字符串

:0048ECD6 E86D53F7FF call 00404048 <--取[eax+edx]中的一个字符

:0048ECDB FFB5A4FEFFFF push dword ptr [ebp+FFFFFEA4]

:0048ECE1 8D85A0FEFFFF lea eax, dword ptr [ebp+FFFFFEA0]

:0048ECE7 50 push eax

:0048ECE8 8B55D8 mov edx, dword ptr [ebp-28] <--edx为偏移量

:0048ECEB 83EA03 sub edx, 00000003

:0048ECEE B901000000 mov ecx, 00000001

:0048ECF3 8B45F0 mov eax, dword ptr [ebp-10] <--eax中为存放去掉"-"的机器码字符串

:0048ECF6 E84D53F7FF call 00404048 <--取[eax+edx]中的一个字符

:0048ECFB FFB5A0FEFFFF push dword ptr [ebp+FFFFFEA0]

:0048ED01 8D45EC lea eax, dword ptr [ebp-14]

:0048ED04 BA04000000 mov edx, 00000004

:0048ED09 E8F251F7FF call 00403F00 <--把上面4次取的4个字符连起来

:0048ED0E 33C0 xor eax, eax

:0048ED10 55 push ebp

:0048ED11 6831ED4800 push 0048ED31

:0048ED16 64FF30 push dword ptr fs:[eax]

:0048ED19 648920 mov dword ptr fs:[eax], esp

:0048ED1C 8B45EC mov eax, dword ptr [ebp-14]

:0048ED1F E8809EF7FF call 00408BA4 <--把上面连起来的字符串转化成十六进制数

:0048ED24 8945D4 mov dword ptr [ebp-2C], eax <--这里如果用指令? eax看的话,就可看到eax中的值为上面字符串的数字表示

:0048ED27 33C0 xor eax, eax

:0048ED29 5A pop edx

:0048ED2A 59 pop ecx

:0048ED2B 59 pop ecx

:0048ED2C 648910 mov dword ptr fs:[eax], edx

:0048ED2F EB14 jmp 0048ED45 <--跳转

:0048ED31 E96E46F7FF jmp 004033A4

:0048ED36 E8C549F7FF call 00403700

:0048ED3B E982000000 jmp 0048EDC2

:0048ED40 E8BB49F7FF call 00403700

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

|:0048ED2F(U)

|

:0048ED45 8B45D4 mov eax, dword ptr [ebp-2C]

:0048ED48 B94F000000 mov ecx, 0000004F

:0048ED4D 99 cdq

:0048ED4E F7F9 idiv ecx

:0048ED50 8955D4 mov dword ptr [ebp-2C], edx <--将余数送[ebp-2c]

:0048ED53 837DD400 cmp dword ptr [ebp-2C], 00000000 <--比对余数是否为0

:0048ED57 7506 jne 0048ED5F

:0048ED59 8B45D8 mov eax, dword ptr [ebp-28]

:0048ED5C 8945D4 mov dword ptr [ebp-2C], eax

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

|:0048ED57(C)

|

:0048ED5F 8D45E8 lea eax, dword ptr [ebp-18]

:0048ED62 50 push eax

:0048ED63 B901000000 mov ecx, 00000001

:0048ED68 8B55D4 mov edx, dword ptr [ebp-2C]

:0048ED6B 8B45DC mov eax, dword ptr [ebp-24] <--eax为存放字符串s的首地址

:0048ED6E E8D552F7FF call 00404048 <--取[eax+edx]中的一个字符

:0048ED73 8B45E4 mov eax, dword ptr [ebp-1C] <--eax为正确的注册码当前的长度

:0048ED76 E8C550F7FF call 00403E40

:0048ED7B 8BC8 mov ecx, eax

:0048ED7D 85C9 test ecx, ecx

:0048ED7F 750D jne 0048ED8E

:0048ED81 8D45E4 lea eax, dword ptr [ebp-1C]

:0048ED84 8B55E8 mov edx, dword ptr [ebp-18]

:0048ED87 E8CC4EF7FF call 00403C58

:0048ED8C EB34 jmp 0048EDC2

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

|:0048ED7F(C)

|

:0048ED8E 8D4101 lea eax, dword ptr [ecx+01]

:0048ED91 B905000000 mov ecx, 00000005

:0048ED96 99 cdq

:0048ED97 F7F9 idiv ecx

:0048ED99 85D2 test edx, edx <--比对注册码当前长度是否能整除5

:0048ED9B 751A jne 0048EDB7 <--不是的话就跳转

:0048ED9D FF75E4 push [ebp-1C]

:0048EDA0 68A0F44800 push 0048F4A0

:0048EDA5 FF75E8 push [ebp-18]

:0048EDA8 8D45E4 lea eax, dword ptr [ebp-1C]

:0048EDAB BA03000000 mov edx, 00000003

:0048EDB0 E84B51F7FF call 00403F00

:0048EDB5 EB0B jmp 0048EDC2 <--往注册码中插入字符"-"

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

|:0048ED9B(C)

|

:0048EDB7 8D45E4 lea eax, dword ptr [ebp-1C]

:0048EDBA 8B55E8 mov edx, dword ptr [ebp-18]

:0048EDBD E88650F7FF call 00403E48

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

|:0048ED3B(U), :0048ED8C(U), :0048EDB5(U)

|

:0048EDC2 FF4DD8 dec [ebp-28] <--偏移量-1

:0048EDC5 837DD803 cmp dword ptr [ebp-28], 00000003

:0048EDC9 0F85B7FEFFFF jne 0048EC86

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

|:0048EC7D(C)

|

:0048EDCF 8D45E0 lea eax, dword ptr [ebp-20]

:0048EDD2 8B55E4 mov edx, dword ptr [ebp-1C] <--在这里下指令d edx就可看到正确的注册码了

:0048EDD5 E87E4EF7FF call 00403C58

:0048EDDA 8D45D0 lea eax, dword ptr [ebp-30]

:0048EDDD 50 push eax

至此,我们对该软件的注册算法进行了比较完整的分析,下面我来总结一下注册算法:

我的机器码为"240927-1009227395-61596",软件先对该字符串作处理——去掉该字符串中的两个"-",得到字符串"240927100922739561596",

第一次依次从最后取4个字符"6"、"9"、"5"、"1",然后把它们连起来,再转化为十六进制数,接着把该十六进制数对0x4F进行求模,把求得的结果

作为偏移量,取出字符串s中处于该偏移量位置的字符,从而得到正确的注册码的第一个字符;然后第二次从倒数第二个字符开始取4个字符"9"、"5"、

"1"、"9",重复上面的步骤……直到取完最后4个字符。最后注册码中偏移量为5的倍数的位置插入字符"-"就可得到正确的注册码了.

现在剩下的事就是写注册机了。

(出处:嬴政天下整理收藏)

相关资讯:

·ASProtect的加密算法初步分析

·MD5算法研究

·Active Ebook Compiler的注册算法

·语音界面2.0算法分析及注册机源码!

·简单算法——小护士 V1.2

·侠客系统修改器1.21破解手记--算法分析

·中文拨号上网计时计费器 V4.12注册算法分析

·加密算法之RSA算法

·加密算法之DES算法

·加密算法之ElGamal算法

相关软件:

·胜新出纳-支票打印软件 V4.0X 的注册码算法

·胜新现代办公百宝箱 V5.01 的注册码算法

·胜新信函宝典-信封打印软件 V2.02 注册码的算法

·胜新通用企业计划管理系统的注册码算法

·共享软件加密算法库 V3.2

·操作系统内存分配银行家算法模拟系统 XP

→ 特别推荐

→ 热点TOP10

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

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright ? 1998-2003 winzheng.com

All Rights Reserved.

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

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

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

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