请问如何实现全局注入?
我看了两个比较主流的方法:一是使用SetWindowsHookEx安装一个WH_GETMESSAGE的钩子,可是我在测试的时候发现只有一部分进程被注入了,一查才知道这个API只能注入到有界面的进程里。二是使用CreateRemoteThread创建远程进程,但是这种方法不能动态的把DLL注入,比如有新进程产生,又要枚举一遍进程然后在把DLL注入,本来想写个循环,隔一段时间枚举一次,但是想想这样效率比较低,枚举一次还要判断这个进程是否已注入。现在不知道有什么好的办法,所以请教一下大家~谢谢了~

解决方案 »

  1.   

    在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows键的AppInit_DLLs值中加入你的DLL文件名及路径,每个进程启动时会自动加载该DLL。
      

  2.   

    up 1 楼,不过小心,很多反病毒软件都会将这个键值下的dll删除
      

  3.   


    学习了~~~WIN32层貌似不好做~不过全都注入会影响系统效率吧~。
      

  4.   


    你可以HOOK掉 CreateProcess,每当系统调用CreateProcess时你就再用CreateRemoteThread注入到新的进程。我以前就是这么做的
      

  5.   

    我发的帖子里,收集了一些方法,不知道能否有帮助:
    http://topic.csdn.net/u/20080725/23/5d5b7b4e-24af-400b-b8c5-e86f03588db2.html
      

  6.   

    昨晚睡觉之前我也在想这个问题,把创建进程的函数HOOK掉,但是我有一个困惑,就是CreateRemoteThread函数需要一个进程的句柄,可以通过OpenProcess得到,然后OpenProcess需要一个进程的ID,一个进程只有创立了才会有ID。既然进程创立了,我们怎么能拦得到呢?不知道我这个想法对不对哦?还请赐教~
      

  7.   

    这种方法是有限制的,只能将Dll注入那些调用User32.dll的进程。所有基于GUI的程序都是调用User32.dll的,而大部分
    基于CUI的程序都不调用User32.dll,所以并不是对所有的进程都有效。
    另外,还需要在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\下建立一个名为
    LoadAppInit_Dlls的DWORD键,值为1.以上引用《Windows Via C/C++》
      

  8.   


    在你的代理函数(就是自己写的HOOK函数,用来替代CreateProcess的)中你可以先调用系统原函数正常创建进程,这样它就会返回这个新创建的进程ID,
    看下边的代码:BOOL WINAPI Hook_CreateProcessA(LPCTSTR lpApplicationName,
      LPTSTR lpCommandLine,
      LPSECURITY_ATTRIBUTES lpProcessAttributes,
      LPSECURITY_ATTRIBUTES lpThreadAttributes,
      BOOL bInheritHandles,
      DWORD dwCreationFlags,
      LPVOID lpEnvironment,
      LPCTSTR lpCurrentDirectory,
      LPSTARTUPINFO lpStartupInfo,
      LPPROCESS_INFORMATION lpProcessInformation)
    {
    BOOL bOK=FALSE;
    BOOL suc=FALSE; typedef BOOL (WINAPI *PFNTERMINATEPROCESS)(LPCTSTR ,
      LPTSTR ,
      LPSECURITY_ATTRIBUTES ,
      LPSECURITY_ATTRIBUTES ,
      BOOL ,
      DWORD ,
      LPVOID ,
      LPCTSTR ,
      LPSTARTUPINFO ,
      LPPROCESS_INFORMATION);
    suc=((PFNTERMINATEPROCESS)(PROC)g_CreateProcessA)( lpApplicationName,
       lpCommandLine,
       lpProcessAttributes,
       lpThreadAttributes,
       bInheritHandles,
       dwCreationFlags,
       lpEnvironment,
       lpCurrentDirectory,
       lpStartupInfo,
       lpProcessInformation);
    if(suc)
    {
    // 构建发送给主窗口的字符串//在这里控制把新建进程的ID返回总控模块,总控模块完成注入工作
    char sz[2048];
    wsprintf(sz, "%dCreateProcessA", lpProcessInformation->dwProcessId); // 发送这个字符串到主对话框
    COPYDATASTRUCT cds = { ::GetCurrentProcessId(), strlen(sz) + 1, sz };
    ::SendMessage(::FindWindow(NULL, "HookComu"), WM_COPYDATA, 0, (LPARAM)&cds);
    } return suc;
    }
      

  9.   

    我说的只是一个大体的思路我的是在总控模块完成新建进程注入,具体实现你可以自己考虑,也可以一起做到DLL当中