У меня есть этот двоичный файл, который я хочу отредактировать, однако после его загрузки все строки представляют собой какие-то тарабарские символы. Есть ли способ его форматировать?
Строковая функция IDA Pro
Ответы (1)
Почему вы видите "тарабарщину":
Строки, вероятно, запутаны. Скорее всего, перед тем, как каждая из строк будет использована в программе, запускается процедура деобфускации, чтобы преобразовать строку в памяти обратно во что-то осмысленное. Это распространенный метод, используемый для предотвращения правильного анализа двоичного файла инструментами статического анализа (такими как утилита GNU «strings» или IDA Pro). Остальная часть этого ответа предполагает, что это верно для вашего двоичного файла.
Как деобфускировать строки (динамический подход):
Если вы можете запустить бинарный файл, вы можете позволить ему позаботиться о деобфускации за вас. Все, что вам нужно сделать, это запустить двоичный файл в отладчике и проанализировать память после ее деобфускации.
Некоторые двоичные файлы, которые запутывают свои строки, никогда не запутывают их повторно после их использования, поэтому один интересный способ, который вы, возможно, захотите попробовать в первую очередь, — это запустить двоичный файл в отладчике и прервать выполнение прямо перед его выходом. Если строки все еще деобфускированы, вы можете сделать дамп памяти соответствующего раздела, чтобы сохранить деобфускированные строки. (Это не обязательно приведет к деобфускации всех строк для вас; вы получите только те строки, которые были деобфускированы по пути выполнения двоичного файла)
Если предыдущий метод не работает для вас, попробуйте установить аппаратную точку останова записи на первый байт запутанной строки, а затем запустить двоичный файл. Если точка останова срабатывает, выполните инструкции, чтобы остальная часть строки была деобфускирована. Если деобфускация всегда происходит из обычной подпрограммы, вы можете поместить точку останова в конце этой подпрограммы и, возможно, запрограммировать отладчик так, чтобы он выводил деобфускированную строку каждый раз, когда выполнение проходит через эту подпрограмму.
Когда у вас есть список деобфусцированных строк, вы можете либо вставить их непосредственно в базу данных IDA (обсуждается ниже), либо оставить повторяющиеся комментарии (используя ключ '
) по адресам каждой из строк в базе данных, так что деобфускированная строка будет отображаться как комментарий к каждой инструкции, которая на нее ссылается.
Для небольших двоичных файлов вам может сойти с рук выполнение аннотаций вручную, но было бы целесообразно прочитать сценарии IDA, чтобы вы могли автоматизировать этот процесс. Книга IDA Pro содержит отличный справочник по этому вопросу.
Как деобфускировать строки (статический подход):
Если вы не можете запустить двоичный файл или если динамический подход не обеспечивает деобфускацию всех строк, вы можете деобфусцировать их самостоятельно.
Скорее всего, если вы просмотрите перекрестные ссылки на любую из запутанных строк в IDA Pro (просмотрите их с помощью клавиши x
), вы должны перейти к процедуре деобфускации. Если процедура не слишком сложна — а это обычно не так — вы сможете написать сценарий для эмуляции процедуры дебофускации. Это позволит вам заменить запутанные строки деобфускированными строками в базе данных IDA.
(Для пояснения: база данных IDA полностью отделена от самого двоичного файла. Все, что вы делаете с базой данных, не повлияет на фактический двоичный файл, и все, что вы делаете с двоичным файлом, не повлияет на базу данных.)
Ваши варианты сценариев IDA — это IDC (исходный встроенный язык сценариев IDA) и IDAPython. Я настоятельно рекомендую использовать IDAPython, так как он намного проще в использовании и является гораздо более мощным языком. Я не уверен, что вы можете установить IDAPython на IDA Free 5.0, но он должен быть в комплекте со всеми последними версиями IDA Pro.
Обзор сценариев IDA выходит за рамки этого ответа, но вот пример для начала. Я пишу это в IDC на случай, если вы используете IDA Free. Допустим, ваша процедура деобфускации просто выполняла операцию XOR для каждого последующего байта с 0x1F до тех пор, пока нулевой байт не был декодирован. Тогда следующий цикл может оказаться частью вашего сценария IDC:
// *EXAMPLE*
auto addr = 0x00401000; // The address of your string
while(1){
auto b = Byte(addr) ^ 0x1F;
PatchByte(addr, b);
if (b == '\0'){
break;
}
addr = addr + 1;
}
Запустить скрипт можно из File > IDC Command...
или File > Script file...
.
Как вы могли догадаться, Byte
возвращает байт, хранящийся по заданному адресу, а PatchByte
записывает байт по адресу. Встроенные функции в IDAPython имеют те же имена, что и их аналоги IDC, поэтому версия IDAPython будет почти идентичной, если не считать C-подобного синтаксиса. Как упоминалось ранее, я настоятельно рекомендую The IDA Pro Book для пошагового руководства по написанию сценариев IDA. Изучив основы, вы можете использовать встроенный справочный указатель IDA и документацию IDAPython как пару других ссылок.
Всегда сохраняйте базу данных перед запуском скрипта, исправляющего код! В IDA нет функции "отменить", поэтому небольшая ошибка в коде может привести к поломке всей базы данных.
Удачи!