穿过别人的地址空间

时间:2010-11-16 22:10:59

标签: c++ multithreading visual-studio-2008

我正在构建一个监控应用程序,并且遇到了一些线程问题。

我使用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时,我现在遇到访问冲突。我很好奇的是,线程在与注入过程相同的进程地址空间中运行。正如我所说没有线程代码它工作正常,但我需要监视器代码在后台运行,我想知道如何实现这一点?我应该使用创建远程线程吗?

由于Remus sais使用beginthread()或beginthreadex()......

谢谢

1 个答案:

答案 0 :(得分:1)

有一件事是肯定的:读写地址绝对不是DWORD类型。从上面的代码中,您似乎传递了DWORD addr作为地址进行读取,然后您启动了一个线程,您传递了本地{{>>的地址{{ 1}}参数。很可能线程proc然后尝试读取原始线程堆栈中当前进程中addr参数曾经的地址(现在 any中的无意义地址 process)并且结果是随机的(有时候你会在中途获得大奖并在远程进程中读取一些无辜的受害者位置。)

  • 传入地址以作为正确的地址(LPVOID)读取。 DWORD 不能是对的。
  • 传递给后台线程你想要读取的地址,而不是一些无法使用的本地堆栈帧垃圾

addr