DLL注入技术之ComRes注入
ComRes注入的原理是利用Windows 系统中C:WINDOWSsystem32目录下的ComRes.dll这个文件,当待注入EXE如果使用CoCreateInstance()这个API时,COM服务器会加载ComRes.dll到EXE中,我们利用这个加载过程,移花接木的把ComRes.dll替换掉,并在伪造的ComRes.dll,然后利用LoadLibrary()将事先准备好的DLL加载到目标的EXE中。
1.编写测试文件
为了向大家完整的演示ComRes注入的过程,我们需要先建立一个使用CoCreateInstance()函数的示例程序。
新建atl的DLL工程,这个工程中只提供了一个简单的com接口方法TestMsgBox,主要代码如下:
- STDMETHODIMP CCMyCom::TestMsgBox(void)
- {
- // TODO: 在此添加实现代码
- MessageBox(0,0,0,0);
- return S_OK;
- }
这时编译后会产生一个tlb文件,他是调用com接口方法工程中所要使用的导入文件。新建mfc对话框工程,在stdafx.h文件中加入#import "tlb文件路径xxxx.tlb " no_namespace。添加一个BUTTON控件,双击后在单击事件中写入调用atl中com接口方法。主要代码如下:
- void CReplaceRescomInjectDlg::OnBnClickedCallcom()
- {
- // TODO: 在此添加控件通知处理程序代码
- CoInitialize(NULL);
- CLSID clsid;
- HRESULT hr = CLSIDFromProgID(OLESTR("CallComDll.CMyCom"),&clsid);
- ICMyCom *ptr;
- hr = CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
- __uuidof(ICMyCom),(LPVOID*)&ptr);
- ptr->TestMsgBox();
- CoUninitialize();
- }
2.伪造comres.dll文件
使用DEPENDS.EXE文件查看一下,发现只有一个导出函数COMResModuleInstance()
新建一个DLL工程,加入def文件,添加导出函数
- EXPORTS
- COMResModuleInstance
- HANDLE ghInst = 0;
- BOOL isLoad = FALSE;
- BOOL APIENTRY DllMain( HMODULE hModule,
- DWORD ul_reason_for_call,
- LPVOID lpReserved
- )
- {
- switch (ul_reason_for_call)
- {
- case DLL_PROCESS_ATTACH:
- ghInst = hModule;
- if (!isLoad)
- {
- LoadLibrary(_T("D:\MyDll\ReplaceRescomInject\Debug\LoadLibraryDll.dll"));
- isLoad = TRUE;
- }
- break;
- case DLL_THREAD_ATTACH:
- break;
- case DLL_THREAD_DETACH:
- break;
- case DLL_PROCESS_DETACH:
- break;
- }
- return TRUE;
- }
- int COMResModuleInstance()
- {
- return (int)ghInst;
- }
3.替换comres.dll文件
由于直接拷贝comres.dll文件到C:WINDOWSsystem32目录下会引起winows的文件系统保护机制,所以首先需要将C:WINDOWSsystem32dllcache下的文件替换掉,然后再将其C:WINDOWSsystem32文件替换为我们伪造的文件。
ComRes注入只需伪造与替换就可以完成,编程要求不高,方便使用,但是由于加载了ComRes.dll后,再想替换ComRes.dll文件就不可能了,因此想反复测试ComRes.dll文件就比较麻烦。