我正在构建一个监视器应用程序,并有一些线程问题。线程在别人的地址空间
我有,使用cbt挂钩,注入一个DLL到另一个进程内存。我正在某些地址读取其他应用程序的内存。麻烦的是我正在使用一个循环来观察过程,基本上被观看的应用程序不能自由进行。所以我想我的观察过程在一个线程中。我使用下面的代码来创建线程:
void readAddresses(DWORD addr)
{
LPDWORD dwThreadID;
HANDLE hThread = CreateThread(NULL,0,ThreadProc,&addr,0,dwThreadID);
}
我曾尝试用CreateRemoteThread(...),以及,并得到了同样的错误。当它调用ReadProcessMemory()api时,线程运行失败,我不确定我做错了什么。
//going to pass in an address, dword
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
DWORD pid;
GetWindowThreadProcessId(targetWindow,&pid);
HANDLE hProcess = ::OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION |
PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ,
FALSE, pid);
...
ReadProcessMemory(hProcess,(void *)_start, data, 255, &lpRead);
...
}
麻烦的是,当我打电话readprocessmemory现在我得到一个访问冲突。我很好奇的是,线程在与其注入的进程相同的进程地址空间中运行。正如我所说的没有线程代码它工作正常,但我需要监视器代码在后台运行,我想知道如何实现这一目标?我应该使用创建远程线程?
由于莱姆斯最高审计机关使用beginthread()或beginthreadex()...
感谢
你可以发布你调用'ReadProcessMemory'的代码以及你正在使用的进程句柄吗? – casablanca 2010-11-17 00:08:40
卡萨布兰卡它现在在那里。 – flavour404 2010-11-17 00:27:44
请参阅@Remus Rusanu的回答,这几乎可以解释您的问题。另外,由于你的线程已经在另一个进程的上下文中运行,你可以简单地使用'GetCurrentProcess'而不是'GetWindowThreadProcessId'和'OpenProcess'。 – casablanca 2010-11-17 00:33:20