c++ - 外部 exe/dll 或 WTF 的镜像基地址?

标签 c++ dll exe portable-executable base-address

我有一个外部进程(exe 文件 DllProj.exe 正在运行),SampleDll.dll 链接到它(隐式链接)。我可以借助函数 imageBase() 找到链接的 dll 的基地址,但找不到进程本身的基地址!有什么区别,为什么它不能正常工作?

我的意思是,此代码返回带有正确 DOS/NT header 的 pBase:

LPVOID pBase = imageBase("DllProj.exe", "SampleDll.dll");
if (!pBase) 
    return false;
PIMAGE_DOS_HEADER pDosHeader = PIMAGE_DOS_HEADER((HMODULE)pBase); 
if (::IsBadReadPtr(pDosHeader, sizeof(IMAGE_DOS_HEADER)) ||
    IMAGE_DOS_SIGNATURE != pDosHeader->e_magic)
    return false;

但是这段代码返回的是假的:

LPVOID pBase = imageBase("DllProj.exe", "DllProj.exe");
//and so on...

这是我的程序:

LPVOID imageBase(LPSTR szVictimProcess, LPSTR szVictim)
{
    //находим процесс szVictimProcess
    DWORD aProcesses[1024], cbNeeded, nProcesses;
    unsigned int i;

    if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
        return NULL;
    nProcesses = cbNeeded / sizeof(DWORD);

    HANDLE ProcHandle = 0;
    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
    for (i = 0; i < nProcesses; i++)
    {
        ProcHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, aProcesses[i]);

        if (NULL != ProcHandle) 
        {
            HMODULE hMod[1024];
            if ( EnumProcessModules(ProcHandle, hMod, sizeof(hMod), &cbNeeded) )
            {
                GetModuleBaseName(ProcHandle, hMod[0], szProcessName, sizeof(szProcessName)/sizeof(TCHAR)); // Get the process name
                if (0 == lstrcmpiA(szVictimProcess, szProcessName))
                {
                    //находим модуль szVictim
                    DWORD nModules = cbNeeded / sizeof(HMODULE);
                    char szModName[MAX_PATH];
                    for (unsigned int j = 0; j < nModules; j++)
                    {
                        if (GetModuleFileNameEx(ProcHandle, hMod[j], szModName, sizeof(szModName))) // Get the module name
                        {
                            shortName(szModName);
                            if (0 == lstrcmpiA(szModName, szVictim)) 
                            {
                                MODULEINFO info;
                                GetModuleInformation(ProcHandle, hMod[j], &info, sizeof(info));
                                return info.lpBaseOfDll;

                                //Equal To:
                                //return hMod[j];

                                //Debug:
                                //LPSTR string = new char[256];
                                //wsprintf(string,"\t%s (0x%08X)\n", szModName, hMod[j]);
                            }
                        }
                    }
                    break;
                }
            }
        }

        CloseHandle(ProcHandle);
    }

    return NULL; 
}

P.S.: 我的下一个目标是获取 DllProj.exe 的导入表(Sample.dll 所在的位置)和 hiijack dll 的函数调用

最佳答案

如何使用这个:

#pragma comment( lib, "psapi" )

DWORD GetModuleBase(HANDLE hProc, string &sModuleName) 
{ 
   HMODULE *hModules; 
   char szBuf[50]; 
   DWORD cModules; 
   DWORD dwBase = -1; 
   //------ 

   EnumProcessModules(hProc, hModules, 0, &cModules); 
   hModules = new HMODULE[cModules/sizeof(HMODULE)]; 

   if(EnumProcessModules(hProc, hModules, cModules/sizeof(HMODULE), &cModules)) { 
      for(int i = 0; i < cModules/sizeof(HMODULE); i++) { 
         if(GetModuleBaseName(hProc, hModules[i], szBuf, sizeof(szBuf))) { 
            if(sModuleName.compare(szBuf) == 0) { 
               dwBase = (DWORD)hModules[i]; 
               break; 
            } 
         } 
      } 
   } 

   delete[] hModules; 

   return dwBase; 
}

归功于 answer here

关于c++ - 外部 exe/dll 或 WTF 的镜像基地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12493743/

相关文章:

c++ - 在用户机器上存储 key 的推荐方法

c++ - C++ sizeof() 函数可以用来防止整数溢出吗?

c++ - 在不编辑主 dll 的情况下覆盖另一个 dll 中的函数

java - 在java IDE客户端控制台中运行的简单程序可以是可执行文件吗?

jar - 将war文件转换为exe文件

html - 捆绑应用程序(exe)后出现异常 "Unknown Error"

c++ - DirectX11 纹理坐标和顶点

c - 在 Ansi-C 中导入 Delphi Dll

c++ - 同一 (Boost) DLL 的多个版本可以在同一进程中共存吗?

c++ - 多播在 Windows Vista 上不工作