Гружу 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.
Здравствуйте, 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.
Больше ничего в голву не приходит.