立即注册

编程论坛

广告联系qq1031180668广告位
查看: 315|回复: 1

[逆向破解/内核驱动] DLL隐藏技术 抹链 增加DLL 引用计数 让FreeLibrary 不释放

[复制链接]
  • ta_mind
    擦汗
    2019-3-27 07:25
  • classn_01: 72 classn_02

    [LV.6]常住居民II

    1018

    主题

    1739

    帖子

    3533

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    3533

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2018-7-24 04:02:16 | 显示全部楼层 |阅读模式
    源码作者:郁金香
    [C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    #include "HideDLL.h"
    #include <Tlhelp32.h>
    
    DWORD g_dwImageSize = 0;
    VOID* g_lpNewImage = NULL;
    
    /************************************************************************/
    /* 把当前进程的所有DLL都使用LoadLibrary再次加载一边,增加引用计数,                                */
    /* 使得Free时对应的DLL资源不释放                                            */
    /************************************************************************/
    VOID LockAllModules()
    {
            HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId()); 
    
            if (hSnapshot != INVALID_HANDLE_VALUE) 
            { 
                    MODULEENTRY32 me = {sizeof(me)};  
                    BOOL fOk = Module32First(hSnapshot, &me);  
                    for (fOk = Module32Next(hSnapshot, &me); fOk; fOk = Module32Next(hSnapshot, &me))
                    { 
                            //跳过第一个(自身)
                            LoadLibrary(me.szModule);
                    }
            }
    }
    
    BOOL CopycatAndHide(HMODULE hDll)
    {
            // 整体思路:先把DLL加载到当前进程,然后将该加载的DLL再备份到当前进程空间;
            // 接下来该DLL再Free了,此时进程再访问该DLL的话会出错;
            // Free后,再把预先备份的DLL数据还原,而且还原的数据地址是原先DLL加载的地址
            // 如此,进程内再调用该DLL的话,由于数据完整,一切OK
            
            IMAGE_DOS_HEADER * pDosHeader;
            IMAGE_NT_HEADERS * pNtHeader;
            IMAGE_OPTIONAL_HEADER * pOptionalHeader;
            LPVOID lpBackMem = 0;
            DWORD dwOldProtect;
            DWORD dwCount = 30;
    
    
            pDosHeader = (IMAGE_DOS_HEADER *)hDll;
            pNtHeader = (IMAGE_NT_HEADERS *)(pDosHeader->e_lfanew + (DWORD)hDll);
            pOptionalHeader = (IMAGE_OPTIONAL_HEADER *)&pNtHeader->OptionalHeader;
    
            LockAllModules();
            
            // 找一块内存把需要隐藏而且已经加载到内存的DLL备份
            // SizeOfImage,4个字节,表示程序调入后占用内存大小(字节),等于所有段的长度之和。
            lpBackMem = VirtualAlloc(0 ,pOptionalHeader->SizeOfImage ,MEM_COMMIT|MEM_RESERVE ,PAGE_EXECUTE_READWRITE);
            if(!lpBackMem)
                    return FALSE;
            if(!VirtualProtect((LPVOID)hDll ,pOptionalHeader->SizeOfImage ,PAGE_EXECUTE_READWRITE ,&dwOldProtect))
                    return FALSE;
    
            g_dwImageSize = pOptionalHeader->SizeOfImage;
            memcpy(lpBackMem ,(LPVOID)hDll ,g_dwImageSize );
            // 抹掉PE头
            memset(lpBackMem , 0 ,0x200);
            *((PBYTE)hDll + pOptionalHeader->AddressOfEntryPoint) = (BYTE)0xc3;
    
            //  DWORD dwRet =0;
            // Free掉DLL
            do
            {
                    dwCount --;
            }while(FreeLibrary(hDll) && dwCount);
    
            // 把备份的DLL数据还原回来,使得预先引用该DLL的程序能够继续正常运行
            g_lpNewImage = VirtualAlloc((LPVOID)hDll ,g_dwImageSize ,MEM_COMMIT|MEM_RESERVE ,PAGE_EXECUTE_READWRITE);
            if(g_lpNewImage != (LPVOID)hDll)
                    return FALSE;
    
            memcpy(g_lpNewImage , lpBackMem , g_dwImageSize);
            VirtualFree(lpBackMem , 0, MEM_RELEASE);
    
            return TRUE  ;
    }
    

    不积跬步,无以至千里

    classn_11

    0

    主题

    42

    帖子

    88

    积分

    注册会员

    Rank: 2

    积分
    88
    发表于 2018-8-13 14:40:29 | 显示全部楼层
    回复

    使用道具 举报

    游客
    回复
    您需要登录后才可以回帖 登录 | 立即注册

    手机版|Archiver|小黑屋|sitemap| 编程论坛 - 一个单纯的编程学习交流论坛 ( 豫ICP备15032706号 )

    GMT+8, 2019-6-19 01:17 , Processed in 1.098238 second(s), 24 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表