Как стать автором
Обновить

Комментарии 7

Я занимаюсь разработкой дизассемблера на си для линукс.

Вряд ли у вас получится что-то лучше, чем уже имеющиеся инструменты (тот же objdump). Но как упражнение — наверное, неплохо.

Также была проблема определённая: адресация в памяти. Я добавил в команде lea код, который сохраняет в структуру нужные данные, и если ты вставляешь новые операторы в секцию кода, то все смещения выстраиваются так, что указывают на данные в новых смещениях.

Вот примерно в этом месте я перестал понимать, о чем речь.
Что за структура? Что за «нужные данные»? Что за смещения указывают на данные на новых смещениях?

Проблема со вставкой машинного кода в середину секции .text — в том, что поплывут все смещения после вставки. А смещения могут использоваться очень много где. Например, если в первой половине секции есть код, вызывающий код из второй половины секции (call xxxxx), то придется увеличить оффсет в команде call на размер добавленного кода (call xxxxx+size(addedCode)). Аналогично — для вызовов в обратном направлении (только там придется уменьшать оффсет). А еще есть такая чудесная таблица GOT (global offsets table), где лежат адреса всякие… И еще таблицы для обработки исключений (секции .eh_frame и .eh_frame_header). И много еще чего есть в файле ELF. Да, и не забываем про 64-битный режим — там тоже много чего веселого наворочано.
Ну и да, всяческие смещения секций придется пересчитать.

В общем, гораздо проще найти в файле кусок неиспользуемого кода, заменить его своим и встроить куда-нибудь call на него.
Ну чтобы заменить байтами код это да, проще, но я хочу понять весь elf и весь дизассемблер. Уж очень классное приложение может получиться если реализовать всё. Ну да, я вставляю код в нужный адрес и всё пересчитывается. Потом можно проверить тем же objdump, что файл получился правильным.
Уж очень классное приложение может получиться если реализовать всё.

А что конкретно-то может получиться такого классного? Дизассемблер — он и в Африке дизассемблер, у него область применения довольно узкая.
Вот если вы что-то типа IDA решите наваять — тогда да, уже интереснее. Чтобы сигнатуры стандартных функций распознавал и рантаймов различных языков, и чтоб можно было интерактивненько в процесс дизассемблинга вносить корректировки…

Потом можно проверить тем же objdump, что файл получился правильным.

Кхе-кхе… Я вот сейчас отдизассемблил objdump'ом бинарь, который только что собрал — 557 мегабайт получился текстовичок. Много ли удастся проверить по этому листингу? Тут к гадалке не ходи, глазами проверить все адреса не получится.
А если билд еще и без отладочной информации, да с агрессивной оптимизацией — там вообще черт ногу сломит.
Ну моя программа например работает так. Если хочешь получить все смещения и выполнить определённую работу, то передаешь функции FALSE. Если хочешь просто вывести дизассемблированный код, то передаёшь TRUE. Но FALSE я передаю только в том случае, когда надо добавить новый ассемблерный код куда нибудь между кодом, тогда вызывается функция с FALSE, которая заполняет структуру с данными и сразу же после этой функции обрабатывает.
У вас какая-то беда с терминологией. Пиратское ПО и вредоносное — это как бы не синонимы совсем…

Ну а вообще в дизассемблере поведение функции разгребания кода обычно описывают с помощью таблицы а не с помощью лавины из case.
Поищи в инете исходники Mistfall PE EXE/DLL reversing&infecting engine for Win32 за авторством Z0MBiE.

Там, правда, не ELF, а PE, но именно в том виде, как ты описываешь — берем файл, разбираем его на секции, дизассемблируем код и попутно выстраиваем огромную таблицу «смещений-которые-могут-измениться», а потом, после инжекта своего кода, пересчитываем заново все эти смещения и собираем файл обратно.
классно.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации