· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Memory mapping & KernelExec

Посл.отвђт Сообщенiе


Дата: Июл 13, 2004 20:32:46

Всем привет!

Вот всё еще мучаю Запуск приложения и KernelMode. Всё чё мог делал, но вот на некоторых этапах без Вас никак.
Продолжая тему, решение запуска приложения мне видится в следующем:
1)Сажаем хук на часто-вызаваемую ф-ю, и ждем, пока туда не попадет Thread не от от процесса System.
2)Останавливаем её и при помощи другой нити (нить А) считываем TrapFrame, где находим Eip.
3)При помощи ZwMapViewOfSection мэппируем секцию в процесс-хозяина этой нити, и пишем в нее код, запускающий приложение (WinExec(ХХХ.exe,1) - например).
4)Отпускаем нить, она продолжает свою работу; затем дожидаемся когда нить уйдет обратно в UserMode, делаем KeAttachProcess, ч/з TrapFrame меняем Eip на блок памяти, где скопированный нами блок с WinExec. Вызываем KeDetachProcess Ожидаем Event-а.
5) В конце блока, где WinExec, вызываем SetEvent, Ожидаем другого Event-a.
6) Передалось управление (нить А), опять KeAttachProcess, ч/з TrapFrame меняем Eip, KeDetachProcess , потом вызываем SetEvent: И всё! Нить пошла дальше. Приложение ХХХ.exe запущено.

Но вот тут такие палки в колёсах:
1)Как засечь выход нити из ядра обратно в UserMode? Может как-то захучить планировщика и подглядывать. Может следить за тем, кто выполняет APC, и изменяет PreviousMode у нити, если это вообще то.
2) ZwMapViewOfSection проецирует секцию в адр. пр-во процесса ХХХ, но надо указать handle процесса. Я конечно понимаю, что для этого есть ObOpenObjectByName, ObOpenObjectByPointer и т.д. или просто ч/з SDT вызвать NtOpenProcess. Да вот только все руки пообломал – пожалуйста, может с примерчиком поможете?.
3) Do not use ZwMapViewOfSection to map a memory range in \Device\PhysicalMemory into user mode, unless your driver has allocated the memory range directly with MmAllocatePagesForMdl (or any equivalent method that guarantees no other system component has mapped the same memory range with a different MEMORY_CACHING_TYPE value).

И что теперь делать? Тоже примерчик бы… А то в этом лесу так темно…

4)Можно ли для конкретной нити сделать следующее: вызвать MmMapLockedPagesSpecifyCache@24 + IoAllocateMdl@20 – т.е. выделить кусок памяти в user пространстве (например адрес 16000h) (пока работаем с нитью от процесса system), затем приаттачить эту нить к любому процессу и поправить там таблицу страниц так, чтобы ВиртуальныеАдреса у User процесса и у процесса System смотрели на один и тот же физический адрес. Т.О. мы и спроецируем участок памяти в user процесс, да еще и находиться будет он в нижних 2-х гигабайтах.

И напоследок, не зря пишу: из UserMode вызвать код с WinExec – так почему же нельзя, когда нить в ядре, вызывать ф-ии такие, как MessageBox, и другие. Ну тут Four-F уже пояснил, что при KeAttachProcess у нити просто меняется CR0(if не ошибаюсь), а тут – то чё! Почему всё кончается на KeBugCheck...

P.S. В принципе проблема запуска приложения, лично для меня, не столь остро стоит, но очень уж хочется осуществить, т.к. многие вещи упростятся (да хоть для примера, самовыгрузка драйвера, с которой у меня так же нелады...)

ЗЗЫ Sorry, за то, что так длинно, но… вот так уж.
Намеренно не пишу в старой теме, т.к. тут направление исследований немного другое.

С нетерпеньем жду ответов, предложений, комментариев и т. д.

Заранее благодарен --==PPS==--


Дата: Июл 14, 2004 12:32:07

А ZwCreateProcess не подойдет?


Дата: Июл 14, 2004 12:51:46

Нет. Это уже обсуждалось в теме
http://wasm.ru/forum/index.php?action=vthread&forum=4&topic=6272
Она не экспортируется ntoskrnl, хотя и спроецирована из ntdll. Подробней читай там.


Дата: Июл 14, 2004 15:38:38

PavPS
Да - лоханулся. Вообще даже не задумывался что это так сложно.


Дата: Июл 27, 2004 16:27:22

Всем доброе придоброе…

УРяяя получилось запустьти exe-шник. Даже работает… Правда в порядок не причесал – есть маленькие багги – ну это уже моё :)

Делается так:

1)Перехватывается любая ф-я, которая может быть потенциально вызвана по-чаще. Главное, чтобы перехваченная нить не была от процесса System!
2)В адресном пр-ве в user-части памяти процесса, чью нить захватили создаём пул памяти, куда момещаем код, ессно базонезависимый, который, например, вызовет WinExec.
3)
PUSH 4
PUSH NonPagedPool OR POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
CALL ExAllocatePoolWithQuota@8
TEST EAX,EAX
JZ ...
MOV EXEC_TG,EAX

MOV ECX,DWORD PTR [ESP+32+08+04+00] ;1 - TCB

PUSH EXEC_USER_START
PUSH UserMode
PUSH EXEC_USER_START
PUSH 0
PUSH OFFSET EXEC_QUIT_APC ;там exfreepool
PUSH OriginalApcEnvironment
PUSH ECX
PUSH EXEC_TG
CALL KeInitializeApc@32

PUSH 0
PUSH 0
PUSH 0
PUSH EXEC_TG
CALL KeInsertQueueApc@16
TEST EAX,EAX
JZ ...

Теперь всего лишь вызываем следующей строкой:

PUSH OFFSET Time_You_Need (по моему не ноль и ладно – это чтобы возбудить)

PUSH True
PUSH UserMode
CALL KeDelayExecutionThread@12

В ответ получаем статус:
#define STATUS_USER_APC ((NTSTATUS)0x000000C0L) // winnt

И плачем от счастья :-) :-)

У нас код по адресу EXEC_USER_START выполнился в User-е.

Единственные, как мне кажется недостаток – перехват всё же дело такое...


P.S. Думаю что есть и другие способы, очень бы интересно увидеть. А это написано так – мож кому пригодится – мне точно. Не жалко…


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.069