Здравствуйте, начал изучать с наскока assem и знаний в этой области пока не особо много. Если буду говорить что то не так поправте пожалуйста. Задачи такие: 1) Добавление нового сегмента, секции, оверлей адресов или как это правильнее назвать для РЕ файла. Либо способ расширить существующий сегмент, проще говоря расширить уже готовый файл для доп. данных. 2) Добавление новой функции (в новый сегмент.. либо через оверлей не знаю как правильнее это делать) в РЕ 3) Тоже самое только для ELF файла. Для наглядности попробую привести пример с картинками: Берем простую программу: Компилируем, а затем через hex редактор добиваемся примерно такого результата: Надеюсь понятно объяснил. В общем подскажите подалуйста в каком направлении искать, чтобы дойти до такого ?
Для редактирования заголовков ELF'ов (для расширения или добавления сегментов) вот например инструмент https://sourceforge.net/projects/hte/ Для PE есть попроще и поинтересней https://github.com/cybertechniques/site/blob/master/analysis_tools/cff-explorer/index.md Assem это вроде бы казахское имя.
А есть где почитать как этим пользоваться, или где почитать, чтобы лучше понимать саму тематику и сложность задачи ?
Гуглить "внедрение кода в <PE/ELF>", читать справку по инструментам. Может быть в архивах журналов типа хакера понятно и доступно описано .
Реально голову по приколу морочить?... Взял в отладчике 2 значения заменил и гуляй.... Вот это реально в яблочко! Я хз что надо чтобы дойти до такого...(...даже(!) я)
Хорошая конечно штука это CFF-Explorer. Вот создал я новый сегмент, а как теперь туда правильно записать данные(функцию) и как после этого правильно к ним обратиться ? Например с помощью IDA PRO ?
Denis, через хекс редактор ты трогаешь байты на жестком диске. А идой ты трогаешь виртуальные адреса размещенного исполняемого файла, условно в оперативке. Их туда загрузит загрузчик, ориентируясь на байты заголовка пе или ельфа. В виртуальных адресах твоего заголовка пе или эльфа нет. Код ляжет в секцию текст и будет выполняться, если ты его не правишь, с чего вдруг он должен пойти в какую-то секцию? гуглить код инджекшен, хуки, и где в заголовке байты, которые скажут, что добавленной тобой секции, можно исполнять код.
Очевидно надо посмотреть VA получившейся новой секции, написать на асме код, который хочешь туда включить, поместить туда и не забыть про переходы туда и обратно из оригинального. Либо сделать это в иде или олли дебаггере. В иде есть возможность сохранить изменения в исходном файле.
f13nd, я знаю, но это его больше запутает, чем поможет. Ведь он явно говорит про иду в контексте динамики исполнения. А правит что-то хексредактором. Мешанина у него в том, что везде видит байты, и думает, что это одно и тоже место. А не два разных, связанных идой (если он хексит-патчит, например, в иде в окне дампа. А если он патчит в основном окне, то зачем ему новая секция? не влезает?).
Может копипастит с иды байты, находит в нехредакторе их и патчит где надо) Пусть делает как нравится. Ида в принципе не самый худший вариант для таких фокусов.
Спасибо за подсказку для поиска. Не сильно знаком с терминологией. Я конечно не могу сказать на сколько я запущенный случай, но такие вещи как IDA->PathProgram->ApplyPatchesToInputFile + KeyPatch могу использовать. Проблема сейчас в том, что не могу понять как правильно добавить в новый сегмент любую функцию(новую или копию уже имеющейся в программе). Желательно конечно если всё это делать в IDA, так даже лучше будет. Hex редакторы скорее как вспомогательный элемент используются. Может есть у кого простой пример до и после инъекции кода. --- Сообщение объединено, 1 сен 2019 --- Не уверен что это важно, но хотелось бы ещё добавить. Функция добавляющаяся в программу должна дополнять функционал изначальной программы, а не перехватывать управление на себя, для разового использования. В общем суть в том, что хочется понять как улучшить чужую программу новыми функциями и ничего при этом не сломать.
Либо риппинг, либо декопиляция-компиляция, либо заплатка, перехватывающая управление. Ничего другого не существует и из всего этого заплатка самое простое.