ZwUnmapViewOfSection + VirtualAllocEx
От: Ignatich  
Дата: 09.12.07 08:37
Оценка:
Гружу PE из памяти в процесс как завещал дедушка Нэбэт.
Работает, но иногда обламывается.

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

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

Пробовал перед Alloc делать VirtualFreeEx — толку ноль. Потом попробовал весь нужный диапазан обходить с помощью
VirtualQueryEx и принудительно удалять несвободные блоки — помогает, но иногда процесс стартует, но не пашет.

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

Надо сказать что дело было под вистой. Мб какая аномалия связанная с ASLR. Помогите разобраться!
Для тесту возьмите широкоизвестный loadexe.cpp, но в качестве "инкубатора" используйте не calc.exe
(с ним работает), а скажем iexplore.exe.
Re: ZwUnmapViewOfSection + VirtualAllocEx
От: ononim  
Дата: 09.12.07 10:07
Оценка:
I>Работает, но иногда обламывается.
I>ZwUnmapViewOfSection (handle, imgBase) -> OK
I>VirtualAllocEx (handle, imgBase, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE) -> FAILED
I>Ошибка ERROR_INVALID_ADDRESS или STATUS_CONFLICTING_ADDRESSES если использовать NtAllocateVirtualMemory.
только возможная причина: Другой поток вашего процесса мог занять пространство адресов (выделива память) между этими двумя вызовами..
Как много веселых ребят, и все делают велосипед...
Re[2]: ZwUnmapViewOfSection + VirtualAllocEx
От: Ignatich  
Дата: 09.12.07 11:26
Оценка:
Здравствуйте, ononim, Вы писали:

I>>Работает, но иногда обламывается.

I>>ZwUnmapViewOfSection (handle, imgBase) -> OK
I>>VirtualAllocEx (handle, imgBase, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE) -> FAILED
I>>Ошибка ERROR_INVALID_ADDRESS или STATUS_CONFLICTING_ADDRESSES если использовать NtAllocateVirtualMemory.
O>только возможная причина: Другой поток вашего процесса мог занять пространство адресов (выделива память) между этими двумя вызовами..

Процесс создан с флагом CREATE_SUSPENDED т.е. поток там только один и тот еще выполняться не начинал.

Если дело в ASLR висты (как я думаю), то память могли занять:
1. Стек потока.
2. Куча процесса. Сомнительно, т.к. в PEB ProcessHeap равно NULL.

Больше ничего в голву не приходит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.