首页
社区
课程
招聘
[原创]一个比较自信的CrackMe
2007-5-2 03:25 13420

[原创]一个比较自信的CrackMe

2007-5-2 03:25
13420
要求不要暴力破解

这是我发的第一个 CrackMe,花了两小时完成的.

对于解密我不太懂,用Delphi编了这样一个比较自信不容易破的.

密码是一个固定字符串.希望有人能把密码公布出来,最好提供下算法.

等级不够,附件只好传到我的空间里

下载地址是:
http://www.svnv.cn/HLRCrackMe.rar

第二版本的CrackMe下载地址是:
http://www.svnv.cn/HLRCrackMe2.rar

[培训]科锐软件逆向50期预科班报名即将截止,速来!!! 50期正式班报名火爆招生中!!!

收藏
免费 0
打赏
分享
最新回复 (33)
雪    币: 319
活跃值: (2359)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
csjwaman 24 2007-5-2 09:43
2
0
698611

注册码正确就退出?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaoyuwed 2007-5-2 10:13
3
0
晕,这么早就被破掉了

不愧是高级会员.

有时间说说分析思路吗?

我下次写验证时又可以加一点防备.
雪    币: 244
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
yaleond 1 2007-5-2 10:17
4
0
怎么下的断?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaoyuwed 2007-5-2 10:21
5
0
断点要如何下,明码字符串在OD里面根本找不着.结贴时我会把源码贴上来,大家互相学习.
雪    币: 244
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
yaleond 1 2007-5-2 10:33
6
0
我比较菜,源码到看得懂,就是不会找断点,每次都是不会找断点,看了别人下的断点后自己就会分析算法,分析后大多都是对的...
----没断点的话都不能起步了...
雪    币: 319
活跃值: (2359)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
csjwaman 24 2007-5-2 10:53
7
0
创建线程检测注册码。跟进线程就可以找到关键处了。
雪    币: 244
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
yaleond 1 2007-5-2 10:58
8
0
哈哈,我开始试过了,还以为是错的呢...
接着去看.
雪    币: 244
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
yaleond 1 2007-5-2 16:12
9
0
找到注册码了,走了好多弯路...
感觉算法不难....
刚刚上时,说论坛维护...
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaoyuwed 2007-5-2 16:24
10
0
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label2: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  threadhandle:thandle;
  threadid:dword;
  editHwnd:thandle;
  formHwnd:thandle;
  //'0?>077';  这个是密码698611用下面的函数加密的结果
  ss1:string='0';
  ss2:string='?';  
  ss3:string='>';
  ss4:string='7';
implementation

{$R *.dfm}
//字符串加密
function XorStrings(Str,Key:String): String;                 //?????,??1:???,??2:??
var
  X, Y : Integer;
  A : Byte;
begin
  Y := 1;
  for X := 1 to Length(Str) do
  begin
    A := (Ord(Str[X]) and $0f) xor (Ord(Key[Y]) and $0f);
    Str[X] := Char((ord(Str[X]) and $f0) + A);
    Inc(Y);
    If Y > Length(Key) then Y := 1;
  end;
  Result := Str;
end;
//取窗口文字
function GetWinTitle(hWnd: HWnd): string;
var
  WindowTitle: array[0..MAX_PATH] of Char;
begin
  WindowTitle[SendMessage(hWnd, WM_GETTEXT, MAX_PATH, Integer(@WindowTitle))] := #0;
  Result := WindowTitle;
end;
//线程
function SLthreadfunction(info:pointer):integer;stdcall;
var
s:string;
i:integer;
b:integer;
tx:string;
  begin
    for i:=0 to 20 do  //无用循环
      begin
        sleep(1);
        s:='.';   
        b:=b xor i;
      end;
    s:=GetWinTitle(editHwnd);  //取密码
    if length(s)<>6 then exit; //长度检测

      for i:=1 to 6 do        //比较
       begin
         tx:=copy(s,length(s),length(s));  //取最后一位
         setlength(s,length(s)-1);         //删除最后一位
         case i of
          1,2:if XorStrings(tx,'666')<>ss4 then exit;
          3,6:if XorStrings(tx,'666')<>ss1 then exit;
          4:if XorStrings(tx,'666')<>ss3 then exit;
          5 :if XorStrings(tx,'666')<>ss2 then exit;
         end;
      end;
    SendMessage(formHwnd, WM_SYSCOMMAND, SC_CLOSE, 0);  //用SendMessage关闭程序主要是不想用弹出窗口的方式,那样容易下断
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
   editHwnd:=edit1.Handle;  //EDIT窗口句柄
   formHwnd:=form1.Handle;  //主窗口句柄
   threadhandle:=createthread(nil,0,@SLthreadfunction,nil,0,threadid);  //创建线程进行比较
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
close; //放弃
end;

end.

对于破解我还是刚入门.也希望能从各位大虾的经验中学到东东,谢谢
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaoyuwed 2007-5-2 16:30
11
0
这个CrackMe的用意是在没有任何提示的情况下,怎么下断.用线程检测能否干扰OD的单步执行.

后来自已用OD戴入后,查找字符串,还是可以发现几个可疑的地方,比如 '666'这个字符串,也可以在这里下断

经过这次学习,下次会再想想办法,使难度加大
雪    币: 244
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
yaleond 1 2007-5-2 16:47
12
0
看到那一串串的666了...
整个程序让我走了不少弯路,一开不知道在哪下断,在OD里调试运行了几次,发现是一个线程中止,就到模块里去找创建线程的,下断,成功,但是在找关键代码时遇到不少麻烦,如是开始怀疑我下的断了...还好是csjwaman的提醒,又让走到正路上开始...

本人太菜,还得狠狠学习...
雪    币: 244
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
yaleond 1 2007-5-2 16:49
13
0
不过不知道原程序的话还是不知道在这里下断的.因为你不知道这个666是干什么的啊.
雪    币: 319
活跃值: (2359)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
csjwaman 24 2007-5-2 21:11
14
0
期待楼主来个猛点的
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaoyuwed 2007-5-2 22:21
15
0
to csjwaman

好的,今晚再来个
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaoyuwed 2007-5-2 23:23
16
0
搞好了,兄弟努力,这次不好搞了

要求同样是公开密码

http://www.svnv.cn/HLRCrackMe2.rar

明天来看结果,玩去了.
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaoyuwed 2007-5-3 10:21
17
0
请问一下

查找文本字串参考  地址=00451140  反汇编=ascii   "0",0

双击来到 00451140   .  30 00         ascii   "0",0

下断,成功断下,F8单步程序却终止了,这是什么原因

这个地址下面明明有代码没有执行,怎么按F8就会终止了.

第一个版本里的
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dpxdp 2007-5-3 12:52
18
0
首先声明,我是新手,说错勿笑勿骂...

关于crackme2的(关键地点):

004526CA  |.  50            push    eax                        ; /lParam
004526CB  |.  68 04010000   push    104                        ; |wParam = 104
004526D0  |.  6A 0D         push    0D                         ; |Message = WM_GETTEXT
004526D2  |.  53            push    ebx                        ; |hWnd
004526D3  |.  E8 7043FBFF   call    <jmp.&user32.SendMessageA> ; \SendMessageA

应该看出来了吧...

然后返回后运用算法进行比较...

有兴趣的继续
雪    币: 319
活跃值: (2359)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
csjwaman 24 2007-5-3 13:57
19
0
QBD8qWzO0hepUy+NEg=

MD5+BASE64

将此值替换掉即可。否则只能穷举。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaoyuwed 2007-5-3 14:52
20
0
是标准的QQ密码加密方式

QBD8qWzO0hepUy+NEg=  这个是不太正确的,应是 pQBqDp8qWzO0hepUEy+NEg==
也就是 313319943

你的结果我不清楚你是怎么得到的.

我最感兴趣的是你怎么调试

我在17楼那里问过,只要在这里断下,按F8就程序结束.你是怎么调试的,

不要说在OD里看到的明码就行了.

crackme1 我无法调试,出现上面的情况, crackme2上加了一点代码防止被调试,csjwaman兄有没有看出来

源码稍后贴上
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaoyuwed 2007-5-3 14:53
21
0
也就是说你得到的结果 QBD8qWzO0hepUy+NEg=
是看到OD上的明码然后一个个列出来,还是一个个调试出来的
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaoyuwed 2007-5-3 15:01
22
0
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,FunUnit,tonghan;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label2: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  threadhandle:thandle;
  threadid:dword;
  editHwnd:thandle;
  formHwnd:thandle;
implementation

{$R *.dfm}

function GetWinTitle(hWnd: HWnd): string;
var
  WindowTitle: array[0..MAX_PATH] of Char;
begin
  WindowTitle[SendMessage(hWnd, WM_GETTEXT, MAX_PATH, Integer(@WindowTitle))] := #0;
  Result := WindowTitle;
end;

function SLthreadfunction(info:pointer):integer;stdcall;
var
s:string;
i:integer;
b:integer;
tx:string;
b3133:dword;
time:dword;
  begin
    s:=GetWinTitle(editHwnd);
    s:=trim(s);
    if IsNumString(s)=false then exit;     //有非数字则退出
    b3133:=strtoint(s);                    //转换为数值  313319943
    if (b3133>400000000) or (b3133<300000000) then exit;  //如果数值过大或过小就退出    增加难度

    s:=GetHash(s);                     //用标准的QQ密码加密方法进行加密  也就是两次MD5加一次什么我忘记了.搜索下吧
                                       //由于这加密源码并不是我写的,所以不便公开
                                       
   time:=GetMessageTime() div 1000;  //取系统启动时间,以秒为单位.
                                     //如果在下面比较字符串用的时间多过2秒则退出,
                                      //也就是说如果用OD单步执行,那就显得不可能了.只有2秒的时间给你玩.
                                      //有创意吧   ^_^
    for i:=1 to 24 do              //用的还是上个版本的每个字符进行明码比较   要知道这明码是怎么来的,也不是容易的事  ^_^
       begin
         if ((GetMessageTime() div 1000)-1) >time then exit;   //代码运行时间比较    只有2秒的时间给你分析这个循环
         tx:=copy(s,length(s),length(s));
         log(pchar(tx+'  '+inttostr(i)));
         setlength(s,length(s)-1);
         case i of    //pQBqDp8qWzO0hepUEy+NEg==   用313319943 加密后的结果
          1:if tx<>'=' then exit;
          2:if tx<>'=' then exit;
          3:if tx<>'g' then exit;
          4:if tx<>'E' then exit;
          5:if tx<>'N' then exit;
          6:if tx<>'+' then exit;
          7:if tx<>'y' then exit;
          8:if tx<>'E' then exit;
          9:if tx<>'U' then exit;
          10:if tx<>'p' then exit;
          11:if tx<>'e' then exit;
          12:if tx<>'h' then exit;
          13:if tx<>'0' then exit;
          14:if tx<>'O' then exit;
          15:if tx<>'z' then exit;
          16:if tx<>'W' then exit;
          17:if tx<>'q' then exit;
          18:if tx<>'8' then exit;
          19:if tx<>'p' then exit;
          20:if tx<>'D' then exit;
          21:if tx<>'q' then exit;
          22:if tx<>'B' then exit;
          23:if tx<>'Q' then exit;
          24:if tx<>'p' then exit;
         end;
      end;
    SendMessage(formHwnd, WM_SYSCOMMAND, SC_CLOSE, 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
   editHwnd:=edit1.Handle;
   formHwnd:=form1.Handle;
   threadhandle:=createthread(nil,0,@SLthreadfunction,nil,0,threadid);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

end.
//313319943=pQBqDp8qWzO0hepUEy+NEg==
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaoyuwed 2007-5-3 15:05
23
0
在没有进入检证之前取系统的启动时间
time:=GetMessageTime() div 1000;  //取系统启动时间,以秒为单位

每次对比结果的时候都对时间进行比较
for i:=1 to 24 do            
   begin
      if ((GetMessageTime() div 1000)-1) >time then exit;   
   //代码运行时间比较    只有2秒的时间给你分析这个循环

这样也能调试???????
雪    币: 244
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
yaleond 1 2007-5-3 16:02
24
0

我太菜是玩不了...
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dpxdp 2007-5-3 16:09
25
0
我想问下xiaoyuwed,你为什么不想办法防暴破呢???

这个暴起来很简单啊.
游客
登录 | 注册 方可回帖
返回