[转帖]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的事件列表是“空”的!
注意:与方法一结合起来,会更有效地阻止他人取得事件入口点。方法一自己去试吧,就不贴代码了。
[ 本帖最后由 fonge 于 2007-3-5 21:07 编辑 ] 其实既然开了加密交流组,那就应该开设程序编程班进行更好的学习!
我的建议开个VB之类的编程学习班! 原帖由 pygbian 于 2007-3-5 11:02 发表
其实既然开了加密交流组,那就应该开设程序编程班进行更好的学习!
我的建议开个VB之类的编程学习班!
我建议搞个delphi的编程学习班,俺有兴趣学习~~~,谁来开个班? 咱都想学,开哪个班我都参加...:lol: 原帖由 黑夜彩虹 于 2007-3-5 14:29 发表
我建议搞个delphi的编程学习班,俺有兴趣学习~~~,谁来开个班?
ho~ho~
我也偏向于delphi编程一边!:lol:
对于VB,不发表言论, 版规基本上写好了,但还有待讨论修改。。。
今天似乎变成了见习版主,连贴都开不了了,只能借助这个来回复~~~/fad 原帖由 黑夜彩虹 于 2007-3-5 10:58 发表
搜索窗口名:
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
...
以上代码对付未修改CAPTION的有效果但是修改无效
就是说上面代码无效哦!~
对付DEDE还是其他方法哦!~ 别那么死行不
办法是想出来的! 这里我们都不能发贴,大概是老大的限制! 勉强能看懂第一个,不懂编程/:002
页:
[1]
2