************************************************************************
**
The Tutorial For QuickCHM ver 2.01 By LostInUnASM 2003.3.6
**
************************************************************************
宣告:
今天想用QuickCHM把以前蒐集的材料整理一下,才發現由於沒有註冊,不能編輯和編譯大於15個節點的專案 :(於是決定自己動手豐衣足食
在這裡先向吳新兵老兄陪個不是:呵呵,大哥你也喜歡用DELPHI寫程式,小弟也一樣,有空可以交流經驗
這個QuickCHM的版本好象不是最新的吧,不知道你有何新的研究成果
程式:QuickChM
2.01
型別:Delphi Aspack
工具:W32Dasm、ProDump、Dede、TRW2000 //高手完全可以不用那麼多吧
分析:先用PRODUMP脫殼,再用W32DASM反彙編,結合DEDE可以找到具體比較註冊碼的關鍵地方是
:004F246D 8B4334
mov eax, dword ptr [ebx+34]
:004F2470 8B55F8
mov edx, dword ptr [ebp-08]
:004F2473 E83429F1FF call
00404DAC ==》這裡是具體比較的CALL LstrCmp Call
:004F2478 0F85BA000000
jne 004F2538 ==》在這裡修改就可以暴力破解了
:P
不過只要你重新啟動程式,依然會出現UnRegister的字樣,SO繼續跟蹤程式啟動時呼叫了哪些過程
發現:
* Possible StringData Ref from Code Obj ->"F0E1"
==》注意:這是一個很有用的字串
|
:004EDC9D
BAB8E04E00 mov edx, 004EE0B8
:004EDCA2 8BC7
mov eax, edi
:004EDCA4 E8DBABFFFF
call 004E8884 ==》這是一個特別重要的CALL哦!
:004EDCA9 8BC7
mov eax, edi
:004EDCAB E8CCAEFFFF
call 004E8B7C ==》這也很重要哦
:004EDCB0
8B4734 mov eax,
dword ptr [edi+34] ==》儲存正確的註冊碼
:004EDCB3 8B55F0
mov edx, dword ptr [ebp-10]
:004EDCB6 E8F170F1FF call
00404DAC ==》顯然這個CALL和上面那個所呼叫的過程a一樣
:004EDCBB 7532
jne 004EDCEF ==》修改這裡就可去除UnRegister的字樣了
使用者名稱: L o s
t I n U n A s m
註冊碼:64
F6 56 8C 30 3F 9D B7 17 1E A1 4A
使用TRW在004EDCB0處設端點,再按了無數個F10後,終於有所發現。
跟蹤後發現其計算規律如下:
1、首字母的ASCII值X加100 除 255得餘數X1,X1
再XOR 字串F0E1中相對應的第一個字母的ASCII值得出 數X2 再把該數轉換為16進位制就可以了。
2、把第二字母的ASCII值Y加上 X2,取得 Y1 Y1 再XOR 字串F0E1中想對應的第二個字母的ASCII值得出
數X3 再把該數轉換為16進位制就可以了。 依次類推.
EG: Name: F U C
K Key:68487498(隨便輸入)
70 85 67 75
Add 100 236 114
240
---------------------------------
170 321 181
315
Mod 255 255
255 255
---------------------------------
170 66
181 60
XOR 70
48 69 49 ====>70 48 69 49 分別為F0E1的ASCII值
---------------------------------
236 114 240
13
InttoHex EC 72 F0
0D
70 48 69 49
===》正確的註冊碼是: 64EC72F00D (不要漏了‘64’哦)
F 0 E 1
於是順利地寫出了序號產生器,用DELPHI 6.0
program
KeygenForQChm;
{$APPTYPE CONSOLE}
Uses sysutils;
Var
Name,XorStr,Key:String;
LastModResult,Mr:Integer;
StrLen,I,J,IntXor:Integer;
begin
writeln('===========================================================');
writeln('This is a Keygen For QuickCHM ver 2.01 ----By LostInUnAsm');
writeln('===========================================================');
Write('Please Enter your Name(Length>=4):');
LastModResult:=100;
XorStr:='F0E1';
J:=1;
Read(Name);
StrLen:=Length(Name);
For I:=1 to StrLen do
Begin
Mr:=(Ord(Name[i])+LastModResult)
Mod 255;
IntXor:=Mr Xor Ord(XorStr[J]);
Key:=Key+InttoHex(IntXor,2);
LastModResult:=IntXor;
If J<4
then Inc(J) Else J:=1;
End;
Writeln('Correct
Serial Is: 64',Key); //注意,每個註冊碼都是以64開頭的
Readln;
Readln;
end.
===================================忙了好幾個小時!累死我了!=============================
PS:破解完全不用拘泥於形式,如果你想簡單得到註冊碼,完全可以使用WINHEX,
用她來檢視QuickCHM的記憶體,幾秒就可以找到正確的註冊碼(好象是根據誰的理論,正確的註冊碼一定在錯誤的註冊碼附近)