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. 学到就是自己的!
精华之! 这贴好,高,I 服了 you ! 不 错 ,佩服 好,学以至用 [转]
反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:15 编辑 ] 太厉害了
学习 /:good 有意思,学习! 用delphi就不要怕被反编译,因为D的机制就是一块一块的内容...
页:
[1]
2