2010-11-16 67 views
1

我正在构建一个监视器应用程序,并有一些线程问题。线程在别人的地址空间

我有,使用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()...

感谢

+0

你可以发布你调用'ReadProcessMemory'的代码以及你正在使用的进程句柄吗? – casablanca 2010-11-17 00:08:40

+0

卡萨布兰卡它现在在那里。 – flavour404 2010-11-17 00:27:44

+0

请参阅@Remus Rusanu的回答,这几乎可以解释您的问题。另外,由于你的线程已经在另一个进程的上下文中运行,你可以简单地使用'GetCurrentProcess'而不是'GetWindowThreadProcessId'和'OpenProcess'。 – casablanca 2010-11-17 00:33:20

回答

1

有一件事是肯定的:地址读写都绝对不是一个DWORD型。从上面的代码看来,您通过DWORD addr作为地址进行读取,然后您启动一个线程,您将本地addr参数的地址传递给该线程。最有可能的是,线程proc然后尝试读取当前进程中原始线程栈(任何进程中的无意义地址)处的addr参数曾经是的地址,并且结果是随机的(有时候你会打头奖,并阅读远程过程中的一些无辜的受害者位置)。

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

void readAddresses(LPVOID addr) 
{ 
LPDWORD dwThreadID; 
HANDLE hThread = CreateThread(NULL,0,myThreadProc,addr,0,dwThreadID); 
} 

DWORD WINAPI myThreadProc(LPVOID addr) 
{ 
    ... 
    ReadProcessMemory (..., addr); 
} 
+0

实际上DWORD是正确的,这是从托管代码传递到.dll的值。地址是正确的,但是我试图将它作为LPVOID传递给线程是导致addr值变成垃圾的原因。你有什么建议我可以如何将一个有效地址的值作为双字传递给线程函数? – flavour404 2010-11-17 08:08:59

+0

不,“DWORD”不正确。托管代码将“地址”作为“IntPtr”传递给接受LPVOID参数的本机DLL入口点。 – 2010-11-17 15:28:38

+0

好的Remus。所以我已经拿出了所有传递的问题,并简单地将正确的地址硬编码到线程中。该地址是有效的,并且与ReadProcessMemory一起正常工作,并从内存中返回正确的值。但是,当我运行线程的地址返回垃圾。我从十六进制转储中获取地址,例如0x07AC9DE4。 – flavour404 2010-11-17 19:17:52