|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
03.11.2013, 04:00 | #1 |
Пользователь
Регистрация: 01.03.2013
Сообщений: 39
|
Запуск PE
Привет All.
Тема довольно "избитая", но всё же... Имеется массив байт (исполняемый файл) который храниться в программе. После резервирования и выделения памяти я копирую его по адресу который мне выделяет система (в моём случае 0х00390000), мне необходимо запустить его. Во многих статьях описывается - парсим заголовок, считываем информацию о секциях и т.п. С форматом pe знаком, не пойму только куда мы "парсим" и.т.п., а вообще если кто может, то объясните момент более доходчиво, буду рад ссылкам и примерам. Алексей. |
04.11.2013, 00:49 | #2 |
Участник клуба
Регистрация: 23.12.2010
Сообщений: 1,129
|
Сначала нужно взять из заголовка таблицу секций. У каждой секции есть relative virtual address, если прибавить к нему image base - получаем адрес в памяти, в который эту секцию нужно запихнуть. Если запихнуть не получается (нужная область памяти занята твоим кодом, например) - выделяешь память по другому адресу, считаешь разницу между "желаемым" и "полученным" адресами и правишь relocations для этой секции соответственно. Если из кода при линковке релокейшны выпилили - случится облом. Тогда придется переносить твой код куда-то в другое место, чтобы освободить нужные адреса.
После этого нужно проставить получившемуся образу импорты. Пройтись по таблице, подгрузить нужные дллки, взять из них адреса функций и вписать в iat. Для большинства стандартных случаев этого будет достаточно. Если что-то непонятно - спрашивай, попробую развернуть подробнее ) |
04.11.2013, 04:55 | #3 |
Пользователь
Регистрация: 01.03.2013
Сообщений: 39
|
Спасибо большое за помощь, как раз это я и не мог понять, а именно - куда именно размещать, т.е. получается мы размещаем PE согласно всех его настроек которые описаны в pe заголовке и optional header'e так?
Если я правильно понимаю, то сначала прочитали "значение" и записали (скопировали memcpy) в то место памяти в котором он должен находится согласно его настроек. А как происходит сам запуск когда файл полностью скопирован в память? Пробовал вот этот код, на консольном приложении работает (причём в той же консоли которую запускаю), но в нём нет настройки таблицы импорта: Код:
Код:
|
04.11.2013, 21:24 | #4 |
Участник клуба
Регистрация: 23.12.2010
Сообщений: 1,129
|
Во-первых здесь
Код:
Дальше надо бы проследить, чтобы в адресном пространстве процесса была зарезервирована память для всех секций (VirtualAlloc), и проставить каждой секции соответствующие права доступа (read/write/execute/что там еще). Ну и импорты отрезолвить, да. А для запуска достаточно в контексте в регистр eip записать адрес entrypoint, если грузишь все это в другой процесс. Ну или просто jmp сделать, если в свой же. |
04.11.2013, 21:34 | #5 |
Пользователь
Регистрация: 01.03.2013
Сообщений: 39
|
Son Of Pain благодарю за помощь и сразу вопрос:
>>ты при копировании секций игнорируешь их virtual address. а как надо? >>чтобы в адресном пространстве процесса была зарезервирована память для всех секций пока не знаю как это осуществить... вот исходник рабочий, но при запуске не отображаются надписи на кнопках, в чём там может быть проблема? http://rghost.ru/49934369 Последний раз редактировалось Alexey_68; 04.11.2013 в 21:37. |
04.11.2013, 22:13 | #6 | ||
Участник клуба
Регистрация: 23.12.2010
Сообщений: 1,129
|
Цитата:
Цитата:
|
||
04.11.2013, 22:29 | #7 |
Пользователь
Регистрация: 01.03.2013
Сообщений: 39
|
for(dwSectionCount = 0; dwSectionCount < INH.FileHeader.NumberOfSections; dwSectionCount++)
{ jmpSize = 0; dwSectionSize = Sections[dwSectionCount].SizeOfRawData; memcpy(pFile,(char*)(pImage + Sections[dwSectionCount].VirtualAddress),dwSectionSize); VirtualAlloc((char*)INH.OptionalHea der.ImageBase+Sections[dwSectionCount].VirtualAddress, dwSectionSize, MEM_COMMIT, PAGE_READWRITE); так? >>Просто в цикле VirtualAllocEx и VirtualProtectEx для каждой секции с соответствующими параметрами. память выделять MEM_COMMIT? Последний раз редактировалось Alexey_68; 04.11.2013 в 23:00. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
запуск программы | SAMOUCHKA | Общие вопросы по Java, Java SE, Kotlin | 29 | 23.01.2013 16:05 |
Запуск процесса | Express Yourself | Общие вопросы .NET | 2 | 05.12.2012 20:33 |
запуск windows | kasya | Свободное общение | 12 | 02.06.2011 08:48 |
ЗАпуск | Волк | Общие вопросы Delphi | 1 | 15.05.2011 13:53 |
запуск | kalin | Общие вопросы Delphi | 8 | 02.03.2007 05:27 |