请问如何实现全局注入?
我看了两个比较主流的方法:一是使用SetWindowsHookEx安装一个WH_GETMESSAGE的钩子,可是我在测试的时候发现只有一部分进程被注入了,一查才知道这个API只能注入到有界面的进程里。二是使用CreateRemoteThread创建远程进程,但是这种方法不能动态的把DLL注入,比如有新进程产生,又要枚举一遍进程然后在把DLL注入,本来想写个循环,隔一段时间枚举一次,但是想想这样效率比较低,枚举一次还要判断这个进程是否已注入。现在不知道有什么好的办法,所以请教一下大家~谢谢了~
我看了两个比较主流的方法:一是使用SetWindowsHookEx安装一个WH_GETMESSAGE的钩子,可是我在测试的时候发现只有一部分进程被注入了,一查才知道这个API只能注入到有界面的进程里。二是使用CreateRemoteThread创建远程进程,但是这种方法不能动态的把DLL注入,比如有新进程产生,又要枚举一遍进程然后在把DLL注入,本来想写个循环,隔一段时间枚举一次,但是想想这样效率比较低,枚举一次还要判断这个进程是否已注入。现在不知道有什么好的办法,所以请教一下大家~谢谢了~
学习了~~~WIN32层貌似不好做~不过全都注入会影响系统效率吧~。
你可以HOOK掉 CreateProcess,每当系统调用CreateProcess时你就再用CreateRemoteThread注入到新的进程。我以前就是这么做的
http://topic.csdn.net/u/20080725/23/5d5b7b4e-24af-400b-b8c5-e86f03588db2.html
基于CUI的程序都不调用User32.dll,所以并不是对所有的进程都有效。
另外,还需要在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\下建立一个名为
LoadAppInit_Dlls的DWORD键,值为1.以上引用《Windows Via C/C++》
在你的代理函数(就是自己写的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;
}