Джойнинг посредством OllyDbg В сегодняшней моей статье, пойдет разговор о том, как можно бинарный текст одного приложения правильно «склеить» с бинарным текстом другого, и при этом не потерять работоспособности «склейки». Дабы не запутатся что и как, я использую следующие термины: «гостевое приложение» (любой произвольный код, в моем случае программа, которая выводит на екран сообщение); «родительское приложение» (пациент, которого мы будем оперировать); Ну что, приступим? Порядок действий: Подготовка и анализ гостевого приложения. Импорт необходимых функций в родительское приложение. "Склеивание" приложений. Что нам понадобится: CFF Explorer OllyDbg PETools Гостевое приложение (MessageBox) Родительское приложение (выбрал программу PasswordProtecter от Vazonez ) Подготовка и анализ гостевого приложения. В качестве подопытного, я выбрал пример из Examples компилятора FASM, со следующим кодом: Код: include 'win32ax.inc' .code start: invoke MessageBox,HWND_DESKTOP,"Hello world!)",invoke GetCommandLine,MB_OK invoke ExitProcess,0 .end start Что делает? При запуске показывает сообщение "Hello world!)", и при нажатии на кнопочку "Ok" закрывается)) Мы его скомпилировали, и получили бинарник размером ~2 килобайт. Загоняем его в OllyDbg: Так-с, теперь нам необходимо узнать, какие функции использует приложение (собственно их и так видно, но мы "уточним"): жмем правой клавишей Search for => All intermodular calls, видим три функции.. ..из которых нам нужны только GetCommandLineA и MessageBoxA. ExitProcess нам не нужна (если ее использовать, то после нажатия на кнопку "Ок", будет завершатся и родительское приложение). Пока отладчик можем закрыть! Импорт необходимых функций в родительское приложение. Открываем наше родительское приложение (PasswordProtecter) в CFF Explorer, и в левой колонке выбираем Import Adder (для импорта необходимо знать, в каких dll находятся функции, Вы же в "Оле" их запомнили?) нет? ну тогда вот подсказка: GetCommandLineA в kernel32.dll, а MessageBoxA в user32.dll) Жмем Add и добавляем dll, выбираем нужные функции, и нажимаем Import By Name, по завершению - Rebuild Import Table Переходим во вкладку Import Directory и запоминаем значения FTs(IAT) kernel32 - 0008F187 user32 - 0008F1A8 Сохраняем файл.. Грузим программу в PETools, и смотрим ее Image Base.. ..у которого значение 00400000 Маленькая часть этапа пройдена) Теперь нам необходимо "инициализировать" импортированные нами функции, делается это командой: Код: JMP DWORD PTR DS:[******] ..где ****** = ImageBase + FTs(IAT), тоесть: GetCommandLineA = JMP DWORD PTR DS:[0048F187] MessageBoxA = JMP DWORD PTR DS:[0048F1A8] Загружаем родительское приложение в "Олю", вводим команды, жмем Ctrl+A, и если ничего не "побилось", у Вас должно все выглядеть следующим образом: Copy to executable => All modofications => Copy all, открылось новое окно, в нем правой клавишей Save file, сохранились, глотнули пивка, и идем дальше "Склеивание" приложений. Для удобства, рекомендую открыть и гостевое и родительское приложения (в OllyDbg) одновременно. Для начала, в родительском приложении, нам нужно скопировать первые строки от Entry Point (правая клавиша Copy => To clipboard, и куда-нибудь в блокнот) Код: 0046C218 > $ 55 PUSH EBP 0046C219 . 8BEC MOV EBP,ESP 0046C21B . 83C4 F0 ADD ESP,-10 0046C21E . B8 60C04600 MOV EAX,Password.0046C060 Далее выбираем строку, например, 0046C2AE, и в Entry Point пишем jmp 0046C2AE. Переходим в гостевое приложение, и копируем первые три строки.. Код: 00401000 > $ 6A 00 PUSH 0 00401002 . FF15 68204000 CALL DWORD PTR DS:[<&KERNEL32.GetCommand>; [GetCommandLineA 00401008 . 50 PUSH EAX ..и заносим в родительское приложение, НО, вторую строку (GetCommandLineA), ставим вызов на строчку, где мы ИНИЦИАЛИЗИРОВАЛИ эту функцию, тоесть CALL 0046C298 Далее выбираем следующее, и по выделенному правой клавишей Binary => Binary Copy Переходим в родительское приложение, выделяем участок начиная с адреса 0046C2B6 (продолжаем) и Binary => Binary Paste Теперь у нас осталась функция MessageBoxA, делаем CALL аналогично примеру с GetCommandLineA - CALL 0046C29F Теперь мы вводим скопированные строки от Entry Point, и делаем скачок, откуда нас "оторвало".. сделали? проверьте - Ctrl+A, если все на месте, то должно выглядеть приблизительно так: Сохраняемся, и запускаем то что у нас вышло!)) Эта статья, скорее всего, является материалом для тренировок, и закрепления навыков при работе с OllyDbg (импорт функций, копировать/вставить, jmp и пр.) Не забывайте УК, и помните, что взлом - это плохо! ivo: Все примеры можно скачать отсюда. Пароль на архив: xaker.name © KaeraK и Xaker.Name