吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3618|回复: 1
收起左侧

[C&C++ 转载] 卸载Dll 原理&c代码

  [复制链接]
T_MAC仔 发表于 2017-4-27 19:53
dll 卸载原理:
1.调用FreeLibrary() 函数
2.创建远程线程CreateRemoteThread()即可,
与dll通过远程线程注入方法类似;
代码:
  //find process
  DWORD FindProcess(LPCTSTR szPrcessName)
{
        DWORD dwPid = 0;
        PROCESSENTRY32 pe;
        //快照中包含、系统所有进程和线程
        HANDLE hFile = CreateToolhelp32Snapshot(TH32CS_SNAPALL,NULL);
        if (hFile == INVALID_HANDLE_VALUE)
        {
                printf("CreateToolhelp32Snapshot () failed %d \n",GetLastError());
                return  0;
        }
        //获取第一个进程句柄
        if (Process32First(hFile, &pe))
        {
                do
                {                             //notepad.exe
                        if (_tcsicmp(pe.szExeFile, szPrcessName)==0)
                        {
                                dwPid = pe.th32ProcessID;
                                break;
                        }
                } while (Process32Next(hFile, &pe));
        }
        CloseHandle(hFile);
        return dwPid;
}

//createremotethread() 运行FreeLibrary()
BOOL EnjectionDll(DWORD dwPid)
{
        int flag = 0;
        //创建置顶pid的进程所有模块快照
        HANDLE hFile = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwPid);
        MODULEENTRY32 me = {sizeof(me),};
        HANDLE hProcess,hThread;
        HMODULE hModule;
        LPTHREAD_START_ROUTINE pThreadProc;
        if (Module32First(hFile,&me))
        {
                do {                                     //模块名称                             //模块路径
                        if ( !_tcsicmp((LPCTSTR)me.szModule, DEF_DLL_NAME) || !_tcsicmp((LPCTSTR)me.szExePath, DEF_DLL_NAME))
                        {
                                flag = true;
                                break;
                        }
                } while (Module32Next(hFile, &me));
        }
        if (!flag)
        {
                CloseHandle(hFile);
                return false;
        }
        hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
        if (!hProcess)
        {
                printf("Openprocess failed %d \n",GetLastError());
                return false;
        }
        hModule = GetModuleHandle("kernel32.dll");
        pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule,"FreeLibrary");
                                                                                                                                //此处必须是内存中的模块基址
        hThread = CreateRemoteThread(hProcess,NULL,0,pThreadProc,me.modBaseAddr,0,NULL);
        WaitForSingleObject(hThread,INFINITE);
        CloseHandle(hThread);
        CloseHandle(hFile);
        CloseHandle(hProcess);
        return true;
}
注意点:理解原理,
参考:《逆向工程和核心原理》24章
源码见附件:

demo.rar

57.4 KB, 下载次数: 13, 下载积分: 吾爱币 -1 CB

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 15:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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