Сейчас на форуме: zds (+6 невидимых)

 eXeL@B —› Программирование —› Вопрос по Натив АПИ
Посл.ответ Сообщение

Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 сентября 2012 14:43
· Личное сообщение · #1

Написал драйвер
который аттачится к чужому процессу который работает в RING3
после аттача читать память этого процесса могу без проблем .. но при попытке записать все валится в BSOD .. подозреваю что пытаюсь писать в область READ_EXECUTE
вопрос как из драйвера разрешить запись в эту область памяти ?




Ранг: 158.5 (ветеран), 219thx
Активность: 0.120.01
Статус: Участник

Создано: 11 сентября 2012 14:49
· Личное сообщение · #2

VirtualProtect, не?

-----
One death is a tragedy, one million is a statistic.




Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 сентября 2012 14:55
· Личное сообщение · #3

в ядре недоступны API 3го кольца



Ранг: 189.9 (ветеран), 334thx
Активность: 0.30
Статус: Участник

Создано: 11 сентября 2012 15:05
· Личное сообщение · #4

Есть ZwProtectVirtualMemory.



Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 сентября 2012 15:10
· Личное сообщение · #5

не катит он требует
HANDLE ProcessHandle,
а у Хендла подопытного процесса стоит в GrantedAccess ридонли ...
или ZwProtectVirtualMemory игнорирует это?




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

Создано: 11 сентября 2012 16:06
· Личное сообщение · #6

Что значит, что стоят не те права в хендле? Ты в ядре сидишь, возьми да открой его заново через ZwOpenProcess. Либо получи ядерный объект процесса и его открой уже.



Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 сентября 2012 16:17
· Личное сообщение · #7

ну насколько я понимаю EPROCESS->HANDLE_TABLE->HANDLE_TABLE_ENTRY ->GrantedAccess;
то открывая из ядра через ZwOpenProcess я получу хендл опять с GrantedAccess с РидОнли
и будут теже рога ? или я неправ ???



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 11 сентября 2012 16:19
· Личное сообщение · #8

CKA3KA
Сбросить WriteProtect бит из cr0?
Для общего развития годное чтение.
Intel Manual Volume 3A part 1 PROTECTION-PAGE-LEVEL PROTECTION



Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 сентября 2012 16:20
· Личное сообщение · #9

дайте ссылку на мануал . .чета гугл по этим словам кудато посылает в даль




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

Создано: 11 сентября 2012 16:24
· Личное сообщение · #10

Ну вообще DesiredAccess есть параметр в ZwOpenProcess, где можно задать желаемый уровень доступа. При чём тут права уже непонятно кем открытого хендла, вообще непонятно.
А за сброс WP бита для записи в ринг3 бить надо и, возможно, даже ногами (С). Если область памяти связана напрямую с файлом, может случиться неприятность.



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 11 сентября 2012 16:32
· Личное сообщение · #11

CKA3KA пишет:
дайте ссылку на мануал . .чета гугл по этим словам кудато посылает в даль

intel
Регистры управления
Archer пишет:
А за сброс WP бита для записи в ринг3 бить надо и, возможно, даже ногами (С)

По что меня ногами, робит же, а на сколько стабильно нужно тс не говорил.




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

Создано: 11 сентября 2012 16:37
· Личное сообщение · #12

Если хочется кошерно сделать, можно страницу памяти перемапить ещё с другими правами и писать в неё, вариантов в ядре овер 9000.
А что касается сброса WP, если в 2 словах, то во-первых, костыль на многоядерных машинах, потому что свой cr0 везде, а IRQL задирать нельзя, потому что юзермод может быть выгружен в своп. А во-вторых, если пойдёт запись в проекцию секции файла, можно испоганить кеш винды.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 11 сентября 2012 18:50
· Личное сообщение · #13

Ну, как по мне, так всё можно решить вообще малой кровью. Нужно, если я правильно понял задачу, записать что-то из дровины в память (юзермодную) какого-то левого процесса. Т.е. формально у нас есть процесс, который загружает драйвер - это процесс А. И есть просто ещё какой-то процесс, память которого мы будем патчить - процесс Б. Известно, что патчить мы будем память процесса Б в пользовательском адресном пространстве. Если в ядре нет никаких хитрых хуков, то дело выглядит примерно так.
1. Получаем в юзермоде Process Id процесса Б.
2. Передаём его в драйвер.
3. В драйвере вызывается PsLookupProcessByProcessId. Так мы находим EPROCESS процесса Б.
4. Выполняем KeStackAttachProcess с целью приаттачиться в процессу Б. Теперь драйверный код будет выполняться в контексте процесса Б.
5. Далее делаем вызов IoAllocateMdl, MmBuildMdlForNonPagedPool, MmMapLockedPagesSpecifyCache.
6. Пишем по нужному нам адресу нужную инфу - пишем напрямую, т.к. мы в другом процессе.
7. MmUnmapLockedPages, IoFreeMdl.
8. KeUnstackDetachProcess.
9. Радуемся.

-----
Stuck to the plan, always think that we would stand up, never ran.


| Сообщение посчитали полезным: plutos

Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 сентября 2012 23:03
· Личное сообщение · #14

Вопрос я открываю из ядра процесс через ZwOpenProcess получаю хендл
могу я передать из драйвера этот хендл в User Mode и пользоваться им там ?




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

Создано: 12 сентября 2012 23:16
· Личное сообщение · #15

Вообще это хреновая практика, мягко говоря. Во-первых, надо быть в контексте приложения, куда собрался хендл отдавать. Во-вторых, некоторые функции возвращают kernel-only хендл. По-моему, к ZwOpenProcess это не относится, но менее хреновой эта практика от этого не становится.
З.Ы. Вопросы все эти как-то мало отношения имеет к форуму. И в основном решаются гуглом и чтением документации.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 12 сентября 2012 23:19 · Поправил: ARCHANGEL
· Личное сообщение · #16

CKA3KA
Да, но если я вас правильно понял, в вашем случае это не подойдёт, потому что открыть так процесс с нужными правами вам мешает драйвер защиты, который хучит SSDT в ядре, тем самым вызовы ZwOpenProcess, идущие через хук, не будут работать, как должны. В любом случае проверка этой гипотезы займёт несколько минут. Пробуйте. Как сказал Archer, методов там действительно очень много. Ещё один метод навскидку. Передаёте в ядро идентификатор, далее находите EPROCESS, потом ObOpenObjectByPointer, а потом вновь полученный дескриптор используете для ZwProtectVirtualMemory, ZwWriteVirtualMemory. Правда, последние сервисы не экспортируются ядром, поэтому их номера определяете по ntdll.dll.

Просто интересно - чем не подходит первый метод?

-----
Stuck to the plan, always think that we would stand up, never ran.




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

Создано: 13 сентября 2012 14:26
· Личное сообщение · #17

О том что писал ARCHANGEL пример, за работо способность не ручаюсь.


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


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