网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Delphi
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.Delphi开发者快速解决问题的两大.
.如何使程序在运行时自动注册Acti.
.Delphi嵌入式汇编一例.
.singleton之我见.
.编译原理的一个简单的枚举算法.
.Delphi中的包(一):关于exe的编.
.Jujube项目架构设计.
.组件实例的命名规则.
.delphi2005探讨之四.
.控件在运行状态改变大小.
.borland工程师如何保证父类(TStr.
.delphi+Oracle做的三层结构的干部.
.进程间传递消息(发送和接收系统.
.COM程序编写入门(全文-2).
.Delphi:易混淆的概念.
.自动化每日构建(二)用Ant来完成.
.开发设计图文并茂的报表的组件.
.用Delphi开发报表打印的ASP组件.
.如何将C/C++程序转译成Delphi(十.
.NeHe的opengl教程delphi版(8)---.

用hook实现dll注入详解

发表日期:2006-2-4


需要一个用来注入的dll(inject.dll)及一个调用程序(caller.exe)
流程:
 
caller.exe
procedure TestHook;
var pwnd,hChild, hwndInject :hwnd;
    msg:tmsg;
begin
   //通过窗口标题用FindWindow找到要注入的程序的主窗口句柄pwnd
   pwnd := findwindow('Progman',nil);
   //用FindwindowEx(hMain,0,nil,nil)找到要处理的子窗口句柄hChild
   hChild := findWindowEx(pwnd,0,nil,nil);
   //用getwindowThreadProcessid(hChild,nil)找到要注入的线程
   dwThreadID := getwindowThreadProcessid(hChild,nil);
   //调用 inject.dll的SetInjectHook方法
   SetInjectHook(dwThreadID);
   //等待消息返回
   getmessage(msg,0,0,0);
   //找到注入的窗口
   hwndInject:= findwindow(nil,'InjectForm');
   //发送控制消息,将目标窗体的句柄作为wparam,控制参数以lparam传入
   sendMessage( hwndInject, wm_app,hChild,integer(true));
   //关闭注入的窗口
   sendMessage( hwndInject,wm_close,0,0);
   //等待窗口关闭
   sleep(500);
   //检查是否成功关闭
   assert(not iswindow( hwndInject));
   //去掉挂钩
   setDipsHook(0);
end;  

//下面说明 Inject.dll的SetInjectHook的具体操作
在全局定义以下变量
 var
   g_hhook :Hhook=0;
   g_dwThreadidInject :dword=0;
   g_hInjectfrm:hwnd;


function SetInjectHook(dwThreadid:DWORD):boolean;
begin
  result := false;
  //如果线程标志为0则用于去掉钩子,否则进行动态库注入
  if dwThreadid<>0 then
  begin
    assert(g_hhook=0);
    //保存当前线程的ID到 g_dwThreadidInject
    g_dwThreadidInject := getCurrentThreadid;
    //下一个GetMessage的钩子到目标线程
    //GetMsgProc是在下面定义的一个函数,在第一次调用时将自定义的form在目标线程中创建出来
    //这样就能通过这个自定义的form对目标线程进行进程内控制了
    g_hhook := setWindowsHookEx(wh_getMessage,GetMsgProc,hInstance,dwThreadid);
    result := g_hhook <> null;
    if result then
      //发一个空的信息以便于立即创建这个自定义form
      result := postThreadMessage(dwThreadid, wm_Null,0,0);
    //等待半秒钟,以保证调用者可以找到这个刚创建的form
    sleep(500);
  end else
  begin
    assert(g_hhook<>0);
    //去掉钩子
    result := unHookWindowsHookEx(g_hhook);
    g_Hhook := 0;
  end;
end;

//定义一个全局的是否第一个消息的标志
var
  fFirstTime:boolean = true;
//这个函数用于在收到第一个消息时创建自定义窗体,以便于远程控制
function GetMsgProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
begin
  //如果是第一次
  if fFirstTime then
  begin
    fFirstTime := false;
    //创建窗体
    InjectFrm := TinjectFrm.create(nil);
    //保存窗体句柄
    g_hInjectfrm := InjectFrm.handle;
  end;
  //调用默认处理,这一句可不能忘记
  result := callNexthookEx(g_hhook,code,wparam,lparam);
end;

上一篇:判断MonthCalander中鼠标点中了日期还是翻页按钮! 人气:3486
下一篇:[TButton]运行时动态创建和删除按钮 人气:4709
浏览全部Delphi的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐