看雪论坛
发新帖
1

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

myqqi 2017-6-9 16:04 942

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

思路: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。

最后向各位大神致敬。

本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (3)
xie风腾 2017-6-9 17:19
2
好像很强大的样纸哟
yhswwr 2017-6-25 01:50
3
据说...32/64位dll  可以通过COM相互调用
1
myqqi 2017-9-11 16:00
4
yhswwr 据说...32/64位dll 可以通过COM相互调用
恩恩,是的,COM是一个非常好的方法,但是我没有去学这个,就用最简单的方法弄了一下
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 微信公众号:ikanxue
Time: 0.012, SQL: 9 / 京ICP备10040895号-17