• 标 题:QuickCHM2.01破解小记,欢迎大家一起交流 
  • 作 者:LostInUnAsm
  • 时 间:2003/03/09 07:15pm 
  • 链 接:http://bbs.pediy.com

************************************************************************
**      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的内存,几秒就可以找到正确的注册码(好象是根据谁的理论,正确的注册码一定在错误的注册码附近)