Rustem это тоже не обязательно. нет никаких противопоказаний компонентам аллоцировать свободную память. пусть и по 400000. потому и желательно как можно меньше вызовов сделать до того, как вы захватите нужный вам регион. а вы еще и положили вверх образ. что теперь делать бедным длл-ям?
Обычно это делают крипторы и используются авторами софта для защиты своих модулей. А если автор приложения решил его накрыть криптором то должен позаботится о совместимости. Пусть переносят код в длл. Иначе незачем криптовать чужие экзешники. Длл всегда имеют релоки. Освобождать память под не перемещаемый модуль это ошибка, иначе не назвать.
qqwe >ну кто ж такой рос на цпп пишет? Существует мнение, что С++ – это просто такой удобный Си. И, до тех пор пока не используется стрёмных конструкций вроде бросания приплюснутых исключений из конструкторов, или, например, множественного наследования с применением кучи тонких темплейтных параметров – до этих пор сохраняется полный контроль. Нет, понятно, что тут всё зависит как от человека, так и от компилятора, и, отложив возможный свящебой в сторону, хотелось бы сказать, что мы озвучили лишь одно из мнений, не обязательно верное. Rustem >Можешете подробнее расказать про метод? Задаёмся вопросом, если это случайное расхождение или же умышленный подкол ;p Код (Text): // // псевдокод // HANDLE ChildProcess = CreateProcess(PathToSelf, OriginalParameters + " -LaunchedAsChild", CREATE_SUSPENDED); // ^У дочернего процесса сейчас практически пустое адресное пространство (только self, ntdll, SharedUserData?), // можно зарезервировать нужный регион. VirtualAllocEx(ChildProcess, RequiredRegion, RegionSize, MEM_RESERVE | MEM_COMMIT); // Теперь всё будет происходить в дочернем процессе, где нужный регион уже выделен нами. ResumeProcess(ChildProcess); WaitForSingleObject(ChildProcess); // or whatever ExitProcess(GetExitCode(ChildProcess)); На самом деле, нам нравится вариант с bss, предложенный qqwe. Жёстко зафиксировать свою базу на 0x10000 (ниже уже не получится), +большой массив (резервации в страничном файле не жалко) — отличная гарантия отсутствия необходимости лишних телодвижений для загрузки подавляющего большинства экзешников.
Sol_Ksacap вопрос не в свящебое. во всяком случае не от меня. тк веселюсь только с рогатыми. вопрос в возможной теневой работе с кучей, совершенно нормальной для цпп, но крайне нежелательной для данного момента. а пуре-ц не предполагает теневого автоума, те в тут оно будет предскауемее.
Sol_Ksacap >HANDLE ChildProcess = CreateProcess(PathToSelf, OriginalParameters + " -LaunchedAsChild", CREATE_SUSPENDED); > ^У дочернего процесса сейчас практически пустое адресное пространство (только self, ntdll, SharedUserData?) Неверно. Вот карта сразу после отработки NtCreateUserProcess для w7 (notepad.exe): Код (Text): lkd> !vad fffffa8004882b80 VAD level start end commit fffffa8003fe8710 ( 2) 10 2f 32 Private READWRITE fffffa8004af7500 ( 3) 30 af 20 Private READWRITE fffffa80020214b0 ( 1) 77640 777ea 12 Mapped Exe EXECUTE_WRITECOPY fffffa8001f80b20 ( 2) 7efe0 7ffdf 0 Private READONLY fffffa8004882b80 ( 0) 7ffe0 7ffef -1 Private READONLY fffffa8001ec1dc0 ( 2) ff8e0 ff914 3 Mapped Exe EXECUTE_WRITECOPY fffffa800211a490 ( 3) 7feff960 7feff960 0 Mapped Exe EXECUTE_WRITECOPY fffffa8001c5ef80 ( 1) 7fffffb0 7fffffd2 0 Mapped READONLY fffffa80020bee10 ( 2) 7fffffd9 7fffffd9 1 Private READWRITE fffffa8001bd2310 ( 3) 7fffffde 7fffffdf 2 Private READWRITE Total VADs: 10 average level: 2 maximum depth: 3 Первый exe – это ntdll, второй – образ блокнота, третий – "apisetschema.dll". Можно видеть и другие занятые регионы, как то параметры процесса, кодовые таблицы & Co, данные активационных контекстов(?) и ещё непонятно что. Так что всё несколько сложнее, чем хотелось бы.
Так, план меняется) Буду делать через bss, как наименее трудозатратный Sol_Ksacap спасибо за объяснение, qqwe спасибо за метод