Как, зная ID процесса, получить адрес в памяти, и пропатчить
От: Sasha_M  
Дата: 12.06.03 07:01
Оценка:
Как, зная ID процесса, получить его адрес в памяти, чтобы пропатчить его? Очень нужно патчить не exe-шник, а прямо в памяти. Как это сделать? Благодарствую зараннее!
Re: Как, зная ID процесса, получить адрес в памяти, и пропат
От: Alexmoon Украина  
Дата: 12.06.03 07:17
Оценка:
Здравствуйте, Sasha_M, Вы писали:

S_M>Как, зная ID процесса, получить его адрес в памяти, чтобы пропатчить его? Очень нужно патчить не exe-шник, а прямо в памяти. Как это сделать? Благодарствую зараннее!


HANDLE hProcess = OpenProcess(PROCESS_VM_WRITE, ..., dwProcessID);
WriteProcessMemory(hProcess, ...);
Re[2]: Как, зная ID процесса, получить адрес в памяти, и про
От: Sasha_M  
Дата: 12.06.03 08:36
Оценка:
Здравствуйте, Alexmoon, Вы писали:

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


S_M>>Как, зная ID процесса, получить его адрес в памяти, чтобы пропатчить его? Очень нужно патчить не exe-шник, а прямо в памяти. Как это сделать? Благодарствую зараннее!


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

A>WriteProcessMemory(hProcess, ...);

Огромное спасибо за ответ!
Теперь можно немножко подробнее, если у Вас есть время.
Я пишу на Delphi. Переменная hProcess наверное типа THandle. Я знаю смещение в exe-шнике нужного кода (например $289560 от начала (длина 9 байт)). Как прочитать этот код (с помощью ReadProcessMemory чтотбы убедиться) и как его заменить?
Еще раз благодарю за ответ, уважаемый Alexmoon!!!
Re[3]: Как, зная ID процесса, получить адрес в памяти, и про
От: Alexmoon Украина  
Дата: 12.06.03 12:18
Оценка:
Здравствуйте, 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!!!

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

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

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

HANDLE hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwProcessID);
ReadProcessMemory            (hProcess, (LPCVOID)lpBaseAddress, buffer, 9, NULL);
if(!memcmp(sign, buffer, 9)) WriteProcessMemory(hProcess, (LPCVOID)lpBaseAddress, patch,  9, NULL);
else throw TEXT("the required signature is not retrieved");
Re[3]: Как, зная ID процесса, получить адрес в памяти, и про
От: Кодт Россия  
Дата: 12.06.03 19:19
Оценка:
Здравствуйте, Sasha_M, Вы писали:

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


То, что ты знаешь смещение в файле — тебя не спасет: загрузчик распаковывает экзе-файл, выцепляя оттуда таблицы экспорта, таблицы перемещаемых значений, и прочая, и прочая; кладет код начиная с определенного адреса; корректирует перемещаемые значения...
Так что тебе придется произвести некоторый объем работ по анализу екзешника (почти что эмулировать загрузчик), прежде чем ковырять память процесса.

Кроме того, ты должен иметь права отладчика, иначе попытка открыть процесс на чтение/запись будет пресечена.
Перекуём баги на фичи!
Re[4]: Как, зная ID процесса, получить адрес в памяти, и про
От: SergH Россия  
Дата: 12.06.03 23:19
Оценка:
Здравствуйте, Кодт, Вы писали:

К>То, что ты знаешь смещение в файле — тебя не спасет: загрузчик распаковывает экзе-файл, выцепляя оттуда таблицы экспорта, таблицы перемещаемых значений, и прочая, и прочая; кладет код начиная с определенного адреса; корректирует перемещаемые значения...


Он, конечно, корректирует, но, вроде, ничего не сдвигает. Хотябы потому, что загрузка dll/exe основана на той же технологии, что и memory mapped files.

To Sasha_M:
Не забудь воспользоваться VirtualProtectEx. А то, скорее всего, ничего записать не удастся.
Делай что должно, и будь что будет
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...
Пока на собственное сообщение не было ответов, его можно удалить.