Посл.ответ |
Сообщение |
Ранг: 11.9 (новичок), 1thx Активность: 0.01↘0 Статус: Участник
|
Создано: 30 мая 2007 19:29 · Личное сообщение · #1
Здравствуйте. У меня задача - пропатчить процесс из драйвера зная его Pid и смещение в памяти куда патчить (00445409h)
Как оcуществить сие из драйвера?
| Сообщение посчитали полезным: |
|
 Ранг: 387.4 (мудрец) Активность: 0.17↘0 Статус: Участник системщик
|
Создано: 30 мая 2007 19:42 · Поправил: s0larian · Личное сообщение · #2
Тебе надо патчить раждый раз когда процесс запускается или только раз? Если первое, то придётся ставить делать API перехваты. Если второе, то как ты будешь знать когда этот момент настал? Запускать прогу которая делает DeviceIOControl(patch_now)?
Кста, зачем именно из ядра? Проще всего написать (или сделать готовым генератором) патчер который изменяет твои байты в памяти процесса из user mode используя
BOOL WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPCVOID lpBuffer,
SIZE_T nSize,
SIZE_T* lpNumberOfBytesWritten
);
| Сообщение посчитали полезным: |
Ранг: 11.9 (новичок), 1thx Активность: 0.01↘0 Статус: Участник
|
Создано: 30 мая 2007 19:52 · Личное сообщение · #3
Не, я хочу из ядра - в качестве эксперимента для саморазвития, в юзермоде делал как ты сказал - используя WriteProcessMemory. Я так понял что писать/ читать можно можно если вызвать ункцию KeAttachProcess... но пока не поял как работает и что делать...
| Сообщение посчитали полезным: |
 Ранг: 2014.5 (!!!!), 1278thx Активность: 1.34↘0.25 Статус: Модератор retired
|
Создано: 30 мая 2007 20:17 · Личное сообщение · #4
Дело в том, что драйвер работает в контексте какого-то процесса. Для того, чтобы патчить именно нужный процесс, надо его перекинуть в этот контекст, который как раз и делается через Аттач. Кури примеры ДДК и васм, наверняка яндекс выкинет немало ссылей на эту функу. Для начала можешь покурить статью Мс-Рема про современные технологии дампинга на васме.
| Сообщение посчитали полезным: |
 Ранг: 387.4 (мудрец) Активность: 0.17↘0 Статус: Участник системщик
|
Создано: 30 мая 2007 20:20 · Личное сообщение · #5
Igit32, ты не о том думаешь. Посмотри на шаг вперёд и ответь на эти вопросы:
a) Тебе надо патчить раждый раз когда процесс запускается или только раз?
b) если только раз, то как ты дашь знать своему драйверу "патчи, сцуко, прямо сейчас"?
| Сообщение посчитали полезным: |
Ранг: 11.9 (новичок), 1thx Активность: 0.01↘0 Статус: Участник
|
Создано: 30 мая 2007 20:42 · Личное сообщение · #6
s0larian об этом пока не думал. Просто написал программу которая
1. Инсталирует и запускает драйвер
2. посылает этому драйверу IOCTL запрос "патчи, сцуко, прямо сейчас"
3. и после запроса должна она патчить эту программу. Вот.
Как такового смысла нету просто изучение написания драйверов. А так целью ставлю - написать отладчик, трейсер и т.п. в качестве диплома в универе.
Archer про эту функцию узнал именнно из этой статьи. Но вот использовать её пытаюсь так
PEPROCESS process = PsGetCurrentProcess();
KeAttachProcess(process);
__asm{
mov eax, 44090Fh
mov [eax], byte ptr 90h;
}
KeDetachProcess();
и сразу вылетаю в BSOD
| Сообщение посчитали полезным: |
Ранг: 162.2 (ветеран) Активность: 0.09↘0 Статус: Участник
|
Создано: 30 мая 2007 21:05 · Личное сообщение · #7
Igit32
На вход - id процеса который хочешь патчить.
void AttachToProcess(ULONG id)
{
ULONG CurProc;
ULONG Status;
PsLookupProcessByProcessId(id,(PEPROCESS*)&CurProc);
KeAttachProcess(CurProc);
return;
}
| Сообщение посчитали полезным: |
Ранг: 11.9 (новичок), 1thx Активность: 0.01↘0 Статус: Участник
|
Создано: 30 мая 2007 21:18 · Личное сообщение · #8
asd id процесса - это его PID?
| Сообщение посчитали полезным: |
 Ранг: 2014.5 (!!!!), 1278thx Активность: 1.34↘0.25 Статус: Модератор retired
|
Создано: 30 мая 2007 21:51 · Личное сообщение · #9
Да, это ПИД, в справке это написано. Если читал ту статью про дампинг, то там код есть для дампинга, поменяй чтение на запись и всё.
| Сообщение посчитали полезным: |
 Ранг: 387.4 (мудрец) Активность: 0.17↘0 Статус: Участник системщик
|
Создано: 30 мая 2007 23:31 · Личное сообщение · #10
Igit32 пишет:
PEPROCESS process = PsGetCurrentProcess();
это даст тебе процесс твоей же user mode апликухи которая вызывает IO Control.
| Сообщение посчитали полезным: |
Ранг: 11.9 (новичок), 1thx Активность: 0.01↘0 Статус: Участник
|
Создано: 31 мая 2007 13:05 · Поправил: Igit32 · Личное сообщение · #11
Все, понял. После KeAttachProcess порцесс читаеться замечательно. т.е.
mov eax, 44090Fh
mov ch, byte ptr [eax]
смотрю в отладчике - в ch храниться то что на самом деле по этому адресу. Но вот при поптыке запиcи
mov [eax], 90h
падаю в синий экран. Что не так? Может нужно установить какой-то определенный IRQL? почему мне не дают писать непонятно, синий экран ничего путнего не говорит.
| Сообщение посчитали полезным: |
 Ранг: 68.0 (постоянный), 6thx Активность: 0.06↘0 Статус: Участник
|
Создано: 31 мая 2007 13:32 · Личное сообщение · #12
Ты видимо пытаешься записать в секцию кода, а она не имеет аттрибута writeable.
| Сообщение посчитали полезным: |
Ранг: 11.9 (новичок), 1thx Активность: 0.01↘0 Статус: Участник
|
Создано: 31 мая 2007 13:34 · Личное сообщение · #13
да, в секцию кода
| Сообщение посчитали полезным: |
 Ранг: 68.0 (постоянный), 6thx Активность: 0.06↘0 Статус: Участник
|
Создано: 31 мая 2007 13:37 · Личное сообщение · #14
Ну тогда попробуй сначала изменить этот атрибут на wreteable с помощью LordPE
если поможет, реализуешь это программно в памяти.
| Сообщение посчитали полезным: |
Ранг: 11.9 (новичок), 1thx Активность: 0.01↘0 Статус: Участник
|
Создано: 31 мая 2007 13:41 · Личное сообщение · #15
Dr3d Большое спасибо! Буду порбовать.
| Сообщение посчитали полезным: |
 Ранг: 387.4 (мудрец) Активность: 0.17↘0 Статус: Участник системщик
|
Создано: 31 мая 2007 19:45 · Личное сообщение · #16
Igit32, её патчить нельзя из-за атрибутов. Но, ты можешь убрать WriteProtect бит из cr0 и всё пропачиццо.
| Сообщение посчитали полезным: |
 Ранг: 66.1 (постоянный) Активность: 0.04↘0 Статус: Участник
|
Создано: 01 июня 2007 13:05 · Поправил: AdOLF_04 · Личное сообщение · #17
Несколько замечаний:
1. Вместо KeAttachProcess лучше использовать KeStackAttachProcess
2. После записи нужно обязательно выполнить KeUnstackDetachProcess
3. Функцию записи лучше поместить в такой блок:
try {
/* тут запись */
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
В этом случае, если будешь пытаться записать по неправильному адресу (или еще чего  ), система не упадет в BSOD.
4. Получать указатель на EPROCESS лучше так:
PEPROCESS process = NULL;
NTSTATUS st;
st = PsLookupProcessByProcessId((HANDLE)Pid, &process);
if (NT_SUCCESS(st)) {
/* тут запись */
}
Удачи!
| Сообщение посчитали полезным: |
 Ранг: 66.1 (постоянный) Активность: 0.04↘0 Статус: Участник
|
Создано: 01 июня 2007 16:23 · Личное сообщение · #18
Archer пишет:
Дело в том, что драйвер работает в контексте какого-то процесса.
А если немного конкретнее - то SYSTEM
Igit32 пишет:
PEPROCESS process = PsGetCurrentProcess();
PsGetCurrentProcess получает указатель на EPROCESS процессса SYSTEM.
| Сообщение посчитали полезным: |
 Ранг: 527.7 (!), 381thx Активность: 0.16↘0.09 Статус: Участник Победитель турнира 2010
|
Создано: 01 июня 2007 18:26 · Личное сообщение · #19
Шрайбер в помощь до и сырки Ms-Rema к XProt Dumper помогут
----- 127.0.0.1, sweet 127.0.0.1 | Сообщение посчитали полезным: |
Ранг: 228.7 (наставник), 2thx Активность: 0.12↘0 Статус: Участник malware research
|
Создано: 01 июня 2007 18:37 · Поправил: Error_Log · Личное сообщение · #20
После получения EPROCESS через PsLookupProcessByProcessId, когда завершишь работу с EPROCESS не забудь так же вызывть ObDereferenceObject(process);
PsGetCurrentProcess вернет PEPROCESS процесса, которому принадлежит вызывающий поток, так что SYSTEM будет не всегда.
Если вызов PsGetCurrentProcess стоит в обработчике IOCTL, то s0larian пишет: это даст тебе процесс апликухи которая вызывает IO Control , если, например, в DriverEntry - тогда действительно SYSTEM
----- Research is my purpose | Сообщение посчитали полезным: |
Ранг: 19.8 (новичок) Активность: 0.02↘0 Статус: Участник
|
Создано: 02 июня 2007 08:43 · Личное сообщение · #21
AdOLF_04
Драйвер работает в контексте некоторого процесса не обязательно system
| Сообщение посчитали полезным: |
Ранг: 191.8 (ветеран), 46thx Активность: 0.17↘0 Статус: Участник
|
Создано: 02 июня 2007 12:09 · Личное сообщение · #22
Одна статья на глаза попалась - мож в помощь
pmode.net/USERS/125/Files/uminkm.htm
| Сообщение посчитали полезным: |
 Ранг: 66.1 (постоянный) Активность: 0.04↘0 Статус: Участник
|
Создано: 02 июня 2007 13:20 · Личное сообщение · #23
SPA пишет:
Драйвер работает в контексте некоторого процесса не обязательно system
Эт смотря как ты его запускать будешь
| Сообщение посчитали полезным: |
Ранг: 163.7 (ветеран) Активность: 0.07↘0 Статус: Участник
|
Создано: 04 июня 2007 02:15 · Личное сообщение · #24
AdOLF_04 пишет:
смотря как ты его запускать будешь
Ну дык привел бы пример запуска. И главное - обработки запросов из юзерленда ;)
| Сообщение посчитали полезным: |