zoukankan      html  css  js  c++  java
  • Dll注入技术之ComRes注入

    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,主要代码如下:

    1. STDMETHODIMP CCMyCom::TestMsgBox(void)  
    2. {  
    3.     // TODO: 在此添加实现代码  
    4.     MessageBox(0,0,0,0);  
    5.     return S_OK;  
    6. }  

    这时编译后会产生一个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. }  

    2.伪造comres.dll文件
        使用DEPENDS.EXE文件查看一下,发现只有一个导出函数COMResModuleInstance()


    新建一个DLL工程,加入def文件,添加导出函数

    1. EXPORTS  
    2.         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. }  
    编译后得到的文件改名为comres.dll,然后将其剪切到其他文件夹下备用,这时读者会问,为什么是剪切尓不是拷贝呢?原因在于当在exe同级目录下有和C:WINDOWSsystem32一样的文件,exe会首先加载同级目录下的文件,而不会加载C:WINDOWSsystem32中的文件。

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

        ComRes注入只需伪造与替换就可以完成,编程要求不高,方便使用,但是由于加载了ComRes.dll后,再想替换ComRes.dll文件就不可能了,因此想反复测试ComRes.dll文件就比较麻烦。
  • 相关阅读:
    第二章、Java内存区域与内存溢出异常
    第二章、Java内存区域与内存溢出异常
    腾讯//格雷编码
    腾讯//格雷编码
    数据结构5.5_广义表的递归算法
    数据结构5.4_m元多项式的表示
    数据结构4.2_串操作应用举例_建立词索引表
    数据结构3_栈和队列
    数据结构2_线性表
    数据结构1_绪论
  • 原文地址:https://www.cnblogs.com/vcerror/p/4289067.html
Copyright © 2011-2022 走看看