首页
社区
课程
招聘
[原创]Anasazi's Hawkeye的算法分析以及相关代码(音乐很好听的CM)+KOL/MCK注册机
发表于: 2007-5-7 02:55 10087

[原创]Anasazi's Hawkeye的算法分析以及相关代码(音乐很好听的CM)+KOL/MCK注册机

2007-5-7 02:55
10087

Anasazi's Hawkeye的算法分析以及相关代码(音乐很好听的CM)+KOL/MCK注册机

名称:Hawkeye
作者:Anasazi
来自:http://www.crackmes.de/

这个CM的音乐真的很好听,有那位能告知是什么歌名吗?推荐下载来听听!
不过几个大循环让我有了晕晕的感觉,也许是喝了啤酒,天气热的关系吧!

简单分析过程:

OD载入,在注册名输入框中输入注册名:aCaFeeL,注册码:1235678后,下断点GetDlgItemTextA,F9运行,点击'Validate'按钮后,断在如下位置



。。。。。。
『省略』
00407BD0   .  FF15 F4F34C00 call    dword ptr [4CF3F4]               ; 断在了这里
00407BD6   .  3BF4          cmp     esi, esp                         ;
00407BD8   .  E8 932E0000   call    Hawkeye.0040AA70
00407BDD   .  8D45 D0       lea     eax, dword ptr [ebp-30]
00407BE0   .  50            push    eax
00407BE1   .  E8 FA360000   call    Hawkeye.0040B2E0
00407BE6   .  83C4 04       add     esp, 4
00407BE9   .  8985 94FEFFFF mov     dword ptr [ebp-16C], eax
00407BEF   .  83BD 94FEFFFF>cmp     dword ptr [ebp-16C], 5           ;  注册名长度与5比较
00407BF6   .  7D 26         jge     short Hawkeye.00407C1E           ;  大于等于5才能成功
00407BF8   .  8BF4          mov     esi, esp
00407BFA   .  6A 30         push    30                               ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
00407BFC   .  68 8CF14200   push    Hawkeye.0042F18C                 ; |Hawkeye
00407C01   .  68 60F14200   push    Hawkeye.0042F160                 ; |Sorry name must be over 4 characters
00407C06   .  8B4D 08       mov     ecx, dword ptr [ebp+8]           ; |
00407C09   .  51            push    ecx                              ; |hOwner
00407C0A   .  FF15 F0F34C00 call    dword ptr [4CF3F0]               ; \MessageBoxA 错误信息框
00407C10   .  3BF4          cmp     esi, esp
00407C12   .  E8 592E0000   call    Hawkeye.0040AA70
00407C17   .  32C0          xor     al, al
00407C19   .  E9 25030000   jmp     Hawkeye.00407F43
00407C1E   >  C785 90FEFFFF>mov     dword ptr [ebp-170], 3C
00407C28   .  C785 8CFEFFFF>mov     dword ptr [ebp-174], 32
00407C32   .  C785 88FEFFFF>mov     dword ptr [ebp-178], Hawkeye.004>;  ABCDEFGHIJKLMNOPQRSTUVWXYZ
00407C3C   .  C785 84FEFFFF>mov     dword ptr [ebp-17C], 0
00407C46   .  C785 80FEFFFF>mov     dword ptr [ebp-180], 0
00407C50   .  EB 0F         jmp     short Hawkeye.00407C61
00407C52   >  8B95 80FEFFFF mov     edx, dword ptr [ebp-180]         ;  // 大循环1 //
00407C58   .  83C2 01       add     edx, 1
00407C5B   .  8995 80FEFFFF mov     dword ptr [ebp-180], edx
00407C61   >  8B85 80FEFFFF mov     eax, dword ptr [ebp-180]
00407C67   .  3B85 94FEFFFF cmp     eax, dword ptr [ebp-16C]         ;  比较 循环长度
00407C6D      0F8D B1000000 jge     Hawkeye.00407D24                 ;  为0就跳
00407C73   .  8B8D 80FEFFFF mov     ecx, dword ptr [ebp-180]         ;  // Temp1 //
00407C79   .  0FBE540D D0   movsx   edx, byte ptr [ebp+ecx-30]       ;  依次从注册名中取字符码
00407C7E   .  81C2 6B050000 add     edx, 56B                         ;  +56B
00407C84   .  81F2 28048900 xor     edx, 890428                      ;  xor 890428
00407C8A   .  8B85 00FFFFFF mov     eax, dword ptr [ebp-100]         ;  $18/累加结果-》eax
00407C90   .  03C2          add     eax, edx                         ;  add运算-》EAX
00407C92   .  8985 00FFFFFF mov     dword ptr [ebp-100], eax
00407C98   .  83BD 94FEFFFF>cmp     dword ptr [ebp-16C], 9           ;  注册名长度与9比较
00407C9F      7E 2E         jle     short Hawkeye.00407CCF           ;  长度小于10则跳
00407CA1   .  0FBE4D D3     movsx   ecx, byte ptr [ebp-2D]           ;  // Temp2注册名长度 > 9 //取注册名的第4个字符码
00407CA5   .  8B95 94FEFFFF mov     edx, dword ptr [ebp-16C]         ;  取注册名的长度
00407CAB   .  03D1          add     edx, ecx                         ;  + 注册名长度
00407CAD   .  83F2 54       xor     edx, 54                          ;  xor $54
00407CB0   .  81F2 5D020000 xor     edx, 25D                         ;  再 xor $25D
00407CB6   .  8B85 FCFEFFFF mov     eax, dword ptr [ebp-104]         ;  $400/temp3累加结果 -> eax
00407CBC   .  0FAFC2        imul    eax, edx                         ;  运算结果 x $400/累加结果 -》EDX
00407CBF   .  8B8D 00FFFFFF mov     ecx, dword ptr [ebp-100]         ;  Temp1的结果 -》ECX
00407CC5   .  03C8          add     ecx, eax                         ;  上面两结果 temp1 + temp2
00407CC7   .  898D 00FFFFFF mov     dword ptr [ebp-100], ecx
00407CCD   .  EB 2B         jmp     short Hawkeye.00407CFA
00407CCF   >  0FBE55 D3     movsx   edx, byte ptr [ebp-2D]           ;  // Temp2注册名长度 < 9 // 取注册名的第4个字符码
00407CD3   .  8B85 94FEFFFF mov     eax, dword ptr [ebp-16C]         ;  取注册名的长度
00407CD9   .  03C2          add     eax, edx                         ;  + 注册名长度
00407CDB   .  83F0 54       xor     eax, 54                          ;  xor $54
00407CDE   .  35 5D020000   xor     eax, 25D                         ;  再 xor $25D
00407CE3   .  8B8D 00FFFFFF mov     ecx, dword ptr [ebp-100]         ;  Temp1的结果-》ECX
00407CE9   .  0FAFC8        imul    ecx, eax                         ;  上面两结果 temp1 x temp2
00407CEC   .  8B95 FCFEFFFF mov     edx, dword ptr [ebp-104]         ;  400/累加 -> EDX
00407CF2   .  03D1          add     edx, ecx                         ;  运算结果 + $400 -》EDX
00407CF4   .  8995 FCFEFFFF mov     dword ptr [ebp-104], edx
00407CFA   >  8B85 80FEFFFF mov     eax, dword ptr [ebp-180]         ;  // Temp3 //
00407D00   .  0FBE4C05 D0   movsx   ecx, byte ptr [ebp+eax-30]       ;  注册名依次取得字符码
00407D05   .  81C1 6B050000 add     ecx, 56B                         ;  +56B运算 -》ECX
00407D0B   .  69C9 24100000 imul    ecx, ecx, 1024                   ;  乘法 1024 -》ECX
00407D11   .  8B95 FCFEFFFF mov     edx, dword ptr [ebp-104]
00407D17   .  03D1          add     edx, ecx                         ;  所有运算结果相加
00407D19   .  8995 FCFEFFFF mov     dword ptr [ebp-104], edx
00407D1F   .^ E9 2EFFFFFF   jmp     Hawkeye.00407C52
『省略』
。。。。。。

通过对上面的 大循环1 的分析,知道了注册名分3种情况来处理,1。如果注册名的长度小于5,就提示输入4个以上的注册名,并退出算法运算;2。如

果注册名在5至9位数之间,便使用00407CCF位置开始的算法;3。如果注册名长度在9位数以上,便使用00407CA1位置开始的算法;其相关算法

(delphi+kol/mck代码)如下:

//如果:注册名长度小于5位数
  if  length(EditName.Text) < 5  then
    showmessage('注册名的长度必须大于4位数!');

  
//如果:注册名长度大于等于5位数,小于等于9位数
  if (5 <= length(EditName.Text)) and (length(EditName.Text) <= 9) then
    begin
    {大循环1}//////////////////////////////////////////////////{大循环1}
      cz := EditName.Text;
    //第一次
      temp1 := ((ord(cz[1]) + $56B) xor $890428) + $18;
      temp2 := ((ord(cz[4]) + length(cz)) xor $54) xor $25D;
      temp3 := (ord(cz[1]) + $56B) * $1024;
      tempA := ((temp1 * temp2) + $400) + temp3 ;
    //第二次开始循环
      for pos := 2 to length(cz) do
        begin//取字符的ASCII码
          temp1 := temp1 + ((ord(cz[pos]) + $56B) xor $890428);
          temp2 := ((ord(cz[4]) + length(cz)) xor $54) xor $25D;
          temp3 := (ord(cz[pos]) + $56B) * $1024;
          tempA := tempA + (temp1 * temp2) +  temp3;
        end;
    end;

  
//如果:注册名长度大于9位数
  if  length(EditName.Text) > 9  then
    begin
    {大循环1}//////////////////////////////////////////////////{大循环1}
      cz := EditName.Text;   
    //第一次
      temp1 := ((ord(cz[1]) + $56B) xor $890428) + $18;
      temp2 := (((ord(cz[4]) + length(cz)) xor $54) xor $25D) * $400;
      temp3 := ((ord(cz[1]) + $56B) * $1024) + $400;
      tempA := temp3;
    //第二次开始循环
      for pos := 2 to length(cz) do
        begin//取字符的ASCII码
          temp1 := temp1 + temp2 + ((ord(cz[pos]) + $56B) xor $890428);
          temp2 := (((ord(cz[4]) + length(cz)) xor $54) xor $25D) * temp3;
          temp3 := temp3 + ((ord(cz[pos]) + $56B) * $1024);
          tempA := temp3;
        end;
      temp1 := temp1 + temp2;  
    end;

。。。。。。
『省略』
00407D24   >  C785 84FEFFFF>mov     dword ptr [ebp-17C], 1
00407D2E   .  C785 7CFEFFFF>mov     dword ptr [ebp-184], 5           ;  (最初的 CPU 选择)
00407D38   .  EB 0F         jmp     short Hawkeye.00407D49
00407D3A   >  8B85 7CFEFFFF mov     eax, dword ptr [ebp-184]         ;  // 小循环1 //
00407D40   .  83E8 01       sub     eax, 1                           ;  循环减1
00407D43   .  8985 7CFEFFFF mov     dword ptr [ebp-184], eax
00407D49   >  83BD 7CFEFFFF>cmp     dword ptr [ebp-184], 0
00407D50   .  7E 35         jle     short Hawkeye.00407D87           ;  小于等于0.跳出循环
00407D52   .  8B8D 7CFEFFFF mov     ecx, dword ptr [ebp-184]         ;  从注册名的第6个字符,轮流正反注册名相依次取该位置的值码
00407D58   .  0FBE540D D0   movsx   edx, byte ptr [ebp+ecx-30]       ;   -> EDX
00407D5D   .  8B85 8CFEFFFF mov     eax, dword ptr [ebp-174]         ;  32/ ->EAX
00407D63   .  8D8C10 4A1300>lea     ecx, dword ptr [eax+edx+134A]    ;  EAX+EDX+$134A
00407D6A   .  898D 8CFEFFFF mov     dword ptr [ebp-174], ecx
00407D70   .  83BD 84FEFFFF>cmp     dword ptr [ebp-17C], 1
00407D77   .  75 0C         jnz     short Hawkeye.00407D85
00407D79   .  8D55 D0       lea     edx, dword ptr [ebp-30]          ;  注册名 -> EDX
00407D7C   .  52            push    edx
00407D7D   .  E8 0E1D0100   call    Hawkeye.00419A90                 ;  注册名反序排列
00407D82   .  83C4 04       add     esp, 4
00407D85   >^ EB B3         jmp     short Hawkeye.00407D3A
『省略』
。。。。。。

通过对上面的 小循环1 的分析,知道了取注册名的第6为字符开始,轮流改变注册名的顺序并依次取该位置的值码参与运算,其算法(delphi+

kol/mck代码)如下:

{小循环1}//////////////////////////////////////////////////{小循环1}
  cz := EditName.Text;
//第一次
  tempB := ord(cz[5+1]) + $32 + $134A;////
  {字符串反顺序}//比如开始:aCaFeeL
  for posSTR := length(cz) downto 1 do
    begin
      cz := cz+cz[posSTR];
    end;
  posSTR := length(cz) div 2;
  cz := copy(cz, posSTR+1, posSTR);
  {字符串反顺序}//比如结束:LeeFaCa
//第二次开始循环
  for pos := 4 downto 1 do
    begin
       tempB := tempB + ord(cz[pos+1]) + $134A;////
       {字符串反顺序}
       for posSTR := length(cz) downto 1 do
         begin
           cz := cz+cz[posSTR];
         end;
       posSTR := length(cz) div 2;
       cz := copy(cz, posSTR+1, posSTR);
       {字符串反顺序}
    end;

。。。。。。
『省略』
00407D87   >  C785 78FEFFFF>mov     dword ptr [ebp-188], 5
00407D91   .  EB 1E         jmp     short Hawkeye.00407DB1
00407D93   >  8B85 78FEFFFF mov     eax, dword ptr [ebp-188]         ;  // 小循环2 //
00407D99   .  83E8 01       sub     eax, 1                           ;  循环减1
00407D9C   .  8985 78FEFFFF mov     dword ptr [ebp-188], eax
00407DA2   .  8B8D 04FFFFFF mov     ecx, dword ptr [ebp-FC]
00407DA8   .  83C1 01       add     ecx, 1                           ;  循环加1
00407DAB   .  898D 04FFFFFF mov     dword ptr [ebp-FC], ecx
00407DB1   >  83BD 78FEFFFF>cmp     dword ptr [ebp-188], 0           ;  循环减1后,与0比较
00407DB8   .  7E 63         jle     short Hawkeye.00407E1D
00407DBA   .  8B95 7CFEFFFF mov     edx, dword ptr [ebp-184]         ;  LeeFaCa
00407DC0   .  0FBE4415 D0   movsx   eax, byte ptr [ebp+edx-30]       ;  取第1个字符
00407DC5   .  8B8D 8CFEFFFF mov     ecx, dword ptr [ebp-174]         ;  累加的结果->ECX
00407DCB   .  8D9401 4A1300>lea     edx, dword ptr [ecx+eax+134A]    ;  ECX + EAX + $134A -> EDX
00407DD2   .  8995 8CFEFFFF mov     dword ptr [ebp-174], edx
00407DD8   .  8B85 04FFFFFF mov     eax, dword ptr [ebp-FC]          ;  取第 2/3/4/5/6 字符
00407DDE   .  0FBE4C05 CF   movsx   ecx, byte ptr [ebp+eax-31]       ;  取第 2/3/4/5/6 个字符
00407DE3   .  83C1 23       add     ecx, 23                          ;  + 23 ->ECX
00407DE6   .  69C9 5A020000 imul    ecx, ecx, 25A                    ;  X 25A -> ECX
00407DEC   .  8B95 00FFFFFF mov     edx, dword ptr [ebp-100]         ;  上面大循环1的第一部份的结果
00407DF2   .  03D1          add     edx, ecx                         ;  相加
00407DF4   .  8995 00FFFFFF mov     dword ptr [ebp-100], edx
00407DFA   .  83BD 04FFFFFF>cmp     dword ptr [ebp-FC], 2
00407E01   .  7E 15         jle     short Hawkeye.00407E18
00407E03   .  83BD 78FEFFFF>cmp     dword ptr [ebp-188], 4
00407E0A   .  7D 0C         jge     short Hawkeye.00407E18
00407E0C   .  8D45 D0       lea     eax, dword ptr [ebp-30]
00407E0F   .  50            push    eax                              ;  4/5 翻转
00407E10   .  E8 7B1C0100   call    Hawkeye.00419A90                 ;  翻转注册名字符串
00407E15   .  83C4 04       add     esp, 4
00407E18   >^ E9 76FFFFFF   jmp     Hawkeye.00407D93
『省略』
。。。。。。

通过对上面的 小循环2 的分析,知道了其算法(delphi+kol/mck代码)如下:

{小循环2}//////////////////////////////////////////////////{小循环2}
//第一次
  tempC1 := ord(cz[1]) + tempB + $134A;
  tempC2 := ((ord(cz[2]) + $23) * $25A) + temp1;
//第二次开始循环
  posADD := 2;
  for pos := 4 downto 1 do
    begin
      posADD := posADD + 1;
      tempC1 := tempC1 + ord(cz[1]) + $134A;
      tempC2 := tempC2 + ((ord(cz[posADD]) + $23) * $25A);
      if (posADD = 4) or (posADD = 5) then
      begin
        {字符串反顺序}
         for posSTR := length(cz) downto 1 do
           begin
             cz := cz+cz[posSTR];
           end;
         posSTR := length(cz) div 2;
         cz := copy(cz, posSTR+1, posSTR);
         {字符串反顺序}
      end;
    end;

。。。。。。
『省略』
00407E1D   >  C785 74FEFFFF>mov     dword ptr [ebp-18C], 59          ;  // 最后检测 //
00407E27   .  C785 70FEFFFF>mov     dword ptr [ebp-190], 4
00407E31   .  8B8D 00FFFFFF mov     ecx, dword ptr [ebp-100]         ;  上面小循环2的结果 -》 ECX
00407E37   .  038D 90FEFFFF add     ecx, dword ptr [ebp-170]         ;  + 3C
00407E3D   .  0FBE55 D2     movsx   edx, byte ptr [ebp-2E]           ;  取注册名的第3个字符
00407E41   .  B8 37130000   mov     eax, 1337                        ;  1337
00407E46   .  2BC2          sub     eax, edx                         ;  相减
00407E48   .  33C8          xor     ecx, eax                         ;  结果 与 上面的结果 xor
00407E4A   .  898D 74FEFFFF mov     dword ptr [ebp-18C], ecx
00407E50   .  8B8D FCFEFFFF mov     ecx, dword ptr [ebp-104]         ;  大循环1的结果->ECX
00407E56   .  038D 8CFEFFFF add     ecx, dword ptr [ebp-174]         ;  与 小循环2的结果1 相加
00407E5C   .  0FBE55 D5     movsx   edx, byte ptr [ebp-2B]           ;  取注册名第6个字符
00407E60   .  B8 18000000   mov     eax, 18                          ;  18
00407E65   .  2BC2          sub     eax, edx                         ;  相减法
00407E67   .  33C8          xor     ecx, eax                         ;  xor运算
00407E69   .  898D 70FEFFFF mov     dword ptr [ebp-190], ecx
『省略』
。。。。。。

通过对上面的分析,知道了其算法(delphi+kol/mck代码)如下:

  注册码第一部份 : (tempC2 + $3C) xor ($1337 - ord(cz[3]));
  注册码第二部分 : (tempC1 + tempA) xor ($18 - ord(cz[6]));

。。。。。。
『省略』
00407E6F   .  8BF4          mov     esi, esp
00407E71   .  8B8D 70FEFFFF mov     ecx, dword ptr [ebp-190]
00407E77   .  51            push    ecx                              ; /<%d>
00407E78   .  8B95 74FEFFFF mov     edx, dword ptr [ebp-18C]         ; |注册码第二部分
00407E7E   .  52            push    edx                              ; |<%d>
00407E7F   .  8D85 98FEFFFF lea     eax, dword ptr [ebp-168]         ; |注册码第一部份
00407E85   .  50            push    eax                              ; |<%s>"RHM"字符串
00407E86   .  68 34F14200   push    Hawkeye.0042F134                 ; |%s-%d%d 注册码格式
00407E8B   .  8D8D 08FFFFFF lea     ecx, dword ptr [ebp-F8]          ; |
00407E91   .  51            push    ecx                              ; |s
00407E92   .  FF15 ECF34C00 call    dword ptr [4CF3EC]               ; \wsprintfA
『省略』
。。。。。。

通过对上面的分析,知道了注册码的格式为:

RHM-十进制数(注册码第一部份)+十进制数(注册码第二部份)

通过上面的分析,写出了注册机的完整源代码如下:(好久都没用过KOL/MCK了,顺顺手 :)

{ KOL MCK } // Do not remove this line!
{$DEFINE KOL_MCK}
unit MainPYG;

interface

{$IFDEF KOL_MCK}
uses Windows, Messages, ShellAPI, KOL, KOLGif {$IFNDEF KOL_MCK},
     mirror, Classes, Controls, mckControls, mckObjs, mckCtrls,
     MCKGif, StdCtrls {$ENDIF (place your units here->)};
{$ELSE}
{$I uses.inc}
     Windows, Messages, SysUtils, Classes, Controls, Forms, Dialogs;
{$ENDIF}

type
  {$IFDEF KOL_MCK}
  {$I MCKfakeClasses.inc}
  {$IFDEF KOLCLASSES} TForm1 = class; PForm1 = TForm1; {$ELSE OBJECTS} PForm1 = ^TForm1; {$ENDIF CLASSES/OBJECTS}
  {$IFDEF KOLCLASSES}{$I TForm1.inc}{$ELSE} TForm1 = object(TObj) {$ENDIF}
    Form: PControl;
  {$ELSE not_KOL_MCK}
  TForm1 = class(TForm)
  {$ENDIF KOL_MCK}
    KOLProject1: TKOLProject;
    KOLForm1: TKOLForm;
    PanelBack: TKOLPanel;
    GroupBox6: TKOLGroupBox;
    BitBtnReg: TKOLBitBtn;
    BitBtnExit: TKOLBitBtn;
    EditName: TKOLEditBox;
    EditCode: TKOLEditBox;
    Label1: TKOLLabel;
    Label2: TKOLLabel;
    procedure BitBtnRegClick(Sender: PObj);
    procedure KOLForm1FormCreate(Sender: PObj);
    procedure BitBtnExitClick(Sender: PObj);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;

{$IFDEF KOL_MCK}
procedure NewForm1( var Result: PForm1; AParent: PControl );
{$ENDIF}

implementation

{$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}

{$IFDEF KOL_MCK}
{$I main_1.inc}
{$ENDIF}

//注册算法
procedure TForm1.BitBtnRegClick(Sender: PObj);
var
  cz : string;
  temp1, temp2, temp3,
  tempA, tempB, tempC1, tempC2, tempD1, tempD2,
  pos, posSTR, posADD, posSUB : integer;
begin
//如果:注册名长度小于5位数
  if  length(EditName.Text) < 5  then
    begin
      showmessage('注册名的长度必须大于4位数!');
      exit;
    end;

  
//如果:注册名长度大于等于5位数,小于等于9位数
  if (5 <= length(EditName.Text)) and (length(EditName.Text) <= 9) then
    begin
    {大循环1}//////////////////////////////////////////////////{大循环1}
      cz := EditName.Text;
    //第一次
      temp1 := ((ord(cz[1]) + $56B) xor $890428) + $18;
      temp2 := ((ord(cz[4]) + length(cz)) xor $54) xor $25D;
      temp3 := (ord(cz[1]) + $56B) * $1024;
      tempA := ((temp1 * temp2) + $400) + temp3 ;
    //第二次开始循环
      for pos := 2 to length(cz) do
        begin//取字符的ASCII码
          temp1 := temp1 + ((ord(cz[pos]) + $56B) xor $890428);
          temp2 := ((ord(cz[4]) + length(cz)) xor $54) xor $25D;
          temp3 := (ord(cz[pos]) + $56B) * $1024;
          tempA := tempA + (temp1 * temp2) +  temp3;
        end;
    end;

  
//如果:注册名长度大于9位数
  if  length(EditName.Text) > 9  then
    begin
    {大循环1}//////////////////////////////////////////////////{大循环1}
      cz := EditName.Text;   
    //第一次
      temp1 := ((ord(cz[1]) + $56B) xor $890428) + $18;
      temp2 := (((ord(cz[4]) + length(cz)) xor $54) xor $25D) * $400;
      temp3 := ((ord(cz[1]) + $56B) * $1024) + $400;
      tempA := temp3;
    //第二次开始循环
      for pos := 2 to length(cz) do
        begin//取字符的ASCII码
          temp1 := temp1 + temp2 + ((ord(cz[pos]) + $56B) xor $890428);
          temp2 := (((ord(cz[4]) + length(cz)) xor $54) xor $25D) * temp3;
          temp3 := temp3 + ((ord(cz[pos]) + $56B) * $1024);
          tempA := temp3;
        end;
      temp1 := temp1 + temp2;  
    end;

{小循环1}//////////////////////////////////////////////////{小循环1}
  cz := EditName.Text;
//第一次
  tempB := ord(cz[5+1]) + $32 + $134A;////
  {字符串反顺序}//比如开始:aCaFeeL
  for posSTR := length(cz) downto 1 do
    begin
      cz := cz+cz[posSTR];
    end;
  posSTR := length(cz) div 2;
  cz := copy(cz, posSTR+1, posSTR);
  {字符串反顺序}//比如结束:LeeFaCa
//第二次开始循环
  for pos := 4 downto 1 do
    begin
       tempB := tempB + ord(cz[pos+1]) + $134A;////
       {字符串反顺序}
       for posSTR := length(cz) downto 1 do
         begin
           cz := cz+cz[posSTR];
         end;
       posSTR := length(cz) div 2;
       cz := copy(cz, posSTR+1, posSTR);
       {字符串反顺序}
    end;

{小循环2}//////////////////////////////////////////////////{小循环2}
//第一次
  tempC1 := ord(cz[1]) + tempB + $134A;
  tempC2 := ((ord(cz[2]) + $23) * $25A) + temp1;
//第二次开始循环
  posADD := 2;
  for pos := 4 downto 1 do
    begin
      posADD := posADD + 1;
      tempC1 := tempC1 + ord(cz[1]) + $134A;
      tempC2 := tempC2 + ((ord(cz[posADD]) + $23) * $25A);
      if (posADD = 4) or (posADD = 5) then
      begin
        {字符串反顺序}
         for posSTR := length(cz) downto 1 do
           begin
             cz := cz+cz[posSTR];
           end;
         posSTR := length(cz) div 2;
         cz := copy(cz, posSTR+1, posSTR);
         {字符串反顺序}
      end;
    end;

{最后检测}//////////////////////////////////////////////////{最后检测}
  cz := EditName.Text;
  tempD1 := (tempC2 + $3C) xor ($1337 - ord(cz[3]));
  tempD2 := (tempC1 + tempA) xor ($18 - ord(cz[6]));
  editCode.Text := 'RHM' + '-' + int2str(tempD1) + int2str(tempD2);
end;

procedure TForm1.BitBtnExitClick(Sender: PObj);
begin
  form.close;
end;

end.

放上一组可用的注册名/注册码:
aCaFeeL
RHM-63218134168992732

另,如果没有猜错,作者的生日是:1989-04-28,嘿嘿!


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (13)
雪    币: 272
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
牛人,学习了
2007-5-7 08:35
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
向牛人学习,光看注册机代码就知道跟踪它时的痛苦
2007-5-7 12:47
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
刚才自己动手追了一下,如此长的代码,可惜用了明码,给写注册的人一个目标,失败
2007-5-7 12:56
0
雪    币: 333
活跃值: (116)
能力值: ( LV9,RANK:570 )
在线值:
发帖
回帖
粉丝
5
这个算法是用的: 注册名 -> 注册码 的算法,
但是只需把它修改一下,便可变为: 注册码 -> 注册名 的算法,
如果作者那样写,由注册码推出注册名的话,就会难些了,也就不会出现明码的提示!

推荐大家跟一跟,很有小时候玩藏猫猫的那种感觉
2007-5-7 13:46
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
大牛说的是,把里面的换算再用开摊的写法 6=4/2+3+5-4 等写法,保证写注册机的人
死了一半
2007-5-7 13:53
0
雪    币: 200
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
zcg
7
大量的跳转加循环,再加上开摊的写法,可能快要接近最低级的代码混淆的难度了吧
2007-5-8 10:43
0
雪    币: 538
活跃值: (460)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
8
强,昨天跟了一下觉得太麻烦了,就退却了.....
2007-5-8 10:47
0
雪    币: 200
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
zcg
9
坚持到底
2007-5-8 11:51
0
雪    币: 472
活跃值: (20)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
好文,正需要呢!
2007-5-9 12:05
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
11
还差一贴就200了```帮你顶了`
2007-5-10 14:36
0
雪    币: 372
活跃值: (31)
能力值: ( LV12,RANK:410 )
在线值:
发帖
回帖
粉丝
12
继续改写函数收藏
2007-5-12 13:50
0
雪    币: 161
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这个好复杂,学习一下!!!!
2007-5-16 21:27
0
雪    币: 212
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
作者把算法都分析出来的拉,不错!
2007-6-16 01:04
0
游客
登录 | 注册 方可回帖
返回
//