Re[4]: Как, зная ID процесса, получить адрес в памяти, и про
От: Sasha_M  
Дата: 13.06.03 09:37
Оценка: 13 (1)
Здравствуйте, Alexmoon, Вы писали:

A>Здравствуйте, Sasha_M, Вы писали:


A>>>HANDLE hProcess = OpenProcess(PROCESS_VM_WRITE, ..., dwProcessID);

A>>>WriteProcessMemory(hProcess, ...);

S_M>>Огромное спасибо за ответ!

S_M>>Теперь можно немножко подробнее, если у Вас есть время.
S_M>>Я пишу на Delphi. Переменная hProcess наверное типа THandle. Я знаю смещение в exe-шнике нужного кода (например $289560 от начала (длина 9 байт)). Как прочитать этот код (с помощью ReadProcessMemory чтотбы убедиться) и как его заменить?
S_M>>Еще раз благодарю за ответ, уважаемый Alexmoon!!!

A>С типами в Паскале сам разберешся. Ну приблизительно вот так:


A>
A>//только попробуй не забыть, что сигнатуры, которые ты будешь искать, должны по байтно быть в обратном порядке

A>//адрес смещения в адресном пространстве чужого процесса
A>DWORD lpBaseAddress = 0x289560;
A>//считываемый буффер
A>BYTE  buffer[9] = {0};
A>//сигнатура, которую мы ищем для замены
A>BYTE  sign  [9] = {xx,xx,xx,xx,xx,xx,xx,xx,xx};
A>//новая последовательность байт, после патча
A>BYTE  patch [9] = {xx,xx,xx,xx,xx,xx,xx,xx,xx};

A>HANDLE hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwProcessID);
A>ReadProcessMemory            (hProcess, (LPCVOID)lpBaseAddress, buffer, 9, NULL);
A>if(!memcmp(sign, buffer, 9)) WriteProcessMemory(hProcess, (LPCVOID)lpBaseAddress, patch,  9, NULL);
A>else throw TEXT("the required signature is not retrieved");
A>


Большое спасибо, Alexmoon!!!

Я вчера не дождался ответа и сам разобрался по Вашей первой подсказке!
Все ПОЛУЧИЛОСЬ! Сделал именно так, как во второй подсказке!
Могу сообщить Кодт-у, чтот в моем случае никакого сдвига не оказалось, байты оказались по тому-же смещению, что и в exe-шнике.
Процесс открывал, как OpenProcess(PROCESS_ALL_ACCESS, ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.