Исправление EXE с использованием IDA - PullRequest
0 голосов
/ 20 февраля 2010

Скажем, есть глючная программа, которая содержит sprintf (), и я хочу изменить его на snprintf, чтобы он не имел переполнения буфера ... как мне это сделать в IDA ??

1 Ответ

3 голосов
/ 02 июля 2010

Вы действительно не хотите вносить подобные изменения, используя информацию из IDA pro.

Несмотря на то, что разборка IDA является относительно качественной, ее недостаточно для поддержки перезаписи исполняемого файла. Преобразование вызова sprintf в вызов snprintf требует добавления нового аргумента в стек. Это требует введения новой инструкции, которая влияет на советник всего, что следует за ним в исполняемом образе. Обновление этих эффективных адресов требует чрезвычайно качественной разборки. В частности, вам необходимо уметь:

  1. Определите, какие адреса в исполняемом файле являются данными, а какие - кодом
  2. Укажите, какие операнды команд являются символическими (адресные ссылки), а какие операнды команд являются числовыми.

Ида не может (достоверно) предоставить вам эту информацию. Кроме того, если исполняемый файл статически связан с crt, он может не содержать snpritnf, что очень усложнит выполнение перезаписи вручную.

Есть несколько потенциальных обходных путей. Если в (или после) функции, выполняющей вызов, имеется достаточное количество отступов, вам, возможно, удастся избежать переписывания только одной функции. Кроме того, если у вас есть доступ к объектным файлам, и эти объектные файлы были скомпилированы с ключом / GY (при условии, что вы используете Visual Studio), то вы можете редактировать объектный файл. Однако редактирование объектного файла может все еще потребовать существенных исправлений.

Предположительно, однако, если у вас есть доступ к объектным файлам, у вас, вероятно, также есть доступ к источнику. Смена источника - это, вероятно, ваша лучшая ставка.

...