eXeL@B —› Основной форум —› ELF – Перенести фрагмент кода из одной программы в другую с правкой relocs |
Посл.ответ | Сообщение |
|
Создано: 15 февраля 2015 21:12 · Поправил: Apokrif · Личное сообщение · #1 Или похожая задача: Перенести фрагмент кода в программе на другое место правкой relocs Вопрос к спецам. Пользую примерно такой процесс: Пишу код на плюсах и переношу нужные куски в другую прогу. Т.е. взять кусок от 0xXXX до 0xYYY из файла A и скопировать по offset 0xZZZ в файл B. Оба файла shared libraries. Копировать фрагмент без проблем. Но при копировании нужно поправить смещения на import functions (malloc, free, snprintf, etc.) Править примерно так: Смотрим в import functions table в A Находим их в нашем фрагменте. Ищем используемые import functions в файле B. Правим смещения в нашем фрагменте. Записываем фрагмент. До кучи хотелось бы иметь возможность добавлять свои functions (i.e. offsets) в таблицу import functions. Т.е. оригинальный фрагмент вызывал внутреннюю функцию XB(…) Новый фрагмент вызывает свою внутреннюю функцию XA(…) (Эта внутренняя функция XA(…) просто заглушка (placeholder), она не входит в копируемый фрагмент) Нужно перенаправить вызов XA(…) на XB(…). Т.е. сделать абсолютно тоже самое, что и для imported functions. Надеюсь, что понятно описал процесс и что собственно ищу. И надеюсь, что или готовые тулы есть или их можно как-то скомбинировать. Добавил: Можно ли это сделать скриптами на ida, как-то так: Грузим файл A. Указываем фрагмент 0xXXX до 0xYYY. Ищем в нем import functions Сохраняем фрагмент + import functions. Грузим файл B. Указываем offset 0xZZZ и файл(ы) из предыдущего шага. Делаем relocate для import functions и патчим файл B. Добавил: Подумал, что можно вытащить relocs (с помощью readelf) Но это даёт только Offset-ы в самой таблице relocs. Code:
А мне нужны Offset-ы на код, который их использует: Code:
Выходит, что без IDA никак, нужно писать на питоне? |
|
Создано: 16 февраля 2015 00:32 · Личное сообщение · #2 Это вы уже что-то наподобие линкера пишете Мне, кстати, когда-то тоже придется подобное написать для ELF. А вы не задумывались о том, чтобы написать пакер, который распакует оригинальный ELF, загрузит ваш payload.ELF (пофиксит релоки, импорты, т.д.), а payload.ELF уже пропатчит/перехватит функции оригинального ELF? Вроде проще выходит. |
|
Создано: 16 февраля 2015 06:49 · Поправил: Apokrif · Личное сообщение · #3 kunix пишет: А вы не задумывались о том, чтобы написать пакер, который распакует оригинальный ELF, загрузит ваш payload.ELF (пофиксит релоки, импорты, т.д.), а payload.ELF уже пропатчит/перехватит функции оригинального ELF? Вроде проще выходит. Это кому как. В ida уже ведь всё есть... да и мне лени не занимать! Однако угрохал 4 часа и написал пару скриптов на питоне под idc. Скрипты крошечные, но я на питоне в жизни ничего не писал до этого. Все работает как нужно, только не придумал, как проще вот это прикрутить: Apokrif пишет: До кучи хотелось бы иметь возможность добавлять свои functions (i.e. offsets) в таблицу import functions. |
|
Создано: 16 февраля 2015 09:47 · Личное сообщение · #4 Apokrif так делает почти любой протектор когда находится в др. секции.. таже енигма после раскриптовки тела пересчитывает адресса call-ов, и арме тоже похожее, но там есть таблица оффсетов. Как поступать с длл-кой я хз ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 16 февраля 2015 09:55 · Поправил: Apokrif · Личное сообщение · #5 VodoleY пишет: Как поступать с длл-кой я хз Я думаю, что скрипты IDApython почти такие же будут. Чуть допилю и выложу для критики и обсуждения. Думаю, что сделать с LocByName( name ) (адрес для имени), когда есть несколько одинаковых name... Подскажите по функции LocByName(). Что у меня имена типа byte_9c850, byte_С850 не парсит… В хедере: IDA 6.6\idc\idc.idc // Dummy names (like byte_xxxx where xxxx are hex digits) are parsed by this // function to obtain the address. The database is not consulted for them. long LocByName (string name); // BADADDR - no such name Добавлено спустя 10 часов 0 минут Выкладываю файлы. Еще раз повторю: С python познакомился только вчера, поэтому код левейший. Критика приветствуется. readme Code:
first.idc Code:
second.idc Code:
|
|
Создано: 17 февраля 2015 03:58 · Личное сообщение · #6 |
|
Создано: 17 февраля 2015 08:13 · Поправил: Apokrif · Личное сообщение · #7 Zorn пишет: Какой же это питон, чистый idc. Вот и я подумал: "Ну блин и питон у Ильфака! Совсем ведь на питон не похож!" Однако оплошал... first.py Code:
second.py Code:
|
eXeL@B —› Основной форум —› ELF – Перенести фрагмент кода из одной программы в другую с правкой relocs |