需要注入的key.dll的代码如下:
function HookProc(ncode,wparam,lparam:Integer):Integer;stdcall;
begin
MessageBox(0,'sfsfasfsafsaf','fsf',0);
Result:=CallNextHookEx(oldhook,ncode,wparam,lparam);
end;
procedure SetHook;export;
begin
oldhook:=SetWindowsHookEx(WH_KEYBOARD,@HookProc,HInstance,0);
MessageBox(0,PChar(inttostr(oldhook)),'sd',0);
end;
exports
SetHook;
===========================================================================
运行后发现,key.dll确认已被注入到指定进程,key.dll的SetHook过程确实执行了,因为有一个对话框跳出并显示了一串数字,但是按键后却没有任何对话框跳出来,也就是说key.dll的HookProc函数并没有被调用,请问这是为什么?
function HookProc(ncode,wparam,lparam:Integer):Integer;stdcall;
begin
MessageBox(0,'sfsfasfsafsaf','fsf',0);
Result:=CallNextHookEx(oldhook,ncode,wparam,lparam);
end;
procedure SetHook;export;
begin
oldhook:=SetWindowsHookEx(WH_KEYBOARD,@HookProc,HInstance,0);
MessageBox(0,PChar(inttostr(oldhook)),'sd',0);
end;
exports
SetHook;
===========================================================================
运行后发现,key.dll确认已被注入到指定进程,key.dll的SetHook过程确实执行了,因为有一个对话框跳出并显示了一串数字,但是按键后却没有任何对话框跳出来,也就是说key.dll的HookProc函数并没有被调用,请问这是为什么?
中间DLL的代码如下:
procedure Load;
var
LibHd:THandle;
begin
Jumped:=True;
LibHd:=LoadLibrary(PChar('D:\Program Files\Borland\Delphi7\Projects\hook\Jump\key.dll'));
RealDLL:=GetProcAddress(LibHd,'SetHook');
if @RealDLL<>nil then
RealDLL
else
begin
MessageBox(0,'f','dd',0);
FreeLibrary(LibHd);
end;
end;function JumpProc(ncode:Integer;wparam:WPARAM;lparam:LPARAM):LRESULT;stdcall;
var
pid:Cardinal;
begin
if Jumped=False then
begin
ThreadHd:=CreateThread(nil,0,@Load,nil,0,pid);
Jumped:=True;
end;
Result:=CallNextHookEx(JumpHook,ncode,wparam,lparam);
end;procedure SetHook(ExpID:DWORD);stdcall;export;
begin
JumpHook:=SetWindowsHookEx(WH_GETMESSAGE,@JumpProc,HInstance,ExpID);
Jumped:=False;
end;
把key.dll中SetHook的代码稍加修改,竟然加入一个死循环就可以了,实在不解:
procedure SetHook;stdcall;
var
i:Integer;
begin
oldhook:=SetWindowsHookEx(WH_KEYBOARD, HookProc, HInstance, 0);
while True do
begin
Sleep(100);
i:=i+0;
end;
end;
procedure SetHook(ExpID:DWORD);stdcall;export;
begin
JumpHook:=SetWindowsHookEx(WH_GETMESSAGE,@JumpProc,HInstance,ExpID);
Jumped:=False;
end;好像应该是这样SetWindowsHookEx(WH_GETMESSAGE,JumpProc,HInstance,0);看你后面写的,
oldhook:=SetWindowsHookEx(WH_KEYBOARD, HookProc, HInstance, 0);,你直接在中间用来安装key.dll的dll中把hookproc注册成了键盘钩子 ,这样,你的钩子也许是可以用了,但好像没有实现进程的隐藏啊。
看到你的这一段
if @RealDLL<>nil then
RealDLL//这里的readldll似乎应该是完成将key.dll的HookProc注册成钩子的位置,貌似应该是在这里有一个类似你程序中死循环的东西,其实不是死循环,只是一个消息循环,直到调用key.dll中用来卸载的代码
else
begin
MessageBox(0,'f','dd',0);
FreeLibrary(LibHd);
end;
end;
在中间DLL中我现在还是用的是和原来完全相同的代码,如果换成
SetWindowsHookEx(WH_GETMESSAGE,JumpProc,HInstance,0);则应该会出现这样的问题(我没测试,因为怕死机,我为了搞这个三级跳已经死了N次机了):中间DLL被映射到所有进程中去,然后每个映射的中间DLL都在挂上一个键盘钩子,结果键盘钩子就被多次重复加载。
关于隐藏进程:
中间DLL挂上键盘钩子时是以被注入的进程的身份来挂钩的,所以key.dll就属于被中间DLL注入的那个进程的线程了,而不是我自己的EXE的线程了,所以注入完成购我的EXE就可以退出了,而key.dll就可以一直留在被注入的进程中发挥作用了
还有一个现象:
如果
while True do
begin
Sleep(100);
i:=i+0;
end;这一段不写Sleep(100);这一句就会造成被注入的进程失去响应,而不写while这一段又不能实现HookProc,真是百思不得其解