• 标 题:PUZZLER1.20破解过程 (4千字)
  • 作 者:波导终结者
  • 时 间:2002-1-26 1:17:41
  • 链 接:http://bbs.pediy.com

PUZZLER1.20,这个东西,朋友借我的光盘里找到的。我比较喜欢玩魔方,但我的那个魔方丢了,现在可以在电脑上玩,呵呵。
安装完后,发现这个东西确实不错,不仅有传统的魔方,还有好多变种,不过一点,它就跳出来说,要注册才能用。
工具:TRW,W32DASM
点ABOUT,点REGIST,跳出一个窗口,叫你输用户名,输入“波导终结者”,点OK,再跳出来一个
窗口,叫你输注册码,注册码不正确没有提示。用户名和注册码分两个窗口输,这种形式,我还
是第一次见到。不要紧,我们用W32DASM反汇译PUZZLER.EXE,查找REGIST,第一次,找到弹出来
说不注册不能用的窗口,我们要的不是暴破,再找一次,找到下面。
:0040D39E 68A06B4100              push 00416BA0
:0040D3A3 8BCD                    mov ecx, ebp
* Reference To: UFC.??4CUString@@QAEAAV0@PBD@Z, Ord:0044h
                                  |
:0041902A FF1538C34100            Call dword ptr [0041C338]
:00419030 8B5C2448                mov ebx, dword ptr [esp+48]
:00419034 85DB                    test ebx, ebx
:00419036 741C                    je 00419054
:00419038 8BCE                    mov ecx, esi

* Reference To: UFC.?AddUpASCII@CUString@@QAEKXZ, Ord:00D3h
                                  |
:0041903A FF154CC34100            Call dword ptr [0041C34C]
:00419040 8BC8                    mov ecx, eax
:00419042 C1E108                  shl ecx, 08
:00419045 03C8                    add ecx, eax
:00419047 8D14C8                  lea edx, dword ptr [eax+8*ecx]
:0041904A 8D0450                  lea eax, dword ptr [eax+2*edx]
:0041904D 8D0440                  lea eax, dword ptr [eax+2*eax]
:00419050 3BD8                    cmp ebx, eax
:00419052 740D                    je 00419061
④这里又是最近的一个跳转,看看cmp ebx, eax,很可能就是比较。在这里下断,d eax,看见数值FF950188,再看ebx,是3B1AE。把用户名和假注册码都换掉,再看eax 和ebx的数值,都发生了变化!把用户名和注册码都换成1,看见eax为一个大数(我没记下来,歹势),看见ebx为1。再把用户名和注册码换为2,看见eax变化了,ebx为2。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00419036(C)
|
:00419054 6828474200              push 00424728
:00419059 8BCE                    mov ecx, esi

* Reference To: UFC.??4CUString@@QAEAAV0@PAD@Z, Ord:0043h
                                  |
:0041905B FF156CC34100            Call dword ptr [0041C36C]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00419052(C)
|
:00419061 8BCE                    mov ecx, esi

* Reference To: UFC.?GetLength@CUString@@QBEHXZ, Ord:012Ch
                                  |
:00419063 FF1584C34100            Call dword ptr [0041C384]
:00419069 85C0                    test eax, eax
:0041906B 7419                    je 00419086     
③于是在这个地方下断点,走到这里,看看寄存器内容,有一些数值,可能是注册码和用户名的变形,记下来。r fl z,之后,看看变化,软件主界面已经变成了“This copy of Puzzler is registered to:”但是,我们的用户名呢?再进入游戏,还是不能玩。把输的假用户名和注册码都换掉,看看这里寄存器的数值,还都一样!由此可见,这个跳转,只是把用户名赋给这个字串后面,但是为什么看不见用户名呢?很可能是注册码不正确,用户名根本没带到这个地方,于是,我们再向上看。
:0041906D 8B0E                    mov ecx, dword ptr [esi]
:0041906F 81C78C010000            add edi, 0000018C
:00419075 51                      push ecx

* Possible StringData Ref from Data Obj ->"This copy of Puzzler is registered "
                                        ->"to:

%s"
②这一行意思就是说,这个软件已经注册给了XXX,由此往上看,上面的那个跳转很可能就是比较注册码。
                                  |
:00419076 68303D4200              push 00423D30
:0041907B 57                      push edi

* Reference To: MFC42.Ordinal:0B02, Ord:0B02h
                                  |
:0041907C E867030000              Call 004193E8
:00419081 83C40C                  add esp, 0000000C
:00419084 EB14                    jmp 0041909A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041906B(C)
|
:00419086 81C78C010000            add edi, 0000018C

* Possible StringData Ref from Data Obj ->"Thank you for trying Puzzler!

Press "
                                        ->"F1 for help at any time"
①如果没注册的话是显示这行内容,而注册后则显示处内容。
                                  |
:0041908C 68F03C4200              push 00423CF0
:00419091 57                      push edi
⑤由此可见,程序在0041903A Call dword ptr [0041C34C]一行,把注册名通过一系列运算,得到一个值,放到00419050  cmp ebx, eax的eax里,ebx为注册的十六进制数值,进行比较。我们在00419050  cmp ebx一行,d eax,把数值记下来,换成十进制数,当做注册码输入,注册成功!
波导终结者[BCG][CNCG]

  • 标 题:它的注册码计算过程是这样的... (454字)
  • 作 者:Easycode
  • 时 间:2002-1-26 1:39:59

首先将你输入的注册名的各个字符的ASC码值累加起来,得到一个数值,这里设其为SUM,然后用
如下的公式:

SUM1 = SUM + SUM * 256 ;
SUM2 = SUM + SUM1 * 8  ;
SUM3 = SUM + SUM2 * 2  ;
SUM4 = SUM3 * 3

SUM4即为十六进制的注册码
该软件支持中文注册名,想编注册机的朋友请参考以下如何处理中文ASC码值的代码(delphi):

if  ord( Edit1.text [ i ] ) > 128 then
    j := j + ( ord ( Edit1.text [ i ] + $FFFFFF00)
else
    j := j + (ord ( Edit1.text [ i ] );