关于32位dll 注入64位系统 里的32位程序和64位程序的疑惑

hzy694358 2013-09-11 04:02:38
hook dll
先看下msdn解释:
SetWindowsHookEx can be used to inject a DLL into another process. A 32-bit DLL cannot be injected into a 64-bit process, and a 64-bit DLL cannot be injected into a 32-bit process. If an application requires the use of hooks in other processes, it is required that a 32-bit application call SetWindowsHookEx to inject a 32-bit DLL into 32-bit processes, and a 64-bit application call SetWindowsHookEx to inject a 64-bit DLL into 64-bit processes. The 32-bit and 64-bit DLLs must have different names.
--------------------------
32位的hook dll,之前SetWindowsHookEx 是线程钩子,钩的程序也都是32位 没出现问题,不过因为要钩好几个程序,所以要调用好几次的SetWindowsHookEx ,所以后来改成了全局钩子,问题来了:

在32位系统上没问题的,但是64位系统上,因为里面有64位的进程这时候就会出现很多问题,Runtime等系统的问题 还有其他的64位程序的问题

那我该怎么处理呢?如果写一个64位的dll,但是如果64位系统上也有跑32位程序的话,而用的又是全局钩子的话,那岂不是也会有问题?
...全文
480 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
W1nds 2013-09-13
  • 打赏
  • 举报
回复
无解的吧 换种注入方式吧
hzy694358 2013-09-12
  • 打赏
  • 举报
回复
引用 8 楼 oyljerry 的回复:
[quote=引用 6 楼 hzy694358 的回复:] [quote=引用 5 楼 oyljerry 的回复:] [quote=引用 2 楼 hzy694358 的回复:] [quote=引用 1 楼 oyljerry 的回复:] DLL自己判断一下进程是32还是64,再决定是否继续
那如果需要同时注入32位程序和64位程序的话 肯定是要写两个dll吧?? 挂钩的时候岂不是要同时调用两个dll里的挂钩接口 将32 和 64位的dll 都先注入,然后再根据进程是32位 64位 判断是否退出?[/quote] 其实32进程加载32dll,64加载64[/quote] 你的意思是我挂了全局钩子后 32位进程会自动加载32位dll,64位进程会自动加载64位dll, 而32位dll对64位进程是没有影响的 64位dll对32位进程也是没有影响的??[/quote] 不同版本,进程会加载dll失败[/quote] 那加载dll失败 会导致进程出现问题吗 如果只是加载失败而不会影响原进程的话就不用判断了吧:DLL自己判断一下进程是32还是64,再决定是否继续
oyljerry 2013-09-12
  • 打赏
  • 举报
回复
本身进程加载注入DLL是你控制的,失败了,进程应该不会有啥影响
oyljerry 2013-09-12
  • 打赏
  • 举报
回复
引用 6 楼 hzy694358 的回复:
[quote=引用 5 楼 oyljerry 的回复:] [quote=引用 2 楼 hzy694358 的回复:] [quote=引用 1 楼 oyljerry 的回复:] DLL自己判断一下进程是32还是64,再决定是否继续
那如果需要同时注入32位程序和64位程序的话 肯定是要写两个dll吧?? 挂钩的时候岂不是要同时调用两个dll里的挂钩接口 将32 和 64位的dll 都先注入,然后再根据进程是32位 64位 判断是否退出?[/quote] 其实32进程加载32dll,64加载64[/quote] 你的意思是我挂了全局钩子后 32位进程会自动加载32位dll,64位进程会自动加载64位dll, 而32位dll对64位进程是没有影响的 64位dll对32位进程也是没有影响的??[/quote] 不同版本,进程会加载dll失败
棋子021230 2013-09-12
  • 打赏
  • 举报
回复
我做过一个模块也是这样的,两套钩子的话功能确实可以实现,但是系统变得很不稳定,挂钩的进程经常会崩
hzy694358 2013-09-12
  • 打赏
  • 举报
回复
引用 5 楼 oyljerry 的回复:
[quote=引用 2 楼 hzy694358 的回复:] [quote=引用 1 楼 oyljerry 的回复:] DLL自己判断一下进程是32还是64,再决定是否继续
那如果需要同时注入32位程序和64位程序的话 肯定是要写两个dll吧?? 挂钩的时候岂不是要同时调用两个dll里的挂钩接口 将32 和 64位的dll 都先注入,然后再根据进程是32位 64位 判断是否退出?[/quote] 其实32进程加载32dll,64加载64[/quote] 你的意思是我挂了全局钩子后 32位进程会自动加载32位dll,64位进程会自动加载64位dll, 而32位dll对64位进程是没有影响的 64位dll对32位进程也是没有影响的??
oyljerry 2013-09-11
  • 打赏
  • 举报
回复
引用 2 楼 hzy694358 的回复:
[quote=引用 1 楼 oyljerry 的回复:] DLL自己判断一下进程是32还是64,再决定是否继续
那如果需要同时注入32位程序和64位程序的话 肯定是要写两个dll吧?? 挂钩的时候岂不是要同时调用两个dll里的挂钩接口 将32 和 64位的dll 都先注入,然后再根据进程是32位 64位 判断是否退出?[/quote] 其实32进程加载32dll,64加载64
  • 打赏
  • 举报
回复
得2个dll一个32位一个64位.
hzy694358 2013-09-11
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
DLL自己判断一下进程是32还是64,再决定是否继续
还有个问题,我写了个判断 32 64的接口:

//判断进程是否32位
int GetProcessIsWOW64(HANDLE hProcess)
{
	int nRet=-1;

	typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); 
	LPFN_ISWOW64PROCESS fnIsWow64Process; 
	BOOL bIsWow64 = FALSE; 
	BOOL bRet;
	DWORD nError;
	fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle(L"kernel32"),"IsWow64Process"); 
	if (NULL != fnIsWow64Process) 
	{ 
		bRet=fnIsWow64Process(hProcess,&bIsWow64);
		if (bRet==0)
		{
			nError=GetLastError();
			nRet=-2;
		}
		else
		{
			if (bIsWow64)
			{
				nRet=1;
			}
			else
			{
				nRet=0;
			}
		}
	} 
	return nRet; 
}

那么这个接口放哪呢?因为我的dll是MFC的dll,里面自动生成的就一个接口 BOOL C***App::InitInstance() { } 判断32 64位进程的接口放在钩子函数那边,好像没多大意义
hzy694358 2013-09-11
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
DLL自己判断一下进程是32还是64,再决定是否继续
那如果需要同时注入32位程序和64位程序的话 肯定是要写两个dll吧?? 挂钩的时候岂不是要同时调用两个dll里的挂钩接口 将32 和 64位的dll 都先注入,然后再根据进程是32位 64位 判断是否退出?
oyljerry 2013-09-11
  • 打赏
  • 举报
回复
DLL自己判断一下进程是32还是64,再决定是否继续

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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