ZwCreateSection, SEC_IMAGE и все-все-все
От: ac89  
Дата: 27.05.13 13:59
Оценка:
Проблема следующая.
Хочу создать в ядре свою проекцию ранее загруженной DLL. И не могу.
ZwOpenFile->ZwCreateSection(PAGE_WRITECOPY+SEC_IMAGE)->дальше маппинг.
Но вот в чем проблема. Страницы отмапленные не новые, а соответствуют страницам ранее загруженной DLL. То есть в хедерах уже поправлен imagebase на релоцированный и т.п.
Окей, создаю секцию с SEC_COMMIT, но тут уже другая проблема, когда я произвожу изменения, они записываются на диск (в общем, между повторными вызовами они постоянны), а я этого не хочу.
Белый пушной зверек, как же мне создать свое отображение, в котором я мог хозяйничать, которое бы соответствовало содержимому на диске?
То есть мне нужна _новая_ моя приватная секция, а не существующая, которая берется из файлового объекта.
Заранее спасибо.
Re: ZwCreateSection, SEC_IMAGE и все-все-все
От: ononim  
Дата: 27.05.13 14:27
Оценка: 1 (1)
A>Проблема следующая.
A>Хочу создать в ядре свою проекцию ранее загруженной DLL. И не могу.
A>ZwOpenFile->ZwCreateSection(PAGE_WRITECOPY+SEC_IMAGE)->дальше маппинг.
A>Но вот в чем проблема. Страницы отмапленные не новые, а соответствуют страницам ранее загруженной DLL. То есть в хедерах уже поправлен imagebase на релоцированный и т.п.
Релоцирование происходит загрузчиком. Но есть одно НО. Называется оно ASLR. Оно делается в ядре при первой загрузке длл в память, и таки по сути пре-релокация длл на случайную базу. Работает эта штука только если в хедере образа проставлена поддержка ASLR.

A>Окей, создаю секцию с SEC_COMMIT, но тут уже другая проблема, когда я произвожу изменения, они записываются на диск (в общем, между повторными вызовами они постоянны), а я этого не хочу.

Указывайте writecopy в ZwMapViewOfSection. Кстати SEC_IMAGE и SEC_COMMIT — вещи разные, SEC_IMAGE — это не прямое отображение файла на АП как SEC_COMMIT.

A>Белый пушной зверек, как же мне создать свое отображение, в котором я мог хозяйничать, которое бы соответствовало содержимому на диске?

A>То есть мне нужна _новая_ моя приватная секция, а не существующая, которая берется из файлового объекта.
A>Заранее спасибо.
Вам таки нужно промапить имаж как имаж или просто сделать writecopy мэпинг данных файла? Если второе — ZwOpenFile->ZwCreateSection(..PAGE_WRITECOPY, SEC_COMMIT..)->ZwMapViewOfSection(..PAGE_WRITECOPY..)
Как много веселых ребят, и все делают велосипед...
Re[2]: ZwCreateSection, SEC_IMAGE и все-все-все
От: ac89  
Дата: 27.05.13 14:45
Оценка:
Здравствуйте, ononim, Вы писали:

Спасибо за оперативный ответ.

O>Релоцирование происходит загрузчиком. Но есть одно НО. Называется оно ASLR. Оно делается в ядре при первой загрузке длл в память, и таки по сути пре-релокация длл на случайную базу. Работает эта штука только если в хедере образа проставлена поддержка ASLR.

O>Указывайте writecopy в ZwMapViewOfSection. Кстати SEC_IMAGE и SEC_COMMIT — вещи разные, SEC_IMAGE — это не прямое отображение файла на АП как SEC_COMMIT.

Я маплю секцию на адреса ядра с помощью MmMapViewInSystemSpace, вероятно я чего-то не понимаю, но делаю я так чтобы не было возможности доступа к этим данным из юзерленда.
Странная штука вот в чем, при SEC_IMAGE если внимательно посмотреть на отмапленный образ видно, что поле OptionalHeader.ImageBase изменено относительно диска, однако фиксапы не применены... То есть секция не только не соответствует тому что на диске, она также не соответствует тому что используется в памяти (там все релоки пофикшены). Я хочу получить оригинал, то есть без изменения даже полей PE-заголовков.

O>Вам таки нужно промапить имаж как имаж или просто сделать writecopy мэпинг данных файла? Если второе — ZwOpenFile->ZwCreateSection(..PAGE_WRITECOPY, SEC_COMMIT..)->ZwMapViewOfSection(..PAGE_WRITECOPY..)


Мне надо промапить имаж так чтобы в нем не было никаких изменений относительно диска. Если при этом есть возможность чтобы он был промаплен как имаж (SEC_IMAGE), то есть с соблюдением виртуальных адресов секций и т.п. (я уж не знаю что он еще там правит) — было бы здорово.

То есть мне нужен независимый мапинг dll неважно с SEC_IMAGE или без на адреса ядра.
Re[3]: ZwCreateSection, SEC_IMAGE и все-все-все
От: ononim  
Дата: 27.05.13 15:34
Оценка:
O>>Релоцирование происходит загрузчиком. Но есть одно НО. Называется оно ASLR. Оно делается в ядре при первой загрузке длл в память, и таки по сути пре-релокация длл на случайную базу. Работает эта штука только если в хедере образа проставлена поддержка ASLR.
O>>Указывайте writecopy в ZwMapViewOfSection. Кстати SEC_IMAGE и SEC_COMMIT — вещи разные, SEC_IMAGE — это не прямое отображение файла на АП как SEC_COMMIT.
A>Я маплю секцию на адреса ядра с помощью MmMapViewInSystemSpace, вероятно я чего-то не понимаю, но делаю я так чтобы не было возможности доступа к этим данным из юзерленда.
A>Странная штука вот в чем, при SEC_IMAGE если внимательно посмотреть на отмапленный образ видно, что поле OptionalHeader.ImageBase изменено относительно диска, однако фиксапы не применены... То есть секция не только не соответствует тому что на диске, она также не соответствует тому что используется в памяти (там все релоки пофикшены). Я хочу получить оригинал, то есть без изменения даже полей PE-заголовков.
Прикольно, впрочем я не вдавался в детали на каком конкретно этапе ASLR релоцирует имаж, возможно этим занисается загрузчик, запрашивая у ядра ASLR дельту через ZwQuerySection(..SectionAslrInformation..), которое эту дельту изначально придумывает и применяет к OptionalHeader.ImageBase на этапе создания секции.. Хотя смысл было так делать?

O>>Вам таки нужно промапить имаж как имаж или просто сделать writecopy мэпинг данных файла? Если второе — ZwOpenFile->ZwCreateSection(..PAGE_WRITECOPY, SEC_COMMIT..)->ZwMapViewOfSection(..PAGE_WRITECOPY..)

A>Мне надо промапить имаж так чтобы в нем не было никаких изменений относительно диска. Если при этом есть возможность чтобы он был промаплен как имаж (SEC_IMAGE), то есть с соблюдением виртуальных адресов секций и т.п. (я уж не знаю что он еще там правит) — было бы здорово.
A>То есть мне нужен независимый мапинг dll неважно с SEC_IMAGE или без на адреса ядра.
Ну тогда просто делайте writecopy мапинг — должно работать.
Как много веселых ребят, и все делают велосипед...
Re[4]: ZwCreateSection, SEC_IMAGE и все-все-все
От: ac89  
Дата: 27.05.13 16:23
Оценка:
Здравствуйте, ononim, Вы писали:

O>>>Релоцирование происходит загрузчиком. Но есть одно НО. Называется оно ASLR. Оно делается в ядре при первой загрузке длл в память, и таки по сути пре-релокация длл на случайную базу. Работает эта штука только если в хедере образа проставлена поддержка ASLR.

O>>>Указывайте writecopy в ZwMapViewOfSection. Кстати SEC_IMAGE и SEC_COMMIT — вещи разные, SEC_IMAGE — это не прямое отображение файла на АП как SEC_COMMIT.
A>>Я маплю секцию на адреса ядра с помощью MmMapViewInSystemSpace, вероятно я чего-то не понимаю, но делаю я так чтобы не было возможности доступа к этим данным из юзерленда.
A>>Странная штука вот в чем, при SEC_IMAGE если внимательно посмотреть на отмапленный образ видно, что поле OptionalHeader.ImageBase изменено относительно диска, однако фиксапы не применены... То есть секция не только не соответствует тому что на диске, она также не соответствует тому что используется в памяти (там все релоки пофикшены). Я хочу получить оригинал, то есть без изменения даже полей PE-заголовков.
O>Прикольно, впрочем я не вдавался в детали на каком конкретно этапе ASLR релоцирует имаж, возможно этим занисается загрузчик, запрашивая у ядра ASLR дельту через ZwQuerySection(..SectionAslrInformation..), которое эту дельту изначально придумывает и применяет к OptionalHeader.ImageBase на этапе создания секции.. Хотя смысл было так делать?

O>>>Вам таки нужно промапить имаж как имаж или просто сделать writecopy мэпинг данных файла? Если второе — ZwOpenFile->ZwCreateSection(..PAGE_WRITECOPY, SEC_COMMIT..)->ZwMapViewOfSection(..PAGE_WRITECOPY..)

A>>Мне надо промапить имаж так чтобы в нем не было никаких изменений относительно диска. Если при этом есть возможность чтобы он был промаплен как имаж (SEC_IMAGE), то есть с соблюдением виртуальных адресов секций и т.п. (я уж не знаю что он еще там правит) — было бы здорово.
A>>То есть мне нужен независимый мапинг dll неважно с SEC_IMAGE или без на адреса ядра.
O>Ну тогда просто делайте writecopy мапинг — должно работать.

А есть ли возможность сделать writecopy-маппинг с MmMapViewInSystemSpace?
Re[5]: ZwCreateSection, SEC_IMAGE и все-все-все
От: ononim  
Дата: 27.05.13 20:50
Оценка:
A>А есть ли возможность сделать writecopy-маппинг с MmMapViewInSystemSpace?
Сходу не нашел как. Мапте секцию в системный процесс MmMapViewOfSection(sectiom, PsInitialSystemProcess()... PAGE_WRITECOPY) и потом атачьтесь к нему через KeStackAttach(Detach)Process
PS помницца мне в восьмерке или даже семерке можно указать PAGE_WRITECOPY в ZwCreateSection и последующий ZwMapViewOfSection с PAGE_READWRITE вырождается во writecopy, так что на восьмерке возможно MmMapViewInSystemSpace сумеет промапить writecopy мапинг.
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.