DELPHI 键盘HOOK,DLL注入,带窗口DLL注入及释放

-----------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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值