软件名称: 通用电脑语音系统(V-2000版)
下载地址: http://www.newhua.com.cn
此文目的: 如何获得该软件的注册码
调试工具: SoftICE4.05、W32dsm89.exe
调试平台: Win2K
作者: chn-boy
写作日期: 2000-12-02
运行程序,进入软件注册对话框,输入Virtual Code,我输入的是:
软件编号: 573445893. <-- 此编号为程序固有,不能改动。
输入注册码:32194866
CTRL+D启用SoftICE4.05,下中断bpx MessageBoxExA,当出错对话框弹出时,
程序会被拦断,bc *去掉MessageBoxExA中断,按F12回到程序领空,接下来就
是我们艰苦的破解历程。
往上察看程序代码,看看有没有可疑的跳转?如果有,那么在该处下中断
后重新再来一次注册。这是一般常识了。。:)(啊,谁又拿臭鸡蛋扔我?)。
我仔细看了一下,好像没有什么可疑的跳转处,那么我们就按F12回到上一级
Call(为什么?因为在这个Call里出现的错误对话框嘛),再往上看看有没有
可疑之处?就这样一路按F12,忽然发现指标不再进入程序领空,一通狂按F12
后,程序就退回到Windows了,是不是出错了?嘿嘿,不要急嘛,其实程序并没
有完全退出来,SoftICE仍然纪录着信息,只不过在一个Call中循回运行罢了,
再次点击注册,在密码框中输入32194866,然后点击注册,看看,哈,SoftICE
出来了(so beautiful)。F12进入程序领空,在进入领空处下个中断,以后会
用到,得到的程序代码段为:
:00405511 C745FC00000000 mov [ebp-04], 00000000
:00405518 8D4D8C
lea ecx, dword ptr [ebp-74]
:0040551B E840F30000 Call 00414860
:00405520 8D45EC
lea eax, dword ptr [ebp-14] <-- 进入领空处
:00405523 50
push eax <-- 断点下在该处,此时要是
<-- d *eax,你可以看到你输
<-- 入的Virtual Code
:00405524 8D4DF0
lea ecx, dword ptr [ebp-10]
:00405527 E80EF50000 Call 00414A3A
:0040552C C645FC01 mov
[ebp-04], 01
:00405530 8D8D28FEFFFF lea ecx, dword
ptr [ebp+FFFFFE28]
:00405536 51
push ecx
:00405537 8B8D14FEFFFF mov ecx, dword
ptr [ebp+FFFFFE14]
:0040553D E807FEFFFF call 00405349
<-- 这个Call里面就是
<-- 注册码的算法,我
<-- 将在下面给出分析
:00405542 898510FEFFFF mov dword ptr
[ebp+FFFFFE10], eax
:00405548 8B9510FEFFFF mov edx, dword
ptr [ebp+FFFFFE10]
:0040554E 89950CFEFFFF mov dword ptr
[ebp+FFFFFE0C], edx
:00405554 C645FC02 mov
[ebp-04], 02
:00405558 8B850CFEFFFF mov eax, dword
ptr [ebp+FFFFFE0C]
:0040555E 50
push eax
:0040555F 8D4DF0
lea ecx, dword ptr [ebp-10]
:00405562 51
push ecx
:00405563 E8380E0000 call 004063A0
<-- 当程序运行到此处时,
<-- d *ecx,你可以看到
<-- 你输入的Virtual Code
<-- d *eax,你就能看到
<-- 正确的密码了。:)
:00405568 25FF000000 and eax,
000000FF
:0040556D 85C0
test eax, eax
:0040556F 755C
jne 004055CD
:00405571 8D9520FEFFFF lea edx, dword
ptr [ebp+FFFFFE20]
:00405577 52
push edx
【算法分析】
整个算法是这样:先将你的软件编号(比如我的是573445893.)中每个字符值
*1000,和累加,再加上100000(0x186A0)。得到的值取补——C语言的实现就是
name_number = ~name_number + 1; 取补后的值减去0x00D9C8FD,得到的name_number
是个负数,我的是:-14898765(0xFF1CA9B3),并将其转换成字符串'-14898765'。
然后将第0个字符和第3个字符交换,第2个字符和第5个字符交换,得到一个新的字符
串'818-94765',这就是正确的注册码。
算法的实现参看前面所写的注册机。
- 标 题:通用电脑语音系统(V-2000版)注册码分析
- 作 者:chn-boy
- 时 间:2000-12-2 23:10:26
- 链 接:http://bbs.pediy.com