热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用hook实现dll注入详解

需要一个用来注入的dll(inject.dll)及一个调用程序(caller.exe)流程:caller.exeprocedureTestHook;varpwnd,hChild,hwndInje

需要一个用来注入的dll(inject.dll)及一个调用程序(caller.exe)
流程:
caller.exe
procedure TestHook;
var pwnd,hChild, hwndInject hwnd;
msgtmsg;
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_hInjectfrmhwnd;
function SetInjectHook(dwThreadidDWORD)boolean;
begin
result = false;
如果线程标志为0则用于去掉钩子,否则进行动态库注入
if dwThreadid0 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_hhook0);
去掉钩子
result = unHookWindowsHookEx(g_hhook);
g_Hhook = 0;
end;
end;
定义一个全局的是否第一个消息的标志
Var
fFirstTimeboolean = 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;

 


推荐阅读
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之六 || API项目整体搭建 6.1 仓储模式
    代码已上传Github+Gitee,文末有地址  书接上文:前几回文章中,我们花了三天的时间简单了解了下接口文档Swagger框架,已经完全解放了我们的以前的Word说明文档,并且可以在线进行调 ... [详细]
  • PreparedStatement防止SQL注入
    添加数据:packagecom.hyc.study03;importcom.hyc.study02.utils.JDBCUtils;importjava.sql ... [详细]
  • 一、MyEclipse中的一些常用的快捷键:ctrl+shift+x大写ctrl+shift+y小写alt+内容提示写住方法的时候可以先写main然后按alt+就可以了ctrl+1 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • PrivateConstLF_FACESIZE32PrivateConstCF_PRINTERFONTS&H2PrivateConstCF_SCREENFONTS ... [详细]
  • java给iphone应用实现推送
    根据公司项目所需,需要对iphone应用进行消息推送,一开始选的是php,但是php语言知识略懂,开发起来比较麻烦,所有就用比较熟悉的java语言进行消息推送。需要依赖的jar包: ... [详细]
  • 1、连接操作相关的命令quit:关闭连接(connection)auth:简单密码认证2、对value操作的命令exists(key):确认一个key是否存在del(key):删除一个keytype( ... [详细]
author-avatar
税钱AA
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有