我有这个线程在我的程序进程中运行。该线程应该读取此进程的程序内存以检测是否发生了任何禁止的代码注入(inject)。现在我如何访问进程的程序内存?我可以使用
ReadProcessMemory();
函数,如果我得到带有 ALL_ACCESS 标志的进程句柄来读取程序内存?
还有一种方法可以搜索此程序内存,以便我可以将此内存扫描限制为少数特定的感兴趣方法或检测特定方法的基地址和长度?
最佳答案
是的,如果您获得具有 READ 权限的进程句柄(包含在 PROCESS_ALL_ACCESS 中),您可以使用 ReadProcessMemory() 来读取目标进程的内存。
您要做的就是所谓的模式扫描。首先,您将使用 VirtualQueryEx() 来查找具有 MEM_COMMIT 作为状态并且没有 PAGE_NOACCESS 或 PAGE_GUARD 作为保护类型的内存区域。
您可以使用模式扫描功能遍历这些内存区域,以查找您想要列入黑名单的特定签名。
这是循环内存的基本思想
int main()
{
DWORD procid = GetProcId("whatever.exe");
MEMORY_BASIC_INFORMATION meminfo;
unsigned char* addr = 0;
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);
MEMORY_BASIC_INFORMATION mbi;
while (VirtualQueryEx(hProc, addr, &mbi, sizeof(mbi)))
{
if (mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS)
{
std::cout << "base : 0x" << std::hex << mbi.BaseAddress << " end : 0x" << std::hex << (uintptr_t)mbi.BaseAddress + mbi.RegionSize << "\n";
}
addr += mbi.RegionSize;
}
CloseHandle(hProc);
}
您可以从这里找到许多不同的图案扫描功能来完成这项工作。
关于c++ - 我可以使用 ReadProcessMemory 在 Windows 中读取进程的程序内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28882723/