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直播授课