http://www.cnsw.org/bbs/thread-3547-1-1.html
ANTI-DEDE的幾個方法ANTI-DEDE的幾個方法
DEDE對於DELPHI程式的威脅是很大的,怎樣ANTI-DEDE呢?
方法一:在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的事件列表是“空”的!
注意:與方法一結合起來,會更有效地阻止他人取得事件進入點。方法一自己去試吧,就不貼代碼了。