Пишу прогу, которая должна создать ехе файл с двумя секциями — в одной таблица импорта а в другой код(просто секция куда энтри пойнт ссылается, содержит в себе EBFEh и нули).
Так вот, полученый файл не запускается, но я никак не могу понять, почему? Все поля заголовка просмотрел, но косяк не нашел.
Буду рад помощи, если вас не затруднит.
Вот файл
здесь
Еще прикрепил
сам экешник.
Может ли проблема быть из-за того, что таблица импортируемых адресов(та, что должна загрузчиком заполниться адресами импортируемых api функций) находится не в самом начале секции?
Винда 8 на компе
Здравствуйте, EreTIk, Вы писали:
Q>>Пишу прогу, которая должна создать ехе файл с двумя секциями...
ETI>А в заголовке — 3
В догонку:
OS version 8.00
Subsystem version 8.00
Должно быть
Operating System Version
Итак, программа у меня заработала.
Здравствуйте, EreTIk, Вы писали:
ETI>Здравствуйте, EreTIk, Вы писали:
Q>>>Пишу прогу, которая должна создать ехе файл с двумя секциями...
ETI>>А в заголовке — 3
ETI>В догонку:
ETI>ETI>OS version 8.00
ETI>Subsystem version 8.00
ETI>
ETI>Должно быть Operating System Version
OS version и Subsystem version я такие поставил пытаясь заставить прогу работать)
В заголовке я поставил на одну секцию больше из соображений, что заголовок тоже считается как секция, сейчас поставил обратно два.
Прога заработала после того, как я выровнял имена импортируемых функций на 2, т.е. добавил код, который дописывает нолик, если длинна имени не четная. Т.е. по факту, после MessageBoxA был добавлен один нулевой байт.
Спасибо за участие.
Q>Прога заработала после того, как я выровнял имена импортируемых функций на 2, т.е. добавил код, который дописывает нолик, если длинна имени не четная. Т.е. по факту, после MessageBoxA был добавлен один нулевой байт.
Насколько мне помниться имена импортов должны быть терминированы нулем. И неважно четной они длины или нет
Q>Прога заработала после того, как я выровнял имена импортируемых функций на 2, т.е. добавил код, который дописывает нолик, если длинна имени не четная. Т.е. по факту, после MessageBoxA был добавлен один нулевой байт.
Проведем небольшой эксперимент. Поправим a.exe в a_new.exe как указал я:
>fc /b a.exe a_new.exe
Comparing files a.exe and A_NEW.EXE
00000046: 03 02
00000080: 08 05
00000088: 08 05
Пробуем — exe'шник успешно запускается
Здравствуйте, EreTIk, Вы писали:
Q>>Прога заработала после того, как я выровнял имена импортируемых функций на 2, т.е. добавил код, который дописывает нолик, если длинна имени не четная. Т.е. по факту, после MessageBoxA был добавлен один нулевой байт.
ETI>Проведем небольшой эксперимент. Поправим a.exe в a_new.exe как указал я:
ETI>>>fc /b a.exe a_new.exe
ETI>Comparing files a.exe and A_NEW.EXE
ETI>00000046: 03 02
ETI>00000080: 08 05
ETI>00000088: 08 05
ETI>
ETI>Пробуем — exe'шник успешно запускается
Да наверное дело было в количестве секций. Просто я был уверен, что пробовал и так и так. Запутался, извиняюсь.
Действительно, нечетная длина имени импортируемой функции не препятствует запуску, а неверное(увеличенное на 1) число секций приводит к ошибке(я тоже провел эксперимент).
Если интересно, скажу из каких соображений завысил число секций: некогда до этого тоже делал ехе-файл вручную, и он не работал, если число секций не увеличить на одну. Это я помню точно(иначе с чего бы мне увеличивать число секций, не с потолка же?).
Только вот я тогда, вроде, делал файл без секций, код шел после заголовка, и число секций из таких соображений сначала ставил 0, и не работало. Но это я не помню точно.
Спасибо большое, а то так и тупил бы дальше