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;
}
按照我的理解,每个程序都有自己的基址(我们找到的)以及一个集合指针,它将引导您指向动态指针基址(您添加到基址的指针可以通过特殊软件或在线找到)
谢谢大家难道这不是ASLR故意设计的困难的事情吗?@ CDHOWIE,我的设置中有这个选项,你能告诉我为什么你需要基本地址和偏移量吗?@巴里尼奇,我正在努力学习更高级的C++。这有助于我了解基本的windows进程以及内存的存储方式。是一个东西。@Mgetz GetCurrentProcessId检索调用进程的进程标识符。我需要找到在我的系统中运行的另一个程序的进程id。我很高兴您得到了您的解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。@BarrnetChou我将在6小时内通过2天的标记!
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;
}