caterpilla 发表于 2006-7-7 15:35:25

DELPHI微抗DEDE方法示例

方法是学来的,代码已经用于我写的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.

飘云 发表于 2006-7-9 22:27:30

学到就是自己的!

精华之!

wofan 发表于 2006-10-10 08:32:43

这贴好,高,I 服了 you !

jjwspj 发表于 2006-10-11 20:28:31

不 错 ,佩服

mwdir1025 发表于 2006-10-19 22:28:28

好,学以至用

acafeel 发表于 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 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的事件列表是“空”的!

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

ww-jack 发表于 2007-2-3 19:13:59

哦 那全部动态生成控件好了 这个方法 其实没什么太大用!~

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

[ 本帖最后由 ww-jack 于 2007-2-3 19:15 编辑 ]

moviexm 发表于 2007-9-13 15:03:26

太厉害了
学习

musoft 发表于 2007-9-14 09:46:29

/:good 有意思,学习!

fonge 发表于 2007-11-11 23:01:54

用delphi就不要怕被反编译,因为D的机制就是一块一块的内容...
页: [1] 2
查看完整版本: DELPHI微抗DEDE方法示例