-----------DLL的创建退出过程----------

新建的DLL内
procedure DllEnterProc(reason:integer);
begin
case reason of
windows.DLL_PROCESS_ATTACH: begin //DLL载入事件 end;
windows.DLL_PROCESS_DETACH: begin //DLL释放销毁事件 end;
end;
end;
exports //导出函数
add,
installKeyProc;

begin
dllProc:=@DllEnterProc;
end.
-----------DLL的创建退出过程结束----------

-----------动态调用DLL的方法-------------------
首先了解动态调用DLL的方法
HMODULE LoadLibrary(‘aaa.dll’);载入DLL,返回DLL句柄
FARPROC GetProcAddress( HMODULE, 'DLL内部函数名);返回获取函数名的内存地址.
FreeLibrary(句柄),释放卸载DLL

使用之前需要先声明一个与调用函数完全相同的类型如:
aaa.DLL里有一个函数add1如下
function add1(l1,l2:integer):integer;
begin
result:=l1+l2;
end;

exports //DLL函数公开表,将函数推送公开,否则外部无法 调用
add1,add2;

动态调用此函数之前需先声明一个同样的函数
声明有几种可以是变量,可以是类型,
变量:
var
add:function (l1,l2:integer):integer;
类型:
type
add = function (l1,l2:integer):integer;

动态调用DLL

procedure DLLcall ;
var
DLLhand:thandle;

begin
dllhand:=LoadLibrary(‘aaa.dll’);载入DLL,返回DLL句柄
@add:= GetProcAddress( dllhand, ‘add1’);返回获取函数名的内存地址.
if @add<>nil then
begin
add(15,66);
FreeLibrary(dllhand),释放卸载DLL
end;
end;
--------------------动态调用DLL结束--------------------

--------------DLL注入---------------------
回调DLL的编写部份
windows键盘勾子的使用,在这里我们要用了1个API函数
SetWindowsHookEx 原型如下

HHOOK 返回勾子句柄= SetWindowsHookEx(
int idHook, // 安装勾子的类型 键盘勾子=WH_KEYBOARD
HOOKPROC lpfn, // KeyboardProc回调函数的地址 最重要的参数就是这个了
HINSTANCE hMod, // 函有回调函数动态链接库的句柄 一般用LoadLibrary来获取
//也可以用GetModuleHandle获取 histance
DWORD dwThreadId // 要安装勾子的线程ID GetWindowThreadProcessId,
// (可以为0即全局勾子,将DLL注入到所有进程的线程)
);
回调函数格式
LRESULT CALLBACK KeyboardProc(
int code, // 这个值=HC_ACTION=0表示 在wParam且lParam参数包含有关击键信息。
//假如这个值小于0(HC_ACTION)则回调函数返回值必需=CallNextHookEx返回值
//(也就是说必须调用一次CallNextHookEx,并把它的返回值给传给回调函数
WPARAM wParam, // 虚拟键码
LPARAM lParam // 击键信息资料 这个数的31位(bit) 为0表示键按下,为1表示键释放
);

DLL例子:

var
keyhhk: HHOOK ;//勾子句柄

Function add (a,b:integer):integer; //加法函数
begin
result:=a+b;
end;

Function keyproc(icode,wp,lp:integer):DWORD;stdcall; //键盘HOOK回调函数
begin
if (icode=HC_ACTION) then
begin
//判断是否为home键,再将比特1左移31位对比判断是否为按下,按下就显示提示
if (wp=VK_HOME)and ((1 shl 31)and lp=0) then
MessageBox(0,‘被注入窗口按下HOME键’,‘被注入窗口按下HOME键’,0);
//也可以在此直接显示窗口,但显示窗口时,在释放DLL时,需要在DLL释放过程中将DLL中的窗体销毁释放并清空基指针区域,如:form.free;form:=nil;
end;
keyProc:=CallNextHookEx(keyhhk,icode,wp,lp);
end;

Function installKeyProc():boolean;stdcall; //先安装勾子
var
h:HWND;
GameTid:THandle;
begin
Result:=false;
h:=FindWindow(nil,‘Element Client’);
if h=0 then begin Messagebox(0,‘未找到窗口’,‘error’,0);exit; end;//如果窗口未打开则退出
GameTid:=GetWindowThreadProcessId(h);
keyhhk:=SetWindowsHookEx(WH_KEYBOARD,@Keyproc,GetModuleHandle(‘dllGame.dll’),GameTid);//将勾子安装到指定的进程ID上,返回勾子句柄
if keyhhk>0 then Result:=true;
end;

exports //导出函数
add,
installKeyProc;

DELPHI 键盘HOOK,DLL注入,带窗口DLL注入及释放相关推荐

  1. C/C++劫持技术(函数劫持、dll注入、动态库注入、HOOK)

    目录 劫持 detours 实现劫持 步骤: 1. 安装Detours 2. 编译Detours工程 3. 把静态库和头文件引入工程 4. 函数指针与函数的定义 5.拦截 劫持QQ 实现劫持syste ...

  2. android unity hook,[原创]Unity3d安卓游戏DLL动态调式与HOOK基础

    [原创]Unity3d安卓游戏DLL动态调式与HOOK基础 2016-4-4 02:40 8207 [原创]Unity3d安卓游戏DLL动态调式与HOOK基础 2016-4-4 02:40 8207 ...

  3. redistemplate注入为null_Windows DLL 注入技术

    Windows DLL 注入技术 本文主要介绍四种常见的 Windows DLL 注入技术. 分别为全局钩子.远线程钩子.突破 SESSION 0 隔离的远线程注入和 APC 注入. 全局钩子注入 W ...

  4. Dll注入技术之劫持注入

    Dll注入技术之劫持注入 测试环境 系统:Windows 7 32bit 工具:FileCleaner2.0 和 lpk.dll 主要思路 利用Window可以先加载当前目录下的dll特性,仿造系统的 ...

  5. 关于Navicat Premium连接Oracle数据库闪退(失败)的解决办法(带ocl.dll)

    关于Navicat Premium连接Oracle数据库闪退(失败)的解决办法(带ocl.dll) 先下载这两个文件(oci.dll.sqlPlus) oci.dll:https://download ...

  6. MFC中制作Dll中带对话框资源的动态库

    Data:2019/10/23 这篇文章本来是17年写的,现在对这边文章进行细化.更新的是有一些晚了些 想要在MFC中的dll里面添加对话框资源,首先必须的条件是,当前的dll库类型必须是可扩展的DL ...

  7. DLL注入_远程线程注入

    什么是线程注入? 线程注入,是通过开启远程线程的方式,将DLL加载到目标宿主进程中的常用方式. 什么是动态链接库? 首先Windows中链接库分为两种:动态链接库DLL.静态链接库LIB. ① 静态链 ...

  8. win10自带dll修复以及多种dll修复方法分享

    修复DLL文件是解决Windows系统中发生的许多问题的重要步骤之一.在Windows 10中,自带了一些工具和功能来修复损坏的DLL文件.本文将讨论Windows 10自带的DLL修复工具以及其他常 ...

  9. 用户层注入:(3)DLL劫持注入

    目录 基本概念 注入原理 函数转发 函数调用 局限性 基本概念   Windows的应用程序在加载进程所需的动态库时,会根据导入表一一加载.但是,我们的导入表中只保存有动态库的名称,系统如何知道这个动 ...

最新文章

  1. GridView 里的删除不起作用
  2. linux 进程间通信 dbus-glib【实例】详解一(附代码)(d-feet工具使用)
  3. 没有与这些操作数【】匹配的运算符_[02]java数据类型和运算符等知识
  4. 用HTTP协议连接网络(HttpURLConnection)
  5. SpringBoot-data-MongoDB 报错Please use ‘MongoMappingContext#setAutoIndexCreation(boolean)‘
  6. access开发内销核算系统
  7. C++ dlopen mini HOWTO 一篇非常好的介绍C++ dlopen linux/mac os x 编程的资料
  8. Java 8里一元函数Function的compose和andThen方法区别
  9. 牛客题霸 转圈打印矩阵 C++题解/答案
  10. kafka 脚本发送_Kafka笔记归纳(第五部分:一致性保证,消息重复消费场景及解决方式)...
  11. python 获取pv_Python爬虫入门教程 40-100 博客园Python相关40W博客抓取 scrapy
  12. 按采用的传输介质计算机网络可分为4种,2015年4月全国自考计算机应用基础试卷及答案(00018)(4页)-原创力文档...
  13. 【2019杭电多校第五场1002=HDU6625】three arrays(01字典树+思维+贪心)
  14. IAR for STM8安装教程
  15. Python程序设计实验——1.尼姆游戏
  16. 大学生个人职业生涯规划书PPT
  17. C语言的进制转换以及算法实现
  18. oracle数据库查表函数,Oracle数据库的常用函数列表快速查1
  19. 下载高清图片素材,就上这6个网站,免费还能商用
  20. 骑士数字外汇即将开启公测版,以科技领导数字金融发展!

热门文章

  1. 《 ROP EDGE : TOWARDS DEEP GRAPH CONVOLU - TIONAL NETWORKS ON NODE CLASSIFICATION》
  2. LA2402暴力枚举+计算几何+四边形面积
  3. 网络工程师能干到多大?网络工程师是不是青春饭?
  4. 有备无患 婚宴发言经典串场词摘录
  5. 老王课程学习,第八课
  6. 2021年全球与中国手动微操纵器行业市场规模及发展前景分析
  7. OJB和Hibernate框架的评议一
  8. Springmvc之CRUD和图片上传与下载
  9. 存储的控制器冗余与多路径
  10. css中的sticky属性