如何使用 g++ 编译的代码读取进程的内存?
How to read a process' memory using code compiled with g++?
我想读取 notepad.exe
的进程内存并找到其中的字符串 Hello World!
(它是在记事本 window 中输入的)。
我想使用 g++.exe
,而不是 cl.exe
,因为尝试弄清楚如何设置正确的环境变量以便能够从命令中使用它太麻烦了行而不是从内部 Visual Studio。还有其他原因,但问题是我需要使用 g++.exe
。
尝试编译以下代码会出现以下错误(我知道代码,即使 运行 也不会按原样执行任何操作。但这是第一步):
wstring
was not declared in this scope
szModName
was not declared in this scope
expected ;
before wstrModContain
wstrModContain
was not declared in this scope
string
has not been declared
#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;
}
这是一个比我上一个更好的答案,因为前一个答案只搜索了可执行映像,它只包含 .exe
文件中的内容,而不是动态内存。
编译为:g++ filename.cpp -lpsapi
#include
的顺序很重要; <Windows.h>
必须在 <psapi.h>
之前。
#include <Windows.h>
#include <psapi.h>
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
DWORD pID;
HWND hwnd = FindWindowA(NULL, "Untitled - Notepad"); // the window title
if (!hwnd)
std::cout << "FindWindowA Error: " << GetLastError() << std::endl;
if (!GetWindowThreadProcessId(hwnd, &pID))
std::cout << "GetWindowThreadProcessId Error: " << GetLastError() << std::endl;
HANDLE pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
if (!pHandle)
std::cout << "OpenProcess Error:" << GetLastError() << std::endl;
unsigned char *p = NULL;
MEMORY_BASIC_INFORMATION info;
for (p = NULL; VirtualQueryEx(pHandle, p, &info, sizeof(info)) == sizeof(info); p += info.RegionSize) {
std::vector<char> buffer;
if (info.State == MEM_COMMIT && (info.Type == MEM_MAPPED || info.Type == MEM_PRIVATE)) {
SIZE_T bytes_read;
buffer.resize(info.RegionSize);
ReadProcessMemory(pHandle, p, &buffer[0], info.RegionSize, &bytes_read);
buffer.resize(bytes_read);
for (int i = 0; i < buffer.size(); i++) {
char value = buffer.at(i);
std::cout << value;
}
}
}
}
有趣的是,我的最后一个答案因调用评论而被删除 "imbecilic"。无益的、错误的、居高临下的评论没有回答问题,但它们本身并没有被删除。
我想读取 notepad.exe
的进程内存并找到其中的字符串 Hello World!
(它是在记事本 window 中输入的)。
我想使用 g++.exe
,而不是 cl.exe
,因为尝试弄清楚如何设置正确的环境变量以便能够从命令中使用它太麻烦了行而不是从内部 Visual Studio。还有其他原因,但问题是我需要使用 g++.exe
。
尝试编译以下代码会出现以下错误(我知道代码,即使 运行 也不会按原样执行任何操作。但这是第一步):
wstring
was not declared in this scope
szModName
was not declared in this scopeexpected
;
beforewstrModContain
wstrModContain
was not declared in this scope
string
has not been declared
#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;
}
这是一个比我上一个更好的答案,因为前一个答案只搜索了可执行映像,它只包含 .exe
文件中的内容,而不是动态内存。
编译为:g++ filename.cpp -lpsapi
#include
的顺序很重要; <Windows.h>
必须在 <psapi.h>
之前。
#include <Windows.h>
#include <psapi.h>
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
DWORD pID;
HWND hwnd = FindWindowA(NULL, "Untitled - Notepad"); // the window title
if (!hwnd)
std::cout << "FindWindowA Error: " << GetLastError() << std::endl;
if (!GetWindowThreadProcessId(hwnd, &pID))
std::cout << "GetWindowThreadProcessId Error: " << GetLastError() << std::endl;
HANDLE pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
if (!pHandle)
std::cout << "OpenProcess Error:" << GetLastError() << std::endl;
unsigned char *p = NULL;
MEMORY_BASIC_INFORMATION info;
for (p = NULL; VirtualQueryEx(pHandle, p, &info, sizeof(info)) == sizeof(info); p += info.RegionSize) {
std::vector<char> buffer;
if (info.State == MEM_COMMIT && (info.Type == MEM_MAPPED || info.Type == MEM_PRIVATE)) {
SIZE_T bytes_read;
buffer.resize(info.RegionSize);
ReadProcessMemory(pHandle, p, &buffer[0], info.RegionSize, &bytes_read);
buffer.resize(bytes_read);
for (int i = 0; i < buffer.size(); i++) {
char value = buffer.at(i);
std::cout << value;
}
}
}
}
有趣的是,我的最后一个答案因调用评论而被删除 "imbecilic"。无益的、错误的、居高临下的评论没有回答问题,但它们本身并没有被删除。