OSDev http://osdev.su/ |
|
Запуск PE программы http://osdev.su/viewtopic.php?f=6&t=351 |
Страница 1 из 1 |
Автор: | Celestia [ 21 ноя 2010, 17:31 ] |
Заголовок сообщения: | Запуск PE программы |
Здравствуйте, друзья! У меня вопрос, как заполнить таблицу импорта PE программы при её загрузке адресами "заглушек"? Ситуация такая: 1. я загрузился с диска 2. я загрузил PE программу в память 3. перевёл проц с защищённый режим 4. переташил прогу по адресу 100000h 5. Запускаю её - ноль результата) Покапался в проге дебаггером, и увидел что она сразу после запуска обращается к kernel32.dll и так как таблица импорта не заполнена она передаёт управление в никуда... Вот такие дела) Код который я использую - изменённый код от сюда: brokenthorn.com/Resources/OSDevMSVC.html - тут используется загрузка с дискетки и запуск PE проги которая скомпилена таким образом, что не использует внешних импортируемых функций а сразу передаёт управление на полезный код. Я же хочу запустить прогу скомпиленную в Delphi, которая всегда импортирует функции из kernel32.dll перед тем как передать управление на полезный код. Оооооооочень надо, третий день бьюсь... Большое всем спасибо! :) p.s.: прога на делфи ничего не делает пока, просто: begin [вставка на ассемблере для проверки] end. |
Автор: | SII [ 22 ноя 2010, 12:09 ] |
Заголовок сообщения: | Re: Запуск PE программы |
Либо самому клепать заглушки по заранее известным именам (естественно, анализируя загружаемый PE-файл на наличие ссылок к этим именам), либо делать собственный модуль System для Дельфей и при этом молиться, чтобы сам компилятор никакой хрени не вставлял, оставляя все обращения к функциями АПИ системы на совести модулей. Второй путь лучше -- конечно, при условии, что все ссылки на кернел32.длл возникают только из-за модуля System. |
Автор: | qeos [ 29 ноя 2010, 04:08 ] |
Заголовок сообщения: | Re: Запуск PE программы |
думаю тут просто недопонимание всех механизмов есть... при запуске программы нужно выполнить некоторые действия которые позволят запускаемой программе работать. Что-то на вроде: инициализировать переменные, получить ссылки на объекты, выделить память под структуры и прочие логичные вещи. Для простоты понимания можно взять такой пример. При окончании работы программы она должна вызвать некий механизм который разрушит неиспользуемые структуры, освободит память и т.п. Но ведь и при запуске нужно выполнить первоначальные настройки для работы программы. Эти вещи стандартные для большинства программ. Любой компилятор вставляет вызовы процедур инициализации вначале выполнения главного блока и процедуры при завершении программы в конце. Для виндовса вызовы в kernel32.. Если ты хочешь не использовать эти включения, то тебе нужно изменить точку входа. Т.е. первые байты кода должны делать call или jmp на главный блок (на С это _main). Но тут нужно понимать, что использование стандартных вещей для дельфей будет невозможно, пока ты не сделаешь их реализацию. Например тебе нужно в первую очередь написать функции выделения памяти. А все остальные функции покатятся как снежный ком. Как вариант могу предложить делать так: компилируется PE, потом этот PE переделывается в какой-нить объектный формат и уже после этого собирается новый PE в котором точка входа заменена твоей. Но лучше всего учить C. (хотя нужно попробовать может ли GCC компилировать паскать в объекты) |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |