需要注入的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函数并没有被调用,请问这是为什么?

解决方案 »

  1.   


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

  2.   

    你把那个键盘钩子的DLL注入到那个线程里了,注入完成后,用Module32First,Module32next查一下那个线程里是否包含了你注入的这个key.dll。。如果觉得这样麻烦,就在key.dll中广播一个子定义消息。
      

  3.   

    我用超级兔子进程查看器查了指定进程调用的模块,包含了这个key.dll,而且key.dll中会跳出一次对话框显示oldhook的值,只是HookProc不知为何不能执行
      

  4.   

    真是功夫不负有心人啊,乱搞了一天竟然找到了解决办法,只是不知道为什么,请各位高手指点:
    把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;  
      

  5.   

    看你原来写的
    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注册成了键盘钩子 ,这样,你的钩子也许是可以用了,但好像没有实现进程的隐藏啊。
      

  6.   

    看你的代码都看糊涂了,
    看到你的这一段
      if @RealDLL<>nil then
      RealDLL//这里的readldll似乎应该是完成将key.dll的HookProc注册成钩子的位置,貌似应该是在这里有一个类似你程序中死循环的东西,其实不是死循环,只是一个消息循环,直到调用key.dll中用来卸载的代码
      else
      begin
        MessageBox(0,'f','dd',0);
        FreeLibrary(LibHd);
      end;
    end;
      

  7.   

    to wudi_1982
    在中间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,真是百思不得其解