C++ 在存储器/内存中查找特定程序的基址?

C++ 在存储器/内存中查找特定程序的基址?,c++,visual-studio,memory-management,C++,Visual Studio,Memory Management,我想在没有任何手动输入的情况下找到程序的当前基址。基本上,我想使用偏移量写入内存中的特定地址。为此,我需要找到我正在修改的程序的基址。目前,我可以通过另一个软件手动查找基址来实现这一点,但是,我希望它是自动化的 我尝试了GetModuleHandle(NULL)并将其转换为uintpttr\t以获取基址,但它似乎没有指向正确的位置 我可能不理解一些事情,我感谢所有的帮助 编辑:我正在寻找基址的相对偏移量。我找到了一种获取基址的方法,现在我只需要实际基址的偏移量。 --每个程序都有自己的恒定相对偏

我想在没有任何手动输入的情况下找到程序的当前基址。基本上,我想使用偏移量写入内存中的特定地址。为此,我需要找到我正在修改的程序的基址。目前,我可以通过另一个软件手动查找基址来实现这一点,但是,我希望它是自动化的

我尝试了
GetModuleHandle(NULL)
并将其转换为
uintpttr\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
这些是我们需要的主要标题

第一个标头将通过拍摄所有正在运行的进程的快照来查找进程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;
}
按照我的理解,每个程序都有自己的基址(我们找到的)以及一个集合指针,它将引导您指向动态指针基址(您添加到基址的指针可以通过特殊软件或在线找到)


谢谢大家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; }