Сейчас на форуме: hgdagon, asfa (+4 невидимых)

 eXeL@B —› Программирование —› Патч процесса из ядра.
Посл.ответ Сообщение

Ранг: 11.9 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 30 мая 2007 19:29
· Личное сообщение · #1

Здравствуйте. У меня задача - пропатчить процесс из драйвера зная его Pid и смещение в памяти куда патчить (00445409h)

Как оcуществить сие из драйвера?




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 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.010
Статус: Участник

Создано: 30 мая 2007 19:52
· Личное сообщение · #3

Не, я хочу из ядра - в качестве эксперимента для саморазвития, в юзермоде делал как ты сказал - используя WriteProcessMemory. Я так понял что писать/ читать можно можно если вызвать ункцию KeAttachProcess... но пока не поял как работает и что делать...




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 30 мая 2007 20:17
· Личное сообщение · #4

Дело в том, что драйвер работает в контексте какого-то процесса. Для того, чтобы патчить именно нужный процесс, надо его перекинуть в этот контекст, который как раз и делается через Аттач. Кури примеры ДДК и васм, наверняка яндекс выкинет немало ссылей на эту функу. Для начала можешь покурить статью Мс-Рема про современные технологии дампинга на васме.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 30 мая 2007 20:20
· Личное сообщение · #5

Igit32, ты не о том думаешь. Посмотри на шаг вперёд и ответь на эти вопросы:
a) Тебе надо патчить раждый раз когда процесс запускается или только раз?
b) если только раз, то как ты дашь знать своему драйверу "патчи, сцуко, прямо сейчас"?



Ранг: 11.9 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 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.090
Статус: Участник

Создано: 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.010
Статус: Участник

Создано: 30 мая 2007 21:18
· Личное сообщение · #8

asd id процесса - это его PID?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 30 мая 2007 21:51
· Личное сообщение · #9

Да, это ПИД, в справке это написано. Если читал ту статью про дампинг, то там код есть для дампинга, поменяй чтение на запись и всё.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 30 мая 2007 23:31
· Личное сообщение · #10

Igit32 пишет:
PEPROCESS process = PsGetCurrentProcess();

это даст тебе процесс твоей же user mode апликухи которая вызывает IO Control.



Ранг: 11.9 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 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.060
Статус: Участник

Создано: 31 мая 2007 13:32
· Личное сообщение · #12

Ты видимо пытаешься записать в секцию кода, а она не имеет аттрибута writeable.



Ранг: 11.9 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 31 мая 2007 13:34
· Личное сообщение · #13

да, в секцию кода




Ранг: 68.0 (постоянный), 6thx
Активность: 0.060
Статус: Участник

Создано: 31 мая 2007 13:37
· Личное сообщение · #14

Ну тогда попробуй сначала изменить этот атрибут на wreteable с помощью LordPE
если поможет, реализуешь это программно в памяти.



Ранг: 11.9 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 31 мая 2007 13:41
· Личное сообщение · #15

Dr3d Большое спасибо! Буду порбовать.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 31 мая 2007 19:45
· Личное сообщение · #16

Igit32, её патчить нельзя из-за атрибутов. Но, ты можешь убрать WriteProtect бит из cr0 и всё пропачиццо.




Ранг: 66.1 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 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.040
Статус: Участник

Создано: 01 июня 2007 16:23
· Личное сообщение · #18

Archer пишет:
Дело в том, что драйвер работает в контексте какого-то процесса.

А если немного конкретнее - то SYSTEM

Igit32 пишет:
PEPROCESS process = PsGetCurrentProcess();

PsGetCurrentProcess получает указатель на EPROCESS процессса SYSTEM.




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 01 июня 2007 18:26
· Личное сообщение · #19

Шрайбер в помощь до и сырки Ms-Rema к XProt Dumper помогут

-----
127.0.0.1, sweet 127.0.0.1




Ранг: 228.7 (наставник), 2thx
Активность: 0.120
Статус: Участник
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.020
Статус: Участник

Создано: 02 июня 2007 08:43
· Личное сообщение · #21

AdOLF_04
Драйвер работает в контексте некоторого процесса не обязательно system



Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 02 июня 2007 12:09
· Личное сообщение · #22

Одна статья на глаза попалась - мож в помощь
pmode.net/USERS/125/Files/uminkm.htm




Ранг: 66.1 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 02 июня 2007 13:20
· Личное сообщение · #23

SPA пишет:
Драйвер работает в контексте некоторого процесса не обязательно system


Эт смотря как ты его запускать будешь



Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 04 июня 2007 02:15
· Личное сообщение · #24

AdOLF_04 пишет:
смотря как ты его запускать будешь

Ну дык привел бы пример запуска. И главное - обработки запросов из юзерленда ;)


 eXeL@B —› Программирование —› Патч процесса из ядра.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати