пронизывать в чужом адресном пространстве - PullRequest
1 голос
/ 17 ноября 2010

Я создаю приложение монитора и у меня возникают проблемы с многопоточностью.

Я с помощью ловушки cbt вставил dll в память других процессов.Я читаю память другого приложения по определенным адресам.Беда в том, что я использовал цикл, чтобы наблюдать за процессом, и в основном просматриваемое приложение не было бесплатным для продолжения.Так что я подумал о том, чтобы поставить процесс просмотра в цепочку.Я использую приведенный ниже код для создания потока:

void readAddresses(DWORD addr)
{
LPDWORD dwThreadID;
HANDLE hThread = CreateThread(NULL,0,ThreadProc,&addr,0,dwThreadID);
}

Я также попытался с CreateRemoteThread (...) и получил ту же ошибку.С потоком, работающим, когда он вызывает API ReadProcessMemory (), происходит сбой, и я не совсем уверен, что делаю неправильно.

//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 IТеперь получите нарушение доступа.Что меня интересует, так это то, что поток работает в том же адресном пространстве процесса, что и процесс, в который он был внедрен.Как я уже сказал без кода потока, он работает нормально, но мне нужно, чтобы код монитора работал в фоновом режиме, и мне интересно, как этого добиться?Должен ли я использовать создание удаленного потока?

В качестве Ремуса можно использовать beginthread () или beginthreadex () ...

Спасибо

1 Ответ

1 голос
/ 17 ноября 2010

Одно можно сказать точно: адреса для чтения и записи определенно не относятся к типу DWORD.Из приведенного выше кода кажется, что вы передаете DWORD addr в качестве адреса для чтения, затем запускаете поток, в который вы передаете адрес вашего локального addr параметра .Скорее всего, процесс потока затем пытается прочитать адрес, где параметр 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...