keygen是delphi写的
坛子里的破文如下
004417C6 |. 55 PUSH EBP 在这里下断
004417C7 |. 68 60184400 PUSH CrackMe0.00441860
004417CC |. 64:FF30 PUSH DWORD PTR FS:[EAX]
004417CF |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
004417D2 |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
004417D5 |. 8B83 C8020000 MOV EAX,DWORD PTR DS:[EBX+2C8]
004417DB |. E8 C419FEFF CALL CrackMe0.004231A4 ; 取假码位数
004417E0 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004417E3 |. 50 PUSH EAX ; EAX=假码
004417E4 |. 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C]
004417E7 |. 8B83 C4020000 MOV EAX,DWORD PTR DS:[EBX+2C4]
004417ED |. E8 B219FEFF CALL CrackMe0.004231A4 ; 取注册名位数
004417F2 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; EBP-C=注册名
004417F5 |. 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
004417F8 |. E8 FBFEFFFF CALL CrackMe0.004416F8 ; 算法CALL,跟进
004417FD |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
00441800 |. 58 POP EAX
00441801 |. E8 3E23FCFF CALL CrackMe0.00403B44 真假注册码比较
00441806 |. 75 1A JNZ SHORT CrackMe0.00441822 不相等则跳向失败。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入算法CALL
来到这里。。。。。。
004416F8 /$ 53 PUSH EBX
004416F9 |. 56 PUSH ESI
004416FA |. 57 PUSH EDI
004416FB |. 83C4 DC ADD ESP,-24
004416FE |. 891424 MOV DWORD PTR SS:[ESP],EDX
00441701 |. 8BF8 MOV EDI,EAX
00441703 |. BB 05033949 MOV EBX,49390305
00441708 |. BE 20126348 MOV ESI,48631220
0044170D |. 8BC7 MOV EAX,EDI
0044170F |. E8 2023FCFF CALL CrackMe0.00403A34 ; 取注册名位数
00441714 |. 85C0 TEST EAX,EAX ; 有注册名吗?没有则跳向OVER
00441716 |. 7E 2E JLE SHORT CrackMe0.00441746
00441718 |. BA 01000000 MOV EDX,1 ; 令EDX=1
0044171D |> 33C9 /XOR ECX,ECX ; ECX清零
0044171F |. 8A4C17 FF |MOV CL,BYTE PTR DS:[EDI+EDX-1] ; 取注册名的ASCII值
00441723 |. 33D9 |XOR EBX,ECX
00441725 |. 33F3 |XOR ESI,EBX
00441727 |. F6C3 01 |TEST BL,1 判断EBX的后两位转换成十进制数后的奇偶性
0044172A |. 74 0F |JE SHORT CrackMe0.0044173B 偶数就跳,奇数就不跳
0044172C |. D1FB |SAR EBX,1
0044172E |. 79 03 |JNS SHORT CrackMe0.00441733
00441730 |. 83D3 00 |ADC EBX,0
00441733 |> 81F3 11032001 |XOR EBX,1200311
00441739 |. EB 07 |JMP SHORT CrackMe0.00441742
0044173B |> D1FB |SAR EBX,1 ; EBX/2 即EBX除以2的一次方
0044173D |. 79 03 |JNS SHORT CrackMe0.00441742
0044173F |. 83D3 00 |ADC EBX,0
00441742 |> 42 |INC EDX ; EDX+1
00441743 |. 48 |DEC EAX ; EAX-1
00441744 |.^ 75 D7 \JNZ SHORT CrackMe0.0044171D
00441746 |> 8B0424 MOV EAX,DWORD PTR SS:[ESP]
00441749 |. 50 PUSH EAX ;
0044174A |. 8BC3 MOV EAX,EBX ; 将EBX的值赋给EAX
0044174C |. 25 FFFF0000 AND EAX,0FFFF ; 取EAX的后四位
00441751 |. 894424 08 MOV DWORD PTR SS:[ESP+8],EAX ; ESP+8=EAX的后四位
00441755 |. C64424 0C 00 MOV BYTE PTR SS:[ESP+C],0 ;
0044175A |. C1EB 10 SHR EBX,10 ; 取EBX的前四位
0044175D |. 895C24 10 MOV DWORD PTR SS:[ESP+10],EBX ; ESP+10=EBX的前四位
00441761 |. C64424 14 00 MOV BYTE PTR SS:[ESP+14],0 ;
00441766 |. 8BC6 MOV EAX,ESI ; 将ESI的值赋给EAX
00441768 |. 25 FFFF0000 AND EAX,0FFFF ; 取ESI的后四位
0044176D |. 894424 18 MOV DWORD PTR SS:[ESP+18],EAX ; ESP+18=ESI的后四位
00441771 |. C64424 1C 00 MOV BYTE PTR SS:[ESP+1C],0 ;
00441776 |. C1EE 10 SHR ESI,10 ; 取ESI的前四位
00441779 |. 897424 20 MOV DWORD PTR SS:[ESP+20],ESI ; ESP+20=ESI的前四位
0044177D |. C64424 24 00 MOV BYTE PTR SS:[ESP+24],0 ;
00441782 |. 8D5424 08 LEA EDX,DWORD PTR SS:[ESP+8] ;
00441786 |. B9 03000000 MOV ECX,3 ;
0044178B |. B8 A4174400 MOV EAX,CrackMe0.004417A4 ; |%.4x-%.4x-%.4x-%.4x
00441790 |. E8 6F68FCFF CALL CrackMe0.00408004 ; 合并成注册码。
00441795 |. 83C4 24 ADD ESP,24
00441798 |. 5F POP EDI
00441799 |. 5E POP ESI
0044179A |. 5B POP EBX
0044179B \. C3 RETN
------------------------------------------------------------------------
算法总结:
1)取用户名第一位的ASCII值。
2)将这个值与A=49390305做XOR运算。得到A1。
3)将A1与B1=48631220做XOR运算,得到B2。
4)将A1最右边两位转换成相应的十进制数,判断其奇偶性。
5)若为偶数:
则A1除以2,结果再与1200311进行XOR运算。得到A2。
若为奇数:
则A1除以2,得到A2。
6)取用户名下一位的ASCII值,并与A2,B2重复以上运算。
7)循环的次数为用户名的位数。
8)将最终得到的结果An,Bn分成四段,每段四位。
9)An的后四位-An的前四位-Bn的后四位-Bn的前四位。
例:注册名tc (两位,所以循环计算两次)
第一步
第一次:
1)取t的ASCII值74,与49390305进行XOR运算等于49390371
2)49390371再与ESI(此时ESI=48631220)进行XOR运算等于015A1151
3)将49390371的后两位即71,转换成十进制为133。
4)133是奇数所以。将49390371除以2商为249C81B8。249C81B8再与1200311进行XOR运算等于25BC82A9
第二次:
1)取c的ASCII值63,与25BC82A9进行XOR运算等于25BC82CA
2)25BC82CA再与ESI(此时ESI=015A1151)进行XOR运算等于24E6939B
3)将25BC82CA的后两位即CA,转换成十进制为202。
4)202是偶数,所以。将25BC82CA除以2的商等于12DE4165。
第二步
第一次:
1)将最终EBX的值An=12DE4165,按前四位后四位分成两段每段四位即:12DE,4165
2)将最终ESI的值Bn=24E6939B,按前四位后四位分成两段每段四位即:24E6,939B
第二次
1)将An的后四位作为注册码的第一部分,前四为作为注册码的第二部分
2)将Bn的后四位作为注册码的第三部分,前四为作为注册码的第四部分
最后输出结果
4165-12DE-939B-24E6
所以:注册名tc
注册码4165-12DE-939B-24E6
----------------delphi代码如下-----------
procedure TForm1.Button1Click(Sender: TObject);
var
a,b:real;
sp:ansistring;
i,nlen,xp:integer;
begin
a:=$49390305,b:=$48631220,i:=0;
sp:=edit1.text;
nlen:=length(edit1.text);
for i:=0 to nlen-1 do
begin
a:=strtoint(copy(sp,i,1)) xor a;
b:=a xor b;
xp:=right(intohex(a),2);
if xp mod 2 = 0 then
a:= (a shr 1) xor $1200311;
else
a:=a shl 1;
end;
edit2.text:= right(a,4) +'-'+ left(a,4)+'-'+right(b,4)+'-'+left(b,4);
end;
end.
哪位大哥帮忙帮看看啊 谢谢了 哪里 错了 请指点啊 ........拜托了
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)