如何实现DLL全局注入

phthegreat 2008-08-07 07:58:05
请问如何实现全局注入?
我看了两个比较主流的方法:一是使用SetWindowsHookEx安装一个WH_GETMESSAGE的钩子,可是我在测试的时候发现只有一部分进程被注入了,一查才知道这个API只能注入到有界面的进程里。二是使用CreateRemoteThread创建远程进程,但是这种方法不能动态的把DLL注入,比如有新进程产生,又要枚举一遍进程然后在把DLL注入,本来想写个循环,隔一段时间枚举一次,但是想想这样效率比较低,枚举一次还要判断这个进程是否已注入。现在不知道有什么好的办法,所以请教一下大家~谢谢了~
...全文
351 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangchao7580578 2010-06-08
  • 打赏
  • 举报
回复
用注册表只能是对GUI程序
phthegreat 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sojia 的回复:]

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

我以前就是这么做的
[/Quote]
昨晚睡觉之前我也在想这个问题,把创建进程的函数HOOK掉,但是我有一个困惑,就是CreateRemoteThread函数需要一个进程的句柄,可以通过OpenProcess得到,然后OpenProcess需要一个进程的ID,一个进程只有创立了才会有ID。既然进程创立了,我们怎么能拦得到呢?不知道我这个想法对不对哦?还请赐教~
phthegreat 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gaoteng1984 的回复:]
我发的帖子里,收集了一些方法,不知道能否有帮助:
http://topic.csdn.net/u/20080725/23/5d5b7b4e-24af-400b-b8c5-e86f03588db2.html
[/Quote]
谢谢了~我想是一种全局注入的,我看了看你的帖子里没有说到啊~
11000000 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows键的AppInit_DLLs值中加入你的DLL文件名及路径,每个进程启动时会自动加载该DLL。
[/Quote]
「已注销」 2008-08-08
  • 打赏
  • 举报
回复
去看雪论坛上找,有一个系列文章,都是讲这个的
gaoteng1984 2008-08-08
  • 打赏
  • 举报
回复
我发的帖子里,收集了一些方法,不知道能否有帮助:
http://topic.csdn.net/u/20080725/23/5d5b7b4e-24af-400b-b8c5-e86f03588db2.html
schlafenhamster 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows键的AppInit_DLLs值中加入你的DLL文件名及路径,每个进程启动时会自动加载该DLL。
[/Quote]

sojia 2008-08-08
  • 打赏
  • 举报
回复

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

我以前就是这么做的
JOKER_FISH 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows键的AppInit_DLLs值中加入你的DLL文件名及路径,每个进程启动时会自动加载该DLL。
[/Quote]

学习了~~~

WIN32层貌似不好做~

不过全都注入会影响系统效率吧~。。。。
phthegreat 2008-08-08
  • 打赏
  • 举报
回复
很好很强大!结贴了!谢谢了!
sojia 2008-08-08
  • 打赏
  • 举报
回复
我说的只是一个大体的思路

我的是在总控模块完成新建进程注入,

具体实现你可以自己考虑,也可以一起做到DLL当中
sojia 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 phthegreat 的回复:]
引用 4 楼 sojia 的回复:

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

我以前就是这么做的

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

在你的代理函数(就是自己写的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;
}
dwen20 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows键的AppInit_DLLs值中加入你的DLL文件名及路径,每个进程启动时会自动加载该DLL。
[/Quote]
这种方法是有限制的,只能将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++》
吹泡泡的小猫 2008-08-07
  • 打赏
  • 举报
回复
up 1 楼,不过小心,很多反病毒软件都会将这个键值下的dll删除
cnzdgs 2008-08-07
  • 打赏
  • 举报
回复
在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows键的AppInit_DLLs值中加入你的DLL文件名及路径,每个进程启动时会自动加载该DLL。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧