码迷,mamicode.com
首页 > 其他好文 > 详细

[转载]Dll注入技术之ComRes注入

时间:2015-02-02 21:28:01      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:

DLL注入技术之ComRes注入
    ComRes注入的原理是利用Windows 系统中C:\WINDOWS\system32目录下的ComRes.dll这个文件,当待注入EXE如果使用CoCreateInstance()这个API时,COM服务器会加载ComRes.dll到EXE中,我们利用这个加载过程,移花接木的把ComRes.dll替换掉,并在伪造的ComRes.dll,然后利用LoadLibrary()将事先准备好的DLL加载到目标的EXE中。
1.编写测试文件
    为了向大家完整的演示ComRes注入的过程,我们需要先建立一个使用CoCreateInstance()函数的示例程序。

    新建atl的DLL工程,这个工程中只提供了一个简单的com接口方法TestMsgBox,主要代码如下:

  1. STDMETHODIMP CCMyCom::TestMsgBox(void)  
  2. {  
  3.     // TODO: 在此添加实现代码  
  4.     MessageBox(0,0,0,0);  
  5.     return S_OK;  
  6. }  
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接口方法。主要代码如下:



  1. void CReplaceRescomInjectDlg::OnBnClickedCallcom()  
  2. {  
  3.     // TODO: 在此添加控件通知处理程序代码  
  4.     CoInitialize(NULL);  
  5.     CLSID clsid;  
  6.     HRESULT hr = CLSIDFromProgID(OLESTR("CallComDll.CMyCom"),&clsid);  
  7.     ICMyCom *ptr;  
  8.     hr = CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,  
  9.         __uuidof(ICMyCom),(LPVOID*)&ptr);  
  10.     ptr->TestMsgBox();  
  11.     CoUninitialize();  
  12. }  
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文件,添加导出函数

  1. EXPORTS  
  2.         COMResModuleInstance  
EXPORTS
        COMResModuleInstance

在主工程cpp文件中,加入如下代码

  1. HANDLE ghInst = 0;  
  2. BOOL isLoad = FALSE;  
  3.   
  4. BOOL APIENTRY DllMain( HMODULE hModule,  
  5.                        DWORD  ul_reason_for_call,  
  6.                        LPVOID lpReserved  
  7.                                          )  
  8. {  
  9.         switch (ul_reason_for_call)  
  10.         {  
  11.         case DLL_PROCESS_ATTACH:  
  12.         ghInst = hModule;  
  13.         if (!isLoad)  
  14.         {  
  15.             LoadLibrary(_T("D:\\MyDll\\ReplaceRescomInject\\Debug\\LoadLibraryDll.dll"));  
  16.             isLoad = TRUE;  
  17.         }  
  18.         break;  
  19.         case DLL_THREAD_ATTACH:  
  20.         break;  
  21.         case DLL_THREAD_DETACH:  
  22.         break;  
  23.         case DLL_PROCESS_DETACH:  
  24.                 break;  
  25.         }  
  26.         return TRUE;  
  27. }  
  28.   
  29. int COMResModuleInstance()  
  30. {  
  31.     return (int)ghInst;  
  32. }  
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;
}

编译后得到的文件改名为comres.dll,然后将其剪切到其他文件夹下备用,这时读者会问,为什么是剪切尓不是拷贝呢?原因在于当在exe同级目录下有和C:\WINDOWS\system32一样的文件,exe会首先加载同级目录下的文件,而不会加载C:\WINDOWS\system32中的文件。

3.替换comres.dll文件
    由于直接拷贝comres.dll文件到C:\WINDOWS\system32目录下会引起winows的文件系统保护机制,所以首先需要将C:\WINDOWS\system32\dllcache下的文件替换掉,然后再将其C:\WINDOWS\system32文件替换为我们伪造的文件。

    ComRes注入只需伪造与替换就可以完成,编程要求不高,方便使用,但是由于加载了ComRes.dll后,再想替换ComRes.dll文件就不可能了,因此想反复测试ComRes.dll文件就比较麻烦。

[转载]Dll注入技术之ComRes注入

标签:

原文地址:http://www.cnblogs.com/Acg-Check/p/4268660.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!