一种x64进程使用x86 DLL的方法

一种x64进程使用32位 DLL的方法

有的时候要用第三方的DLL,但是仅有32位版本,自己开发的程序又必须是是64位的,这下头就疼了。。。。

其实反之也是一样的头疼,这时候有什么办法呢?

一个典型的思路就是用32位进程加载DLL,然后64位进程跟32位进程通讯。

其实微软已经有了COM技术来帮我们解决这个问题:

1.创建一个进程外COM服务器。
2.使用COM服务器的相关接口去包装32位DLL的接口。

3.64位进程调用32位COM服务器接口。

这里面的关键就是如何创建一个进程外COM服务器

使用ATL模板去创建是一种非常快捷方便的方式

EXE才是进程外Com 服务,另外勾选另一个选项可以减少一个代理project

然后增加一个类作

这时候编译一下 会发现一个错误,

这是因为编译之后会去注册com组件,因为没有权限儿报错,如果使用管理员权限开vs就不会有这个问题。

接着在类中加入包裹DLL的代码

STDMETHODIMP CCLeenSimple::LoadDll32()
{
	m_hDll = LoadLibrary(_T("TestDll.dll"));
	if (m_hDll)
	{
		m_pFun = (GCUN)GetProcAddress(m_hDll, "GetCurrentUserName");
		if (m_pFun != NULL)
			return S_OK;
	}
	else
		GetLastError();
	return E_FAIL;
}

STDMETHODIMP  CCLeenSimple::Launch(TCHAR szTitile[MAX_PATH])
{
	HRESULT hr = LoadDll32();
	BOOL bRet = FALSE;
	TCHAR szUserName[MAX_PATH] = { 0 };
	if (FAILED(hr))
	{
		OutputDebugString(_T("LoadDll32 fail"));
		MessageBox(NULL, _T("LoadDll32 fail"), _T("COMServer"), MB_OK);
	}
	else
	{
		bRet = m_pFun(szUserName);
	}
	if (bRet)
	{
		OutputDebugString(szUserName);
		MessageBox(NULL, szUserName, _T("COMServer"), MB_OK);
	}
	else
	{
		MessageBox(NULL, _T("Func failed"), _T("COMServer"), MB_OK);
	}
	

	return S_OK;
}

在IDL文件中导出我们的包装函数

这样就可以了~

DLL中的函数

EXTERN_C BOOL WINAPI GetCurrentUserName(TCHAR* pszbuff)
{
	BOOL bRet = FALSE;

	TCHAR szUserNameBuffer[MAX_PATH];
	DWORD dwUserNameSize = MAX_PATH;

	bRet = GetUserName(szUserNameBuffer, &dwUserNameSize);

	if (bRet)
	{
		_tcscpy_s(pszbuff, dwUserNameSize, szUserNameBuffer);
	}

	return bRet;
}

客户端测试代码

HRESULT hr = CoInitialize(NULL);
	ICLeenSimple* pILeenTest;
	//CComPtr<ILeenTest> pILeenTest;
	TCHAR szUserName[MAX_PATH] = { 0 };
	if (SUCCEEDED(hr))
	{
		hr = CoCreateInstance(CLSID_CLeenSimple, NULL, CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,
			__uuidof(ICLeenSimple), (void**)&pILeenTest);
		if (SUCCEEDED(hr))
		{
			pILeenTest->Launch(szUserName);
		}
	}

测试前记得先注册COM server

命令

注册

Out_Process.exe /RegServer

反注册

Out_Process.exe /UnregServer

可以查看注册表确认是否注册成功。

运行一下,见证奇迹的时刻到啦~

代码下载链接

  • 4
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Ring3下的DLL注入工具是一种在Windows操作系统运行的工具,用于将动态链接库(DLL)注入到目标进程的地址空间,以改变目标进程的行为或增加功能。 Ring3是Windows系统最高特权级别之一,它对应用户态,也称为用户模式。在Ring3下运行的进程只能访问受限资源,无法直接访问操作系统的核心代码和硬件设备。因此,为了修改或扩展目标进程的功能,我们需要使用DLL注入工具。 x86是指在Intel x86架构的计算机上运行的32位程序。通常,DLL注入工具需要与目标进程的位数相同才能正常工作,所以x86表示该工具适用于32位进程。对于64位进程,我们需要使用x64版本的DLL注入工具。 DLL注入工具的原理是将DLL文件加载到目标进程的地址空间,并将DLL的函数地址替换为目标进程的函数地址,从而实现对目标进程的操作。注入工具可以通过以下几个步骤实现: 1. 打开目标进程:获取目标进程进程ID,并以指定的方式打开目标进程,使得我们可以在该进程进行操作。 2. 为目标进程申请内存空间:在目标进程申请一块内存空间,用于存放需要注入的DLL文件。 3. 将DLL文件写入目标进程:将DLL文件的内容写入之前申请的内存空间。 4. 获取目标进程特定函数地址:在目标进程的地址空间,获取需要修改的函数的地址。 5. 修改目标进程的函数地址:将DLL对应函数的地址替换为目标进程的函数地址。 6. 释放内存并关闭目标进程句柄:释放之前申请的内存空间,并关闭目标进程的句柄。 通过DLL注入工具,我们可以实现一些有趣的功能,如修改游戏进程的数值、记录目标进程的函数调用等。然而,需要注意的是,DLL注入涉及到操作系统的安全机制,不当的使用可能导致系统不稳定或者引发安全漏洞,因此在使用DLL注入工具时需要谨慎。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值