飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 14383|回复: 13

[转帖]DELPHI ANTI-DEDE的几段代码

[复制链接]

该用户从未签到

发表于 2007-3-5 10:58:39 | 显示全部楼层 |阅读模式
搜索窗口名:

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

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

[ 本帖最后由 fonge 于 2007-3-5 21:07 编辑 ]
PYG19周年生日快乐!

该用户从未签到

发表于 2007-3-5 11:02:53 | 显示全部楼层
其实既然开了加密交流组,那就应该开设程序编程班进行更好的学习!
我的建议开个VB之类的编程学习班!
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2007-3-5 14:29:25 | 显示全部楼层
原帖由 pygbian 于 2007-3-5 11:02 发表
其实既然开了加密交流组,那就应该开设程序编程班进行更好的学习!
我的建议开个VB之类的编程学习班!



我建议搞个delphi的编程学习班,俺有兴趣学习~~~,谁来开个班?
PYG19周年生日快乐!

该用户从未签到

发表于 2007-3-5 14:38:13 | 显示全部楼层
咱都想学,开哪个班我都参加...:lol:
PYG19周年生日快乐!

该用户从未签到

发表于 2007-3-5 15:01:59 | 显示全部楼层
原帖由 黑夜彩虹 于 2007-3-5 14:29 发表



我建议搞个delphi的编程学习班,俺有兴趣学习~~~,谁来开个班?



ho~ho~
我也偏向于delphi编程一边!:lol:
对于VB,不发表言论,
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2007-3-5 15:17:56 | 显示全部楼层
版规基本上写好了,但还有待讨论修改。。。

今天似乎变成了见习版主,连贴都开不了了,只能借助这个来回复~~~/fad
PYG19周年生日快乐!

该用户从未签到

发表于 2007-3-5 15:19:13 | 显示全部楼层
原帖由 黑夜彩虹 于 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还是其他方法哦!~
PYG19周年生日快乐!

该用户从未签到

发表于 2007-3-5 15:43:15 | 显示全部楼层
别那么死行不
办法是想出来的!
PYG19周年生日快乐!

该用户从未签到

发表于 2007-3-5 16:23:54 | 显示全部楼层
这里我们都不能发贴,大概是老大的限制!
PYG19周年生日快乐!

该用户从未签到

发表于 2007-9-15 16:38:39 | 显示全部楼层
勉强能看懂第一个,不懂编程/:002
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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