В течении ближайших дней собираюсь сделать простенький PE-пакер. Идея такова: для простоты не трогать заголовок. Затем создать новую секцию для распаковщика, реальные секции из файла сжать и записать в мою секцию Далее в таблице секций обнулить физические длины всех секций (кроме,возможно, ресурсной (UpdateResource)) и моей. Записать реальные величины секций и EP в распаковщик и установить новую ЕP. Все! Предполагается, что винда при загрузке сама настроит таблицы импорта-экспорта и запишет их в выделенные страницы (тех самых секций с нулевой raw длиной). Затем мой распаковщик получит управление,распакуют старые данные, перепишет их на место (с учетом таблиц экспорта-импорта-тлс и т.д) и передаст управление на оригинальную EP. Вопрос: нет ли каких-нибудь неучтенных и важных моментов,которые воспрепятствуют воплощению этого сценария в жизнь?
Можно сохранить IAT в запакованом виде, стереть ее из файла, убрать ее упоминание из OptionalHeader.Directories, создать cвою IAT на две функции: LoadLibrary-GetProcAddress (если влом руками искать в памяти) - затем поставить в OptionalHeader.DataDirectories адрес своей IAT - а при старте распаковщика переписать на старое место вторые копии ArrayAddressImpFunc для каждой dll и руками их заполнить (LoadLibrary-GetProcAddress по сохраненной у себя копии IAT).
во время загрузки, если тлсы не верные будет бок возьми екзэшник пакованный упх потри там нулями тлс и увидишь Ж))
И как создать новую секцию в файле не трогая заголовок? Отдельно нужно обработать вещи, связанные с Delay Import... Ежели таковой будет. А также, в твоем случае желательно корректно работать с выравниванием с FileAlignment.