- UID
- 20912
注册时间2006-8-25
阅读权限30
最后登录1970-1-1
龙战于野
该用户从未签到
|
总的说来,fonge's crackme 10.1还是很成功的,每一部分思路都已基本实现了他的作用!
借这个机会,在这里公布他的delphi源码!
为什么是delphi源码而不是其他的呢?
不为什么,因为是用delphi写的,直接拿来看了!
本来,crackme的外观很漂亮的,虽然仅仅是用字和颜色来排列!
可能是因为你们没那种字体吧以至于看到你们贴出来的图片那么难看!:o:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
GroupBox2: TGroupBox;
Label4: TLabel;
Button1: TButton;
Button2: TButton;
GroupBox3: TGroupBox;
Label1: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
初始化就略过,那都是机器自己先成的,我们从我们开始键入代码的地方开
就这里,
procedure TForm1.Button2Click(Sender: TObject); 这里是清空按钮的代码
begin
edit1.Text:='';
edit2.Text:='';
end;
procedure TForm1.FormCreate(Sender: TObject); 这个位置的作用后面再详细介绍
begin
var
isDebuggerPresent: function:Boolean;
DllModule: THandle;
begin
DllModule := LoadLibrary('kernel32.dll');
isDebuggerPresent := GetProcAddress(DllModule, 'IsDebuggerPresent');
if isDebuggerPresent then
asm
mov eax,eax
mov eax,eax
mov eax,eax
mov eax,eax
mov eax,eax
end;
end;
这个就是注册按钮功能的地方,也是最关键的地方
procedure TForm1.button1Click(Sender: TObject);
begin
var
i,j,n,b,m,a,c,d,k,o,rt,v,l,s,p,q,r,t,t1,t2,t3:integer;
name,sn,wr,at,at1,at2,at3,at4,at5,inp,su,ln,ps1,ps2:string;
tt:TMsgDlgType;
label
cz,cz0;
begin
name:=edit1.text;
inp:=edit2.Text;
at:='abcdefghijklmnopqrstuvwxyz ';
tt:=mtError;
n:=0;
m:=0;
o:=0;
if length(inp)<5 then exit;
if length(name)<6 then goto cz;
m:=m+1;
if length(name)>10 then goto cz;
b:=ord(name[4]) ; 上面都是初始化
下面部分开始算主要注册码部分了
for i:=1 to length(name) do
begin
for j:=1 to length(name) do b:=b+ord(name[length(name)-i])*ord(name[j]) shr 6;
n:=n+b;
sn:=sn+inttostr(n);
end;下面就是用来判断的了,也是本次crackme重点关注的地方,引入了用除0异常来判断的编程思想
begin
q:=0;
p:=0;
for l:=1 to 3 do
begin
if l<2 then
begin
for s:=1 to 5 do
begin
p:=p+ord(sn);
q:=q+ord(inp);
end;
end
else
begin
if l=2 then
begin
for r:=6 to 12 do
begin
p:=p+ord(sn[r])+1;
q:=q+ord(inp[r]);
end;
q:=q+7;
end
else
begin
for t:=16 to length(sn) do
begin
p:=p+ord(sn[t]);
q:=q+ord(inp[t]);
end;
end;
end;
begin
try
o:=m div (p xor q);
o:=o+1;
except
on EDivByZero do
m:=m+1;
end;
end;
end;
end;
goto cz0;
asm
mov eax,eax
nop
end;
exit;
下面是字符串简单解码,是可以复杂的,但这毕竟是试验型crackme,点到为止
cz0:
begin
t1:=ord(inp[13])-31;
t2:=ord(inp[15])-36;
t3:=ord(inp[14])-49;
ps1:=at[t1]+at[5]+at[7]+at[9]+at[19]+at[t2];
ps2:=at[t3]+at[t1]+at[5]+at[m];
m:=m+7;
end;
cz:
begin
at1:=at[4]+at[5]+at[7]+at[8]+at[9];
at2:=at[15]+at[18]+at[19]+at[20]+at[14]+at[12];
at3:=at[19]+at[14]+' ';
at4:=at1[5]+at2[3]+' ';
at5:=at[23]+at[18]+at[15]+at[14]+at[7];
ln:=at2[6]+at2[1]+at2[5]+at1[3];最后的确认,是否输出正确结果
if m<1 then wr:=at2[3]+at1[4]+at2[1]+at2[2]+at[20] else
begin
if length(name)>10 then wr:=ln else
begin
if m>10 then
begin
wr:=ps1+ps2+at[27]+at[20]+at[15]+at[27]+name;
tt:=mtInformation;
end else
wr:=at5;
end;
end;
if o>20 then wr:=ps1+ps2;
messageDlg(at3+at4+wr,tt,[mbOK],0) ;
exit;
end;
end;
end. |
|