【发布时间】:2020-05-17 15:06:01
【问题描述】:
我想读取notepad.exe的进程内存并在其中找到字符串Hello World!(在记事本窗口中输入)。
我想使用g++.exe,而不是cl.exe,因为尝试弄清楚如何设置正确的环境变量以便能够从命令行而不是从 Visual 内部使用它太麻烦了工作室。还有其他原因,但问题是我需要使用g++.exe。
尝试编译以下代码会出现以下错误(我知道代码即使运行也不会按原样执行任何操作。但这是第一步):
wstring未在此范围内声明
szModName未在此范围内声明预计
;在wstrModContain之前
wstrModContain未在此范围内声明
string尚未声明
#include <windows.h>
#include <psapi.h>
HMODULE GetModule();
int main() {
return 0;
}
HMODULE GetModule() {
HMODULE hMods[1024];
HWND hWnd = FindWindowA(0, "Untitled - Notepad");
DWORD pID;
GetWindowThreadProcessId(hWnd, &pID);
HANDLE pHandle = OpenProcess(PROCESS_VM_READ, FALSE, pID);
DWORD cbNeeded;
unsigned int i;
if (EnumProcessModules(pHandle, hMods, sizeof(hMods), &cbNeeded)) {
for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) {
wstring szModName[MAX_PATH];
if (GetModuleFileNameEx(pHandle, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR))) {
TCHAR* wstrModName = szModName;
wstring wstrModContain = "notepad.exe";
if (wstrModName.find(wstrModContain) != string::npos) {
CloseHandle(pHandle);
return hMods[i];
}
}
}
}
return nullptr;
}
【问题讨论】:
-
请提取并提供minimal reproducible example。此外,其中一些错误非常基本,我还建议您拿起一本关于 C++ 的书。
-
如果您使用的是
windows.h,那么我确实会使用visual studio,而不是GCC,因为linux 工具链显然不支持windows api。您是否尝试过实际制作 Visual Studio 解决方案和项目来编译您的 exe,而不是直接调用 cl.exe? -
您可能想查看x64dbg 的源代码,它是Windows 的开源调试器。它读取进程内存。
-
要记住的一个很好的注意事项是,我相信您应该将您的程序编译成与目标进程相同的位。 (
64bit or 32bit)。我一直在研究一个类似的问题:stackoverflow.com/questions/61777539/…如果你有兴趣。 -
希望对您有所帮助!如果您设法找到正确的顶部地址,请随时 fork 我的项目并提出改进建议!
标签: c++ readprocessmemory