c++ - 在存储/内存中查找特定程序的基地址?

标签 c++ visual-studio memory-management

我想在没有任何手动输入的情况下找到程序的当前基地址。基本上我想使用偏移量写入内存中的特定地址。为此,我需要找到我正在修改的程序的基地址。目前,我可以通过另一个软件手动查找基地址来做到这一点,但是,我希望它是自动化的。
我试过GetModuleHandle(NULL)并将其转换为 uintptr_t获取基地址,但它似乎没有指向正确的位置。
我可能不理解某些事情,我感谢所有帮助。
编辑:我正在寻找基地址的相对偏移量。我找到了一种获取基地址的方法,现在我只需要实际基地址的偏移量。
-- 每个程序都有自己的常数相对偏移量,可以在网上或通过特殊软件找到。
解决方案在下面。

最佳答案

我对此进行了很多研究,我们只需要两种方法,两种方法即可找到您想要的任何进程的基地址。

DWORD GetProcessId(const wchar_t* processName); //gets the process Id

uintptr_t GetModuleBaseAddress(DWORD processId, const wchar_t* moduleName);  //gets the module base address
这些是我们需要的主要标题。
第一个 header 将通过拍摄所有正在运行的进程的快照并将每个名称与您传入的名称进行比较来找到进程 ID。
DWORD GetProcessId(const wchar_t* processName) {

    DWORD processId = 0;
    HANDLE hSnap = (CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0));
    if (hSnap != INVALID_HANDLE_VALUE) {

        PROCESSENTRY32 processEntry;
        processEntry.dwSize = sizeof(processEntry);

        if (Process32First(hSnap, &processEntry)) {

            do {
            
                if (!_wcsicmp(processEntry.szExeFile, processName)) {

                    processId = processEntry.th32ProcessID;
                    break;
                }
            } while (Process32Next(hSnap, &processEntry));
        }
    }
    else {

        cout << "CreateToolhelp32Snapshot failed. GetLastError = " << dec << GetLastError() << endl;
        system("pause");
        return EXIT_FAILURE;
    }

    CloseHandle(hSnap);
    return processId;
}
此方法对指定进程中所有正在运行的模块进行快照,并比较您指定的每个模块(在我的情况下,我需要整个进程的基地址,因此它与 processName 相同)当前的每个模块过程。
uintptr_t GetModuleBaseAddress(DWORD processId, const wchar_t* moduleName) {

    uintptr_t moduleBaseAddr = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, processId);
    if (hSnap != INVALID_HANDLE_VALUE) {

        MODULEENTRY32 moduleEntry;
        moduleEntry.dwSize = sizeof(moduleEntry);
        if (Module32Next(hSnap, &moduleEntry)) {

            do {
            
                if (!_wcsicmp(moduleEntry.szModule, moduleName)) {

                    moduleBaseAddr = (uintptr_t)moduleEntry.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnap, &moduleEntry));
        }
    }

    CloseHandle(hSnap);
    return moduleBaseAddr;
}
我的理解是,每个程序都有自己的基地址(我们找到的)以及一个设置指针,它将引导您到动态指针基地址(您添加到基地址的指针可以通过特殊软件找到或在线)。
谢谢大家!

关于c++ - 在存储/内存中查找特定程序的基地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63257265/

相关文章:

c++ - 为 LLVM libc++ 3.3 构建静态库和共享库

c++ - 重复执行 lambda 函数

.net - 可以阻止某种方法出现在智能感知中吗?

c# - 使用 block 与功能 block

c++ - 在动态分配的多维数组之后清理

c - 结构对齐问题

c++ - 在抛出 'char const*' 错误实例后调用终止

c++ - 我写了一个简单的 vector 程序,其中我得到了以下输出。你能帮我理解它的输出吗?

c++ - C#WPF和C++/CLI和C++在C++/CLI中添加外部库错误

c++ - Visual C++ - 自动更正