Приветствую, Такой вопрос. Пишу для себя простенький криптор, но есть одно непонимание. Беру exe`шник соединяю его своим стубом(кидаю его в ресурсы). Стуб при запуске парсит ресурсы находит там exe`шник, выделяет под него память в виртуальном адресном пространстве, кидает в память всё по порядку (сначала хедеры, потом по нужным адресам секции) и пытается запустить. Не получается Как я понимаю надо ещё пофиксить таблицы импорта, экспорта, ресурсов ну и релоки. С релоками более менее понятно, там надо вычислить дельту и пересчитать их всех. Немного непонятно по поводу импорта и т.д., что там фиксить. Хотя можно проблема в другом!?
как это что фиксить? таблицу импорта... в директории IMAGE_DIRECTORY_ENTRY_IMPORT лежат подряд структуры IMAGE_IMPORT_DESCRIPTOR, в нем поле Name определяет смещение имени библиотеки, относительно базового адреса... для каждого имени библиотеки перечисляем функции, которые из нее импортируются (поле FirstThunk или OriginalFirstThunk в зависимости от поля TimeDateStamp)... эти смещения указывают либо на имена функций, либо на ординалы... получаем адреса функций и подставляем вместо смещений/ординалов... в интернете куча исходных кодов, как это сделать... мне вообще кажется, что настройка релоков посложнее будет, их там несколько типов и тд))) проблему надо отладчиком смотреть...
mz80 Насчет импорта, думаю, стоит почитать статьи, но вкратце надо править IAT, вписав туда реальные адреса ф-ий, которые надо либо получить самому, либо с помощью ф-ии GetProcAddress. Что касается релокации -- не все исполняемые ее поддерживают, поэтому необходимо, чтобы базовый адрес, прописанный в заголовке целевого исполняемого, был свободен.
Экспорт обычно присутствует в dll файлах, заморочки будут если exe использующий эту dll импортирует из нее функции статически. Загрузчик просто не загрузит такой exe, т.к. не обнаружит экспортируемых функций. Если же функции из dll вызываются динамически, то проблем быть не должно.