飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 6963|回复: 10

DELPHI微抗DEDE方法示例

[复制链接]

该用户从未签到

发表于 2006-7-7 15:35:25 | 显示全部楼层 |阅读模式
方法是学来的,代码已经用于我写的CRACKME中,部分反DEDE示例出来,呵呵~~~~~~~~~~

简言之,事件处理程序私有,事件动态绑定。。。。。。。。
能够使DEDE不能直接看到事件处理程序,微抗,呵呵~~~~~~~~~~

unit CrackMe_De1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdCoder, IdCoder3to4, IdCoder00E,
  IdCoderXXE;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label2: TLabel;
    Button1: TButton;
    Button2: TButton;
    private
    { Private declarations }
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure WM_Create(var msg:TMessage);message WM_CREATE;
    public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Crackme_de1_id;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  th:TIDCount;
begin
  ShowMessage('成功!');
  end;

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

procedure TForm1.WM_Create(var msg: TMessage);
begin
    Form1.Button1.OnClick:=Button1Click;
    Form1.Button2.OnClick:=Button2Click;
end;


end.
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-6-16 14:07
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2006-7-9 22:27:30 | 显示全部楼层
    学到就是自己的!

    精华之!
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 431 天

    [LV.9]以坛为家II

    发表于 2006-10-10 08:32:43 | 显示全部楼层
    这贴好,高,I 服了 you !
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-10-11 20:28:31 | 显示全部楼层
    不 错 ,佩服
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-2-27 00:08
  • 签到天数: 74 天

    [LV.6]常住居民II

    发表于 2006-10-19 22:28:28 | 显示全部楼层
    好,学以至用
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-2-3 15:33:30 | 显示全部楼层
    [转]
    反dede很简单,因为dede是先加载程序到内存运行以后再进行反编译的,所以,直接用findwindow去找dede主程序的窗口就可以了:

    一、如果可能的话,关键部分的类名和对象名最好不要那么直白。
    二、如果可能的话,代码中事件的生成不要用Delphi的属性编辑器来生成,而要手工生成。
    三、如果可能的话,程序中最好不要出现明文的字符串。
    四、如果可能的话,不要直接发布Delphi编译好的程序。
    五、如果可能的话,不要使用Delphi提供的和那些知名的控件。

    DELPHI ANTI-DEDE的几段代码搜索窗口名:

    Procedure Anti_Dede();
    var
      zHandle:THandle;
      i:integer;
    begin
      zHandle:=FindWindow(nil,chr($64)+chr($65)+chr($64)+chr($65));
      if zHandle<>0 then
        begin
          For i:=1 to 4500 do
            SendMessage(zHandle,WM_CLOSE,0,0);
        end;
    end;


    防止用DeDe软件反编译delphi程序


     Program Project1;


    Uses

      Forms,

      windows,

      sysutils,

      Unit1 In 'Unit1.pas' {Form1},

      Unit2 In 'Unit2.pas' {Form2};


    Function RegisterServiceProcess(dwProcessId, dwType: dword): Integer; Stdcall;

      External 'kernel32.dll'

    {$R *.RES}

    Var

      HMUTEX: HWND;

      RET: INTEGER;

      hCurrentWindow: HWnd; //反编译要的

      szText: Array[0..254] Of char; //反编译要的

    Begin

      Application.Initialize;

      APPLICATION.TITLE := 'delphi葵花宝典 设计:张国鹏';

      RegisterServiceProcess(GetCurrentProcessID, 1); //让程序在Ctl+Alt+Del中消失.


      『我们可以看到作者用RegisterServiceProcess把程序注册成了WINDOWS服务程序~』

      『但大家都知道这个函数包含在kernel32里,而且只在98/ME中管用~』

      『所以并不要把这项作为反编译的关键,可以说可有可无~』

    //防止反编译开始

      hCurrentWindow := GetWindow(APPLICATION.Handle, GW_HWNDFIRST);


      『由上面知道作者想知道自己的程序窗口是不是最顶级的窗口』


      While hCurrentWindow <> 0 Do

      Begin

        If GetWindowText(hCurrentWindow, @szText, 255) > 0 Then

          If pos('DeDe', StrPas(@szText)) <> 0 Then


       『如果不是,则获取现在顶机窗体的标题,在做判断是不是"DeDe"』


          Begin

            APPLICATION.MESSAGEBOX('想反编译我?没那么容易!',

              '哈哈......你这家伙!', mb_ok);

            //closewindow(hCurrentWindow);//使该程序窗口最小化

            enablewindow(hCurrentWindow, false);

            //使该程序的窗口不能被激活 如果能获取该程序的线程ID号,则可以使该程序又不能使用,又不能关闭,酷吧?


            『以上这两句是对DEDE的处理~』

            『closewindow:为把制定的窗口最小化,但窗口不会从内存中清除~』

            『enablewindow:指定的窗口里允许/禁止所鼠标和键盘的输入,false肯定是不能了~』


            halt;

          End;

        hCurrentWindow := GetWindow(hCurrentWindow, GW_HWNDNEXT);

      End;

      //防止反编译结束

      //防止程序的二次运行

      HMUTEX := CREATEMUTEX(Nil, FALSE, 'delphi葵花宝典 设计:张国鹏');

      RET := GETLASTERROR;

      If RET <> ERROR_ALREADY_EXISTS Then

      Begin

        Application.CreateForm(TForm1, Form1);

        // Application.CreateForm(TForm2, Form2);

        Application.Run;

      End

      Else

        APPLICATION.MESSAGEBOX('程序已经运行!', '提示', mb_ok);

      releasemutex(hmutex);


    End.


    方法一:在FORM上使用一个FRAME,防止通过DEDE的DFM EDITOR直接跳到函数或过程里。

      目前DEDE并不能很好地支持FRAME,所以加上一个FRAME,他就无法生成FORM的图形界面,现在可以利用DEDE的这个缺陷。

      类似的缺陷,如果感兴趣可以自己找,比如:
      在FORM里的某个控件里使用中文字,好像有的DEDE就无法正常显示这个FORM,诸如此类。

    方法二:隐藏你的过程或函数:
      有些人在分析DELPHI写的程序时,有时会发现在反编译后FORM的事件列表里竟然是空的,这是怎么实现的呢?

      DEDE使用DELPHI的RTTL原理,所以可以轻易地列出所有PUBLISHED下面的函数及过程名--注意是过程名,所以通过DEDE可以轻松地找到函数或过程的入口。

      如果你真的想阻止DEDE简单准确地跳到函数或过程里,可以尝试下面的方法:
      不要用DELPHI自动生成事件,或者是最后自己手工删除在属性框里对这些事件引用,改为动态生成事件。
         但 注意:这比较累,要写些动态代码。是不是要真的这样做,你自己考虑好。
      把PRIVATE上面的函数或过程移动到PRIVATE里面定义。

      这样作的好处是:
       DEDE无法直接列出实名的过程或函数;但某些版本仍可以列出全部随机命名的事件,但这时DEDE可以提供的帮助就有限了;
       由于事件是动态生成,所以想通过查找FORM里的类似OnClick事件就找到入口地址的努力化为泡影,或者说增加了难度。
       如果你的一个FORM都是利用上面的方法生成的--比如连FORMCREATE你都自定义,那DEDE在显示事件栏里会显示空。

       缺点:
         手工多;必须删除属性框里生成的事件代码,比较累,偶尔玩玩还可以。


    简单的例子:
    //=========================================================
    unit Unit1;  
    interface   
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;

    type
      TForm1 = class(TForm)
        Button1: TButton;
      private
        { Private declarations }
        //!!!
        procedure yourFormCreate;
        procedure yourFormClose(Sender: TObject; var Action: TCloseAction);
        procedure yourFormDestroy(Sender: TObject);

        procedure yourButton1Click(Sender: TObject);

      public
        { Public declarations }

        constructor Create(AOwner: TComponent); override;
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    constructor TForm1.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);

      yourFormCreate;

    end;

    procedure TForm1.yourFormCreate;
    begin      
    //!!!!!!!
        OnClose                         := yourFormClose;
        OnDestroy                       := yourFormDestroy;
        Button1.OnClick                 := yourButton1Click;

    end;

    procedure TForm1.yourFormClose(Sender: TObject; var Action: TCloseAction);
    begin
      showmessage('yourFormClose');
      close;
    end;

    procedure TForm1.yourFormDestroy(Sender: TObject);
    begin
      showmessage('yourFormDestroy');
    end;
    procedure TForm1.yourButton1Click(Sender: TObject);
    begin
      showmessage('yourButton1Click');
    end;

    end.
    //=========================================================

    以上是我试出来的,欢迎大家抨击不当之处,谢谢!

    新建工程,只添加一个Button1,大家把以上代码复制到UNIT1.pas里,接着就编译,然后用DEDE载入,看看可以看到什么??呵呵,在DEDE里查看FORM1的事件列表是“空”的!

      注意:与方法一结合起来,会更有效地阻止他人取得事件入口点。方法一自己去试吧,就不贴代码了。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-2-3 19:13:59 | 显示全部楼层
    哦 那全部动态生成控件好了 这个方法 其实没什么太大用!~

    六楼方法真的不错
    不过没测试

    [ 本帖最后由 ww-jack 于 2007-2-3 19:15 编辑 ]
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-9-13 15:03:26 | 显示全部楼层
    太厉害了
    学习
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-9-14 09:46:29 | 显示全部楼层
    /:good 有意思,学习!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-11-11 23:01:54 | 显示全部楼层
    用delphi就不要怕被反编译,因为D的机制就是一块一块的内容...
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表