Строковая функция IDA Pro

У меня есть этот двоичный файл, который я хочу отредактировать, однако после его загрузки все строки представляют собой какие-то тарабарские символы. Есть ли способ его форматировать?


ida
person U.f.O    schedule 21.11.2012    source источник
comment
Строки, вероятно, замаскированы в исполняемый образ, а затем деобфускированы перед их использованием во время выполнения. Вы можете исправить байты в IDA, написав небольшой сценарий IDC для эмуляции процедуры деобфускации для каждой из строк. Кроме того, вы можете запустить программу в отладчике и скопировать измененные строки из памяти в IDA, например, в виде повторяющихся комментариев. Если хотите, я могу подробнее остановиться на любой из этих техник.   -  person user1354557    schedule 21.11.2012
comment
Хотелось бы узнать больше о методах, которые вы упомянули. Мне в этом обязательно помогут.   -  person U.f.O    schedule 21.11.2012
comment
Ладно, круто. Я представил свой ответ как ответ.   -  person user1354557    schedule 22.11.2012


Ответы (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 нет функции "отменить", поэтому небольшая ошибка в коде может привести к поломке всей базы данных.

Удачи!

person user1354557    schedule 22.11.2012