Сейчас на форуме: zombi-vadim, tyns777 (+5 невидимых)

 eXeL@B —› Программирование —› ZwUnmapViewOfSection + VirtualAllocEx + Vista
Посл.ответ Сообщение

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

Создано: 11 декабря 2007 03:47
· Личное сообщение · #1

Решил написать простенький пакер/враппер.
Гружу PE из памяти в процесс как завещал дедушка Нэбэт.
Работает, но переодически обламывается.

ZwUnmapViewOfSection (handle, imgBase) -> OK
VirtualAllocEx (handle, imgBase, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE) -> FAILED

Ошибка ERROR_INVALID_ADDRESS или STATUS_CONFLICTING_ADDRESSES если использовать NtAllocateVirtualMemory.

Можно конечно создавать процессы в цикле пока нужный диапазон не окажется свободным (сейчас так и делаю), но это ж бред :\ Нужно что бы работало как часы (не китайские).

Надо сказать что дело было под вистой. Думаю это аномалия связанна с ASLR. Куча или стек треда выделяется по случайным адресам, которые могут совпасть с ImageBase. Вижу несколько путей решения проблемы:

1. Неспортивный. В цикле стартовать процесс-"икубатор" и проверять нужный диапазон адресов с помощью VirtualQueryEx. Сейчас так и делаю.

2. Джедайский. Делать все ручками. С помощью NtCreateSection/NtCreateProcess создаем процесс с нулевым количеством тредов. Адресное пространство (теоретически) должно быть девственно чистым. Далее выгружаем секцию с помощью NtUnmapViewOfSection, загружаем наш PE и создаем тред с помощью NtCreateThread или CreateRemoteThread (в этом случае не надо возиться с созданием стэка). В теории все замечательно, но на практике придется глубоко лезть в PEB и ручками устанавливать кучу параметров (коммандная строка, окружение, имя модуля, текущая директория итп). Кроме этого, CreateProcess еще шлет некое сообщение csrss. В общем метод больно хардкорный, а значит и ненадежный в плане совместимости с разными версиями винды.

3. Умеренный. Удалить стэк и кучу ручками и создать новые по другим адресам. Как я понимаю придется глубоко лезть в PEB и TEB. Мб кто делал что-то подобное и подскажет?

4. Хитрый. Отключить ASLR при запуске процесса. КАК!?! Флаг в PE заголовке не предлагать, т.к. тот не влияет на размещение стека и кучи. Поправьте, если я не прав.

Спасибо за внимание, жду ваших советов и идей. Для теста можно использовать loadexe.cpp или аналог.



Ранг: 30.2 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 11 декабря 2007 07:52
· Личное сообщение · #2

А у тебя что такой базозависимый код , что загрузить его в другое адресное простарнство не представляется возможным ? , в крайнем случае придется реалоки ручками инициализировать.



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

Создано: 11 декабря 2007 15:17
· Личное сообщение · #3

Ignatich А ты перед VirtualAllocEx вызывай VirtualFree, GloballFree
На wasm.ru в статейке про распаковку в память было, может поможет



Ранг: 32.9 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 11 декабря 2007 19:54
· Личное сообщение · #4

ога там 3 состояния: маппинг, занята и зарезервированна кажись так, на васм уже отправили сталобыть читаем там



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

Создано: 12 декабря 2007 00:58
· Личное сообщение · #5

Ага вот она www.wasm.ru/print.php?article=memfile от FreeMan'a.



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

Создано: 12 декабря 2007 11:32
· Личное сообщение · #6

Если делать VirtualFree, то не факт что процесс будет работать. Проверял. Как я уже писал, похоже можно ненароком прибить стэк или кучу процесса что черевато. Релокейшены конечно решают вопрос на 100%, но мне интересно, как решить проблему, если ImageBase фиксированный.


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


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