Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Склейка PE EXE |
Автор: SIGAra 21.2.2006, 20:36 |
Добрый вечер форумчане ! Не могли бы Вы мне подсказать как склеить два PE EXE файла в один и чтобы при запуске управление переходило второму EXE. Я делаю следующее: 1. Открываю EXE. 2. Записываю в него машинный код другого, в последнюю секцию как виртуально так и физически. 3. Меняю аттрибуты данной секции на чтение, исполнение и запись. 4. Устанавливаю AddressOfEntryoint на точку входа внедряемого EXE. 5. Увеличиваю SizeOfImage, SizeOfRawData последней секции, Misc.VirtualSize последней секции на тело внедряемого EXE. Но по какой-то не понятной мне причине EXE просто портится и появляется отладчик Windows. ![]() Этот вопрос я рассматриваю категорически в образовательных целях. Пожалуйста дайте ответ или ссылочку на данный вопрос. [email protected] |
Автор: oleg1973 22.2.2006, 03:40 |
а импорты? |
Автор: SIGAra 22.2.2006, 19:09 |
А что с таблицей импортов делать ? |
Автор: SIGAra 22.2.2006, 22:41 |
Кто нибудь поможет разобраться с данным вопросом ![]() |
Автор: oleg1973 23.2.2006, 11:09 |
1) во первых у любого ЕХЕ есть image base тоесть адрес на который этот ехе надо загрузить для корректной работы у тебя этот адрес для второго ехе явно не соблюдается 2) нужно заполнить Import table у второго ехе так как она у тебя остается пустой 3) при загрузке ехе в память виртуальный адрес секций вовсе не равен физическому смещению в файле тоесть что надо делать после загрузки первого ехе в память сдвинуть второй ехе на image base разложить его секции по нужным смешениям относительно image base заполнить таблицу импорта и подгрузить необходимые библиотеки ну вот в 2х словах все |
Автор: SIGAra 23.2.2006, 14:06 | ||
У меня имеются 2 exe и ImageBase одиноковы - 0x00400000. Тоесть получается так, что как только первый EXE закинут по адрессу 0x00400000 нужно сдвинуть 2 exe на 0x00400000. Я так понял ? Можно какой-нибудь примерчик демонстрирующий эту реализацию ? |
Автор: oleg1973 23.2.2006, 18:00 |
upx исходники |
Автор: SIGAra 23.2.2006, 21:13 |
Большое спасибо oleg1973. Щас буду разбираться, надеюсь что наконец-то решу вышепоставленную проблему. ![]() |
Автор: SIGAra 24.2.2006, 16:10 | ||
Плиз помагите разобраться с данным кодом их UPX.
А именно я не пойму, зачем прибавлять к всему образу файла каталог данных, и что дает число 65536 ? Может это под какую-то заглучшку. Вобщем хелп ми ![]() |
Автор: oleg1973 24.2.2006, 18:19 |
upx и не только он а почти все пакеры ехе файлов работают примерно так: создается ехешник с image base как у пакуемого файла в этом ехе делается 2 секции секция номер 1 имеет физический размер = 0 а вот виртуальный размер равный сумме всех секций пакуемого файла с учетом их выравнивания в памяти при загрузке секция номер 2 является непосредственно кодом распаковщика + упакованные данные далее при запуске такого файла происходит следующее секция номер 1 "резервирует" место для распакованных данных распаковщик распаковывает данные и переносит их в секцию номер 1 затем заполняет таблицу импорта и передает управление на точку входа в оригинальном файле (ну еще иногда освобождает память занятую секцией номер 2) а чито делает число 65536 я не знаю ))) |
Автор: SIGAra 24.2.2006, 19:24 | ||
Большое спасибо за помощь, но у меня есть вопросы.
1. Этот exe'шник создается физически(На диске) или в адресном пространстве данного процесса ? 2. Точка входа должна указывать на оригинальную точку или нет ? |
Автор: oleg1973 25.2.2006, 16:11 |
ехешник делается на диске точка входа указывает на нащу процедуру распаовки и так далее |
Автор: SIGAra 25.2.2006, 19:30 |
А при склеивании тоже нужно создавать EXE на диске ? |
Автор: oleg1973 25.2.2006, 20:16 |
естестно береш файл ну к примеру пакуеш его там какнить потом нужно сделать ехе в котором будет 1) распаковщик 2) пакованый файл ![]() вот структура ехе после упаковки его upx секция upx0 имеет физический размер = 0 в ней будет потом лежать распакованый ехе |
Автор: SIGAra 26.2.2006, 13:44 | ||
У меня есть 2 вопроса
1)Что возвращяет эта функция ? Адреса функций или названия ? 2)Точка входа при сжатии UPX указывает на какую функцию ? |
Автор: oleg1973 26.2.2006, 15:19 |
1) названия 2) на распаковщик |
Автор: SIGAra 26.2.2006, 16:34 |
Тоесть на функцию unpack ? Но я не могу понять как при получении контроля сдвинуть EXE на ImageBase ![]() |
Автор: oleg1973 26.2.2006, 17:51 |
а как ты вообще делаеш? |
Автор: SIGAra 26.2.2006, 21:49 |
Я создаю новую секцию в файле, туда пишу внедряемый EXE'шник ну конечно ставлю аттрибуты, виртуальный размер и физический размеры устанавливаю равным размеру внедр. EXE, меняю точку входа на (EntryPoint внедряемого EXE + физический адрес по которому он закинут, то есть физическому адресу последней секции), увеличиваю SizeOfImage. Но сам процесс перекидывания EXE в виртуальном пространстве не пойму, как это вообще делается ? |
Автор: SIGAra 1.3.2006, 15:44 |
Наконец-то разобрался. Это оказалось просто! Большое спасибо oleg1973 за оказанную помощь. |
Автор: SIGAra 1.3.2006, 21:18 | ||
При перекидывании EXE в памяти, он использует оригинальные адреса или адреса относительно с места которого он загружен ? То есть, например:
В оригинале (Не будучи склееным с некоторым EXE) выведет Hello World, а вот при переадрессации в склееном EXE, выведет какой-то мусор. Действитвительно это так ? |
Автор: oleg1973 2.3.2006, 10:50 |
в данном случае адрес указывающий на стринг будет фиксированным |
Автор: SIGAra 2.3.2006, 14:40 | ||
И сразу же возникает вопрос. Например:
Функия будет переадресована ? Или просто вызов будет по стандартному адресу ? |
Автор: oleg1973 2.3.2006, 16:07 |
что значит переадресована? оно получается так: MessageBox(0,"hello","world",0); компилятор переведет все это дело в push 0 push adr_hello <- тут у нас адрес нашего стринга hello push adr_world <- тут у нас адрес нашего стринга world push 0 call [adr_msgbox] <- указывает НА АДРЕС в таблице импорта ехе файла , по которому лежит адрес функции MessageBox из User32.dll |
Автор: SIGAra 2.3.2006, 17:51 |
Я имел ввиду переадресована, например имеется функция func , а main её вызывает и в момент когда весь образ exe закинут на ImageBase(в моем случае - 0x00400000) функция main будет вызывать func или она будет брать адрес этой функции относительно ImageBase ? |
Автор: oleg1973 2.3.2006, 18:02 |
есть несколько вариантов вызова процедуры (всмысле интерпритация в асме/машинном коде) call main_proc если имеем дело с CALL то тут будет указано смещение относительно адреса с которого мы вызываем процедуру в 99% оно так и будет а вот если в сишном коде есть нечто типа IF - проверка некого условия то компилер может сделать в данном случае 2 варианта jz или jmp тут уже будет все по другому так как к примеру jmp бывает "короткий" и "длинный" если вызываемая процедура находится в пределах 128 байт то будет использован короткий "релативный" jmp в котором укажется смещение вызываемой процедуры относительно адреса вызова а если вызываемая процедура находится "вне доступа" короткого jmp тогда компилятор сделает конструкцию типа jmp 0x401000 тоесть подставит жесткий фиксированный адрес вызываемой процедуры и соответственно перенеся данный код на другой адрес он будет не работоспособен |
Автор: SIGAra 3.3.2006, 00:00 |
Спасибо за помощь ! |