【发布时间】:2016-11-09 07:21:42
【问题描述】:
我知道还有其他人问过这个问题,但似乎他们都没有得出令人满意或可以理解的结论。我不能使用没有回答的东西。我不太确定问题出在哪里,我尝试了各种不同的解决方案但没有成功,所以这是我的代码:
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_QUERY_INFORMATION, FALSE, (DWORD)7312);
if(hProc == NULL)
{
cout << "Error: " << GetLastError() << endl;
}
HANDLE token;
OpenProcessToken(hProc, TOKEN_ALL_ACCESS, &token);
void *baseAddr = VirtualAllocEx(hProc, NULL, 500, MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if(baseAddr == NULL)
{
cout << "VirtualAllocEx has failed" << endl;
}
else
{
cout << "Base Address: " << baseAddr << "\n" << endl;
}
DWORD prevProt;
if(VirtualProtectEx(hProc, &baseAddr, sizeof(DWORD), PAGE_EXECUTE_READWRITE, &prevProt) == 0)
{
if(GetLastError() == 87)
{
cout << "ERROR_INVALID_PARAMETER\n" << endl;
}
else if(GetLastError() == 487)
{
cout << "ERROR_INVALID_ADDRESS\n" << endl;
}
}
void *buffer;
if(ReadProcessMemory(hProc, baseAddr, &buffer, sizeof(SIZE_T), NULL) == 0)
{
if(GetLastError() == 299)
{
cout << "ERROR_PARTIAL_COPY" << endl;
}
}
}
非常感谢您提供的任何贡献和知识! :)
【问题讨论】:
-
你有 32 位进程和 64 位目标吗?
-
这里只和我一起,因为我真的不太了解内存是如何工作的,但我不知道其中的区别。
-
@DavidLeon:你到底想用这段代码完成什么?
-
我很好奇反编译是如何工作的,所以我正在我制作的一些屏幕捕获软件上进行测试。
-
要简单地读取另一个进程的编译代码,您根本不需要使用
VirtualAllocEx()和VirtualProtectEx()。只需分配一个足够大的本地缓冲区来接收代码,然后将ReadProcessMemory()放入该缓冲区。代码可能很大,因此您可能必须分块阅读。至于代码的基地址,您将不得不读取并解析远程进程的 PE 标头以发现代码在内存中的位置。然后可以根据需要手动拆解。
标签: c++ winapi dll-injection