Delphi用hook实现dll注入详解

需要一个用来注入的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;

时间: 2024-09-12 22:34:51

Delphi用hook实现dll注入详解的相关文章

JavaScript中的依赖注入详解

 这篇文章主要介绍了JavaScript中的依赖注入详解,本文讲解了requirejs/AMD方法.反射(reflection)方法等内容,需要的朋友可以参考下     计算机编程的世界其实就是一个将简单的部分不断抽象,并将这些抽象组织起来的过程.JavaScript也不例外,在我们使用JavaScript编写应用时,我们是不是都会使用到别人编写的代码,例如一些著名的开源库或者框架.随着我们项目的增长,我们需要依赖的模块变得越来越多,这个时候,如何有效的组织这些模块就成了一个非常重要的问题.依赖

AngularJS 依赖注入详解及示例代码_AngularJS

依赖注入是一个在组件中给出的替代了硬的组件内的编码它们的依赖关系的软件设计模式.这减轻一个组成部分,从定位的依赖,依赖配置.这有助于使组件可重用,维护和测试. AngularJS提供了一个至高无上的依赖注入机制.它提供了一个可注入彼此依赖下列核心组件. 值 工厂 服务 提供者 常值 值 值是简单的JavaScript对象,它是用来将值传递过程中的配置相位控制器. //define a module var mainApp = angular.module("mainApp", []);

Spring中属性注入详解_java

本文演示了int.String.数组.list.set.map.Date等属性的注入. 其中Date类型的注入则是借助了Spring提供的属性编辑器来实现的,首先是用到的五个实体类 package com.jadyer.model; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; /** * 常见属性的注入 * @see 包括int,String,Array,lis

AngularJS $injector 依赖注入详解_AngularJS

推断式注入 这种注入方式,需要在保证参数名称与服务名称相同.如果代码要经过压缩等操作,就会导致注入失败. app.controller("myCtrl1", function($scope,hello1,hello2){ $scope.hello = function(){ hello1.hello(); hello2.hello(); } }); 标记式注入 这种注入方式,需要设置一个依赖数组,数组内是依赖的服务名字,在函数参数中,可以随意设置参数名称,但是必须保证顺序的一致性. v

面向对象编程依赖注入详解_java

说说依赖注入 在面向对象编程中,我们经常处理处理的问题就是解耦,程序的耦合性越低表明这个程序的可读性以及可维护性越高.控制反转(Inversion of Control或IoC)就是常用的面向对象编程的设计原则,使用这个原则我们可以降低耦合性.其中依赖注入是控制反转最常用的实现. 什么是依赖 依赖是程序中常见的现象,比如类Car中用到了GasEnergy类的实例energy,通常的做法就是在Car类中显式地创建GasEnergy类的实例,并赋值给energy.如下面的代码 interface E

Delphi中的线程类 - TThread详解&lt;转&gt;

Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了.然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充.线程本质上是进程中一段并发运行的代码.一个进程至少有一个线程,即所谓的主线程.同时还可以有多个子线程.当一个进程中用到超过一个线程时,就是所谓的"多线程".那么这个所谓的"一段代码"

AngularJS学习笔记之依赖注入详解_AngularJS

     最近在看AngularJS权威指南,由于各种各样的原因(主要是因为我没有money,好讨厌的有木有......),于是我选择了网上下载电子版的(因为它不要钱,哈哈...),字体也蛮清晰的,总体效果还不错.但是,当我看到左上角的总页码的时候,479页....479....479....俺的小心脏被击穿了二分之一有木有啊,上半身都石化了有木有啊,那种特别想学但是看到页码又不想学的纠结的心情比和女朋友吵架了还复杂有木有啊,我平常看的电子书百位数都不大于3的好伐! 哎,原谅我吧,我应该多看几本

Spring 3.0 注解注入详解

原文地址: http://developer.51cto.com/art/201104/255395.htm 一.各种注解方式 1.@Autowired注解(不推荐使用,建议使用@Resource) @Autowired可以对成员变量.方法和构造函数进行标注,来完成自动装配的工作.@Autowired的标注位置不同,它们都会在Spring在初始化这个bean时,自动装配这个属性.要使@Autowired能够工作,还需要在配置文件中加入以下 Xml代码 <bean class="org.sp

spring学习笔记(4)依赖注入详解

常用的注入方式有四种: 1. 属性注入 2. 构造方法注入 3. 工厂方法注入 4. 注解注入 下面先定义我们后面用到的POJO类: package test; public class User { private String name; private String gender; public String getName() { return name; } public void setName(String name) { this.name = name; } public St