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

 WASM Phorum —› WASM.WIN32 —› Драйвер (w2000/XP) - №2

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


Дата: Июл 28, 2004 05:28:42

Подскажите plz ответ вот на какой вопрос:
здесь говорили, что если ничего не менять, то по умолчанию запись в NTDLL.DLL будет произведена только в контексте вызвавшего драйвер приложения, так? у меня же происходит все наоборот - изменения происходят во ВСЕХ процессах :( Почему ?? Влияет ли sice на это ? Как избежать?

br, Serg


Дата: Июл 28, 2004 17:56:48

Можно подробнее. Айс сбрасывает флаг HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Memory Management\EnforceWriteProtection

В памяти он в MmEnforceWriteProtection (не экспортируется). Деталей не знаю, но возможно в этом дело.


Дата: Июл 29, 2004 05:27:17

Если ты для записи используешь драйвер(например sys для win2000/XP),то можешь писать в любые облости памяти. Что кстати и использует SIce.


Дата: Июл 29, 2004 05:56:34

Я из приложения (test.exe), используя SC Manager ( 2`й урок Four-F :) ), запускаю драйвер, в DriverEntry делаю вот что: убираю WP флаг, пишу свой код в NTDll.Dll (в любую экспортируемую функцию). По идее, этот код должен отработать только для этого приложения (test.exe), однако он остается в NTDll.Dll и для новых запускаемых приложений :(. Так и должно быть ??


Дата: Июл 29, 2004 07:54:06

Да, так и должно быть. Чтобы код изменялся только для текущего процесса, пиши из user mode или не попробуй не убирать WP, хотя насчёт этого точно не знаю.


Дата: Июл 29, 2004 19:41:34

[ ProgramMan: Если ты для записи используешь драйвер(например sys для win2000/XP),то можешь писать в любые облости памяти. Что кстати и использует SIce. ]

Не возьмусь сказать, что использует айс, но в read-only память нельзя писАть, даже из драйвера. Если она в юзер моде, то спасает wp, а если в ядре, то ремапинг надо делать. А флг EnforceWriteProtection как раз, вроде, и отрубает защиту на read-only память, но не уверен, что он именно для этого.


[ SergeyM: Я из приложения (test.exe), ... запускаю драйвер, в DriverEntry ]

Если ты в DriverEntry, то ты не в контексте своего test, а в контексте процесса "system".


Дата: Июл 30, 2004 06:50:43

SergeyM

чё то я паники не понял, из дравера писать можно куда угодно, если wp не запрещает, и никто не будет являться посредником подобной операции в данном случае. В другом случае, если запись производится из пользователя(при наличии определённого разрешения системы и привелегий), ты имеешь посредника в лице менеджера памяти, миханизмы которого и осуществляют данную операцию copyonwrite, игра с данным битом в физическом пте. в результате чего происходит.... да сам знаешь чего, так вот после этого ты и получишь изменение кода в собственном контексте и только в нём, поскольку как всё это было выполнено с ведома оси, а в превом случаеось ни сном ни духом.


Дата: Июл 30, 2004 06:57:59

хм а вот ещё прикол, писал яна днях монитор по типу Русиновического, толко перехват не irp пакетов а параметров некоторых функций NativeAPI, и мне нужно было взяить коммандную строку процесса из PEB, на интересную фишку наткнулся, оказывается, процесс System существует только в KernelMode, а ползовательского кода нема, .... може я чего затупил...но всё же по крайней мере никакого Peb а я там не нашёл, Функция MmGetPhysicalAddress возвращала 0 для адреса Peb.


Дата: Июл 30, 2004 07:03:28

Four-F


Не возьмусь сказать, что использует айс, но в read-only память нельзя писАть, даже из драйвера. Если она в юзер моде, то спасает wp, а если в ядре, то ремапинг надо делать. А флг EnforceWriteProtection как раз, вроде, и отрубает защиту на read-only память, но не уверен, что он именно для этого.



Сэр, а вы ни разу не обращали внимание на маты айса по поводу того самого ключа в реестре, айс от студии 2.7 уже не ругался, а тихо сам ключик куда надо ставил, а вот версии подревнее прямо таки изводились. Айс использует тоже самое, что и все остальные...


Дата: Июл 31, 2004 01:48:26 · Поправил: Four-F

[ CARDINAL: Сэр, а вы ни разу не обращали внимание на маты айса по поводу того самого ключа в реестре... ]

Нет, не доводилось. Я бы был очень признателет, если бы ты объяснил мне для чего нужен этот флаг, кто и когда его проверяет и т.п. А то как-то времени на всё не хватает.


[ CARDINAL: ...из дравера писать можно куда угодно, если wp не запрещает,... ]

Я провёл один эксперимент и должен сказать, что заблуждался (точнее меня обманули :) ) по поводу флага WP в CR0. Заблуждался я по той простой причине, что в "Intel Architecture Software Developer’s Manual Volume 3: System Programming" черным по белому написано: "Inhibits supervisor-level procedures from writing into user-level read-only pages when set; allows supervisor-level procedures to write into user-level read-only pages when clear."

Т.е. из этого можно заключить что писать в kernel-level read-only pages нельзя, даже сбросив WP. Я даже припоминаю, что делал какие-то эксперименты, которые это подтверждали. Возможно я делал что-то неправильно.

Вот код. После MmProtectMdlSystemAddress/PAGE_READONLY получим read only страницу. Если убрать манипуляции с CR0, то mov dword ptr [eax], 87654321h вызовет BSOD с кодом ATTEMPTED_WRITE_TO_READONLY_MEMORY. Если сбросить WP, то спокойно пишем в kernel-level read-only page.

Я уже давно не верю DDK. Теперь придется ещё и Intel недоверять.
.const

CCOUNTED_UNICODE_STRING	"MmProtectMdlSystemAddress", g_usMmProtectMdlSystemAddress, 4

.code

TryToWriteToReadOnlyMemory proc

local pMemory:PVOID
local pMdl:PVOID
local pReadOnlyMemory:PVOID

    invoke ExAllocatePool, PagedPool, PAGE_SIZE
    .if eax != NULL
        mov pMemory, eax

        mov dword ptr [eax], 12345678h

            invoke IoAllocateMdl, pMemory, PAGE_SIZE, FALSE, FALSE, NULL
            .if eax != NULL
                mov pMdl, eax

                invoke MmProbeAndLockPages, pMdl, KernelMode, IoReadAccess

                invoke MmMapLockedPagesSpecifyCache, pMdl, KernelMode, MmNonCached, \
                                        NULL, FALSE, NormalPagePriority
                .if eax != NULL
                    mov pReadOnlyMemory, eax
                
                    invoke MmGetSystemRoutineAddress, addr g_usMmProtectMdlSystemAddress
                    .if eax != NULL
                
                        push PAGE_READONLY
                        push pMdl
                        call eax        ; MmProtectMdlSystemAddress, pMdl, PAGE_READONLY
                        .if eax == STATUS_SUCCESS

                            mov eax, cr0
                            push eax
                            and eax, not 010000000000000000y
                            mov cr0, eax

                            mov eax, pReadOnlyMemory
                            mov dword ptr [eax], 87654321h

                            pop eax
                            mov cr0, eax
                        
                        .endif

                    .endif
                    
                    invoke MmUnmapLockedPages, pReadOnlyMemory, pMdl

                .endif

                invoke MmUnlockPages, pMdl
                invoke IoFreeMdl, pMdl

            .endif

        invoke ExFreePool, pMemory
    .endif
    
    ret

TryToWriteToReadOnlyMemory endp



В любом случае, я лично не связывался бы с WP, по крайней мере для записи в kernel-level read-only page. Лучше юзать ремапинг, как умные дядьки советуют (например Руссинович).

http://www.wasm.ru/forum/index.php?action=vthread&forum=4&topic=5842


Дата: Июл 31, 2004 01:54:51

Да забыл сказать. Код для XP+ из-за MmProtectMdlSystemAddress.


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