首页
社区
课程
招聘
[分享]32位进程调用64位dll
发表于: 2017-6-9 16:04 7985

[分享]32位进程调用64位dll

2017-6-9 16:04
7985

这个问题应该很多人都遇到过,也有各种各样的方法,最近正好也遇到了这个问题,也正好处理了一下,就分享一下,肯定有很多前辈用的方法比我好很多,我的方法也许很多人都开始用了,但是之前没有搜到,所以现在共享出来,就当抛砖引玉吧。

思路:32dll中运行一个64位进程,然后通过信号量和共享内存进行通信,这样就间接的实现32进程调用64dll的功能。

一:32dll Unicode

全局变量

PROCESS_INFORMATION pi;

HANDLE hMap = NULL;

LPVOID pBuffer = NULL;

HANDLE hShowProc = NULL;

bool Initkmdll()
{
	STARTUPINFOA si;
	BOOLEAN bOK = FALSE;
	hShowProc = CreateEvent(NULL, FALSE, FALSE, L"ShowProc");
	if (hShowProc)
	{
		ZeroMemory( &si, sizeof(si) );
		si.cb = sizeof(si);
		ZeroMemory( &pi, sizeof(pi) );
		GetAppPath(szFile);
		strcat_s(szFile, "\\\\.\\MFC.exe");
		if(CreateProcessA(szFile, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
		{
			char name[] = "ShareMemory";
			hMap = ::OpenFileMappingA(FILE_MAP_ALL_ACCESS, 0, name);
			if (NULL == hMap)
			{
				hMap = ::CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, strlen(name)+1, name);
				pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
				bOK = TRUE;
			}
		}
		else
		{
			bOK = FALSE;
			CloseHandle(hExitProc);
			CloseHandle(hShowProc);
			CloseHandle(hHideProc);
		}
	}
	return bOK;
}

上面这个方法就已经初始化好了,下面然后就是通信方法

BOOLEAN  TestProcess(DWORD id)
{
	char c[10] = {0};
	_itoa(id, c, 10);
	strcpy_s((char*)pBuffer, 10, c);
	SetEvent(hHideProc)
	return TRUE;
}

最后就是清理工作,需要 CloseHandle(pi.hProcess);

二:64位进程MFC Unicode

DWORD Main()
{
	HANDLE hShow = OpenEvent(EVENT_ALL_ACCESS, FALSE, L"ShowProc");
	if(hShow)
	{
		if (WAIT_OBJECT_0 == WaitForSingleObject(hShow, INFINITE))
		{
			HINSTANCE   hDllInst   =   LoadLibrary(L"64dll.dll");
			if(hDllInst) 
			{  
				typedef   VOID   (__fastcall   *TEST)(DWORD); 
				TEST	 testProcess   =   (TEST)GetProcAddress(hDllInst, "TestProcess"); 
				if (testProcess)
				{
					char name[] = "ShareMemory";
					HANDLE hMap = ::OpenFileMappingA(FILE_MAP_ALL_ACCESS, 0, name);
					LPVOID pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
					int i = atoi((char*)pBuffer);
					char c[10] = {0};
					strcpy_s((char*)pBuffer, 10, c);
					UnmapViewOfFile(pBuffer);
					CloseHandle(hMap);
					testProcess(i);
				}
				FreeLibrary(hDllInst); 
				hDllInst = NULL;
			}
		}
	}
	return 0;
}

这样,通过共享内存就把需要传递的参数传递过来了,通过信号量控制调用的时间,64位MFC界面可以隐藏,这样就实现了32进程间接调用64dll。

最后向各位大神致敬。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 12045
活跃值: (4763)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好像很强大的样纸哟
2017-6-9 17:19
0
雪    币: 83
活跃值: (83)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
据说...32/64位dll  可以通过COM相互调用
2017-6-25 01:50
0
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
yhswwr 据说...32/64位dll 可以通过COM相互调用
恩恩,是的,COM是一个非常好的方法,但是我没有去学这个,就用最简单的方法弄了一下
2017-9-11 16:00
0
雪    币: 2044
活跃值: (237)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
额.这标题,就是ipc好吧,且是最不好用的ipc
2017-11-12 14:12
0
游客
登录 | 注册 方可回帖
返回
//