一个DLL中包含hook,怎样才能靠CreateRemoteThread注入到其他进程,也就是说让hook安装到另一进程中,或者安装到DLL中..
 只要不是我的进程就可以~~ 希望各位大侠帮忙~我实在没分了.. 不想再沉了... 两个贴一共120分,我肯定都会给~

解决方案 »

  1.   

    你是让别的程序来执行你的SetWindowsHookEx函数吗??
    如果是这样SetWindowsHookEx的HOOKPROC 参数要重新修正,简单的方法是你用CreateRemoteThread把你取得的新HOOKPROC 地址作为参数传过去你那一贴发贴人叫c8923704,别怕嘛,你可以
    for i=e8923704 to z8923704 do
    begin
      发帖
    end;
      

  2.   

    你那一贴发贴人叫c8923704,别怕嘛,你可以 
    for i=e8923704 to z8923704 do 
    begin 
      发帖 
    end; 哈哈 ...  您真的很幽默!
    我这么做是因为我没有分..我没有时间泡论坛,我没有技术来回答他人的问题,没有更多的可用分,只能依靠号多和系统给的分,来提问~ 请谅解!
    你是让别的程序来执行你的SetWindowsHookEx函数吗?? 
    如果是这样SetWindowsHookEx的HOOKPROC 参数要重新修正,简单的方法是你用CreateRemoteThread把你取得的新HOOKPROC 地址作为参数传过去 
    您的意思我听懂些了... 不过可以给我个具体点的例子吗... 我不怎么开窍
      

  3.   

    这么快就回复了??。。
    你在调用CreateRemoteThread不是先要先VirtualAllocEx分配内存,然后WriteProcessMemory把你的目标代码写进去嘛,照你上一贴,你要分配2块空间给2个函数(当然可以一次性分配,我这里为了说清楚分开来讲),你就有2个分配的地址,把你的HOOKPROC 分配的那一块地址,作为CreateRemoteThread的参数来传给InstallHook,,那你就可以使用传入的这个参数来设置SetWindowsHookEx的hookproc参数了。
    老实讲,你为什么要让别的程序来执行你的SetWindowsHookEx, 如果只要别的程序来执行代码的话,SetWindowsHookEx或者CreateRemoteThread 单独使用任何一个函数都可以达到要求,你是为了什么躲避这样做????
    代码例子我就不写了,现在网上有很多例子,稍微改一下就可以了,况且我也不建议copy代码直接使用。
      

  4.   

    我一直在等嘛 呵呵...按您说的... 我现在是在DLL中定义了InstallHook,HOOKPROC
    地址我想不用通过传递..因为他们本是一个DLL,是不是我的思维哪里出了混乱?
      

  5.   

     我给你贴段我的代码..          pfnStartAddr := GetProcAddress(LoadLibrary('Kernel32.dll'), 'LoadLibraryW');
              hRemoteThread := CreateRemoteThread(hRemoteProcess, nil, 0,
                pfnStartAddr, pszLibFileRemote, 0, lpThreadId);
              WriteProcessMemory(hRemoteProcess, pszLibFileRemote,
              pChar('0'), memSize, WriteSize);          pfnStartAddr := GetProcAddress(LoadLibrary('Hook.dll'), 'InstallHook');
              hRemoteThread := CreateRemoteThread(hRemoteProcess, nil, 0,
                pfnStartAddr, pszLibFileRemote, 0, lpThreadId);
    我现在是通过CreateRemoteThread,来调用InstallHook,  你这样一说,我倒看出来.. 这是两个线程~~,,  
      

  6.   

     我给你贴段我的代码..          pfnStartAddr := GetProcAddress(LoadLibrary('Kernel32.dll'), 'LoadLibraryW');
              hRemoteThread := CreateRemoteThread(hRemoteProcess, nil, 0,
                pfnStartAddr, pszLibFileRemote, 0, lpThreadId);
              WriteProcessMemory(hRemoteProcess, pszLibFileRemote,
              pChar('0'), memSize, WriteSize);          pfnStartAddr := GetProcAddress(LoadLibrary('Hook.dll'), 'InstallHook');
              hRemoteThread := CreateRemoteThread(hRemoteProcess, nil, 0,
                pfnStartAddr, pszLibFileRemote, 0, lpThreadId);
    我现在是通过CreateRemoteThread,来调用InstallHook,  你这样一说,我倒看出来.. 这是两个线程~~,,  
      

  7.   

    ,,,有些汗颜,,上面的代码和这段代码都是为了找出问题而写出测试的..
    刚刚有些卡..怎么点都不回复... 一回复一堆~~
    begin
      DLLProc := @MyDLLHandler;
      MyDLLHandler(DLL_PROCESS_ATTACH);
      Bol := False;
      InstallHook(0);这是在DLL begin中写的 也就是loadlibrary就会执行.我用CreateRemoteThread来loadlibraryW('Hook.dll'),应该直接执行InstallHook的呀..
    而InstallHook和HookProc 是一个DLL中的, 传参把地址传去 貌似没太大意义!这是我的个人观点,本人菜鸟一只,逻辑错误请指正~
      

  8.   

    原来你是直接调dll啊,那我理解错了,我还以为你要注入2段代码呢!!误导你了,嘿嘿,
    那发你代码来我看看吧,exe
      

  9.   

    嗯..这个是DLL代码:library Hook;uses
      SysUtils,
      windows,
      Messages,
      APIHook in 'APIHook.pas';var
      DLLHook: HHOOK;
      Bol: Boolean = False;procedure HookProc(nCode, wParam, lParam: LongWORD); stdcall;
    begin
      if not Bol then  CallNextHookEx(DLLHook, nCode, wParam, lParam);
    end;function InstallHook(MainHandle: THandle): Boolean ; stdcall; 
    //MainHandle: THandle 参数在函数里没有调用, 没什么用
    begin
      DLLHook := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, Hinstance, 0);
      Result := DLLHook <> 0;
    end;exports
      InstallHook;begin
      HookAPI;             //APIHook.pas 中, 改API函数的函数,可以忽略.
      Bol := False;
      InstallHook(0);      //在LoadLibraryW直接调用hook.
    end.
    exe代码:
    procedure TForm3.Button4Click(Sender: TObject); //exe中LoadLibraryW.
    var
      ModuleHandle: THandle;
    begin
      ModuleHandle := LoadLibraryW('Hook.dll');
    end;注入代码太多太乱..网上有大比资料,而且我测试过很多次,没有错~
      

  10.   

    只是CreateRemoteThread,LoadLibraryW('Hook.dll');~
      

  11.   


    dll中这段代码执行了吗
    begin
      HookAPI;             //APIHook.pas 中, 改API函数的函数,可以忽略.
      Bol := False;
      InstallHook(0);      //在LoadLibraryW直接调用hook.
    end.
      

  12.   

    如果没有执行 请发
    exe中CreateRemoteThread的代码,发整个调用函数,不要发片段,
      

  13.   

    在目标进程申请了内存后就可以Load你的dll了,其实你说的已经差不多了,为何不自己做做
      

  14.   


    我很想说抱歉,,刚刚试了下,,莫名其妙居然好用了~
    不过我是注入非系统进程内才可以,,比如explorer,还有我自己的exe
    不过我是想注入winlogon, icesword查看模块,我已经成功注入winlogon,但是我的hook并没有生效
    难道这是传说中的,winlogon不具备与用户交互的功能?
      

  15.   

    抱歉, 我想注入的是winlogon, 问题已经转型,, 大侠还多多帮忙
      

  16.   

    晕喔,本来想帮你调完算了,可你要注入winlogon,我以前没有注入过这个exe,没有把握讲,最大的问题是我现在的机器上不要说winlogon注入不进去,就是记事本我用这个方法也没有办法写进去,我是xp64位系统,你只有再等等吧!
      

  17.   

    对了,你可以换其他的hook 类型(SetWindowsHookEx第一个参数) 试试
      

  18.   

    昨天测试过的代码,,莫名其妙又好使了... 我刚改成这样发给你,,因为怕代码乱 , 看着吃力~
    winlogon我代码可以注入进去,OpenProcessToken,LookupPrivilegeValue,AdjustTokenPrivileges结合起来调整进程权限..但是注入后hook就不生效了... 完全超出我的能力范围~
      

  19.   


    现在是WH_GETMESSAGE, 该换什么参数呢...
      

  20.   

    我提3点你自己考证一下,我没有办法调来看,
    1.首先你说winlogon你已经注入了,按你的意思是SetWindowsHookEx已经执行,没有效果,你可以使用getlasterror()放在SetWindowsHookEx函数后,使用其结果看看(输出文件或弹出对话框)是否成功(成功为0),如有错(不为0)根据数字判断是什么问题。
    2。SetWindowsHookEx调用成功,但是不起效果,说明此类型钩子在这里效果不大,你可以换其他的试试,你不知道的话,一个一个的试把。3. 我记得好像对winlogon要提升权限才能使用(AdjustTokenPrivileges函数)
      

  21.   

     dll已经注入成功, 可以用IceSword查看得到.刚看一贴:http://topic.csdn.net/t/20050703/22/4120358.html上面有句话:
    一般系统程序(比如winlogon)运行在LocalSystem帐户下,它拥有的windows   station和desktop不具有交互能力。也就是说:不能显示窗口、菜单,不能接受鼠标、键盘等。我先去getlasterror~
      

  22.   

    运行结果.. winlogon直接报错, 应用程序发生异常 未知的软件异常(0x0eedfade),位置为 0x7c812a5b.
    function InstallHook(MainHandle: THandle): Boolean ; stdcall;
    var
      i : DWORD;
    begin
      DLLHook := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, Hinstance, 0);
      i := GetLastError();
      mq := TmemoryStream.Create;
      mq.loadFromFile('C:\1.exe');
      mq.loadFromFile('C:\'+IntToStr(i)+'.GetLastError');
      Result := DLLHook <> 0;
    end;
      

  23.   

    mq.loadFromFile('C:\'+IntToStr(i)+'.GetLastError');
    你哪来的这个文件,
    这个函数是从文件读取,你连这个文件都没有,
    应该使用
    var
     mq: TFileStream;mq := TFileStream.Create('C:\'+IntToStr(i)+'.GetLastError',fmCreate  );
      

  24.   

    winlogon一旦出错,出错对话框点确定就会重启,,
    我的dll卡在winlogon里了... 现在没办法调试, 你加完我Q, 我重启下试试~ 看看lasterror
      

  25.   

    楼主想做什么?
    勾住winlogon是很不明智的,微软在gina和winlogon做了很多功夫,而且里面的函数基本不公开的大多都因为安全问题,实现起来有难度,gina桌面不同普通桌面,而且里面的数据段是随机的。
      

  26.   

    我是想注入winlogon , 在新线程中实现全局hook监视其他程序, 
      

  27.   

    ,  不要注入我也不会开此贴...
    注入一般进程已经实现,但是注入winlogon lsass 都会有问题
      

  28.   

    感谢jiju , 感谢蒋哥,
    问题终于解决~