Руководство пользователя

(руководство описывает сборку 080215)

Часто задаваемые вопросы

В настоящее время список очень короток, но он будет расти со временем.

Вывод слишком короток для входной функции. Некоторый код, который присутствовал в форме ассемблерного кода, не видим в выводе.

Это может случиться, если декомпилятор решил, что результат этих вычислений не используется (так называемый невыполняемый участок программы). Невыполняемый участок программы не включается в вывод.

Наиболее общий случай этого явления - это функция, которая возвращает результат в необычном регистре, например, ECX. Пожалуйста определите явно тип функции и укажите IDA точное местоположение возвращаемого значения. Например:

int __usercall myfunc<ecx>(void);

За более подробной информацией обращайтесь к cтраницам справки IDA об определяемых пользователем соглашениях о вызовах.

Другой весьма общий случай - это функция, тип которой был предположен неправильно IDA или декомпилятором. Например, если предполагаемый тип

int func(void);

но правильным типом функции является

int func(int x, int y, int z);

тогда все вычисления параметров функции будут удалены из вывода. Решение очень простое: укажите IDA, что правильный тип функции и вычисления параметра появятся в выводе.

Вообще, если входная информация (типы функций) будет неправильной, то вывод будет также неправильным. Так что, пожалуйста, проверьте их!

Следующий код
DllUnregisterServer proc near
    CommandLine = byte ptr -274h
    hObject = _PROCESS_INFORMATION ptr -6Ch
    xor ebx, ebx
    mov [ebp+CommandLine], bl
оттранслирован в:
     
char CommandLine; // [sp+0h] [bp-274h]@1
    CommandLine = 0;

Он выглядит неверно. Это может быть исправлено?
Это случается, потому что восстановление типа не выполнено декомпилятором. Чтобы исправить вывод, измените определение CommandLine в IDA. Для этого, откройте фрейм стека (Edit, Functions, Open stack frame (рус. Правка, Функции, Открыть стековый фрейм)), определите местонахождение CommandLine и заставьте ее тип быть массивом (Edit, Functions, Set function type (рус. Правка, Функции, Установить тип функции)). Конечным результатом будет:
CommandLine[0] = 0;
(текущая версия дополнения к программе может потребовать перезапуска).

Я загрузил старую базу данных и декомпилятор, потерпел неудачу в каждой одиночной функции!
Старые базы данных не содержат некоторой основной информации. Если Вы хотите декомпилировать их, сначала позвольте IDA повторно проанализировать базу данных (щелкните правой кнопкой мыши по нижнему левому углу основного окна и выберите Reanalyze (рус. Переанализировать)). Вы также должны будете воссоздать косвенную (таблицу) команд перехода, иначе идиомы переключателя не будут распознаны, и декомпиляция функций, содержащих их, будет терпеть неудачу.

Декомпилятор потерпел неудачу на функции. Должен ли я послать сообщение об ошибке?
Вообще, нет никакой необходимости посылать сообщение об ошибке, если декомпилятор терпит неудачу без нарушения работоспособности. Отказ - не обязательно ошибка. Пожалуйста, прочтите раздел отказы без нарушения работоспособности чтобы узнать, что делать дальше.

Вывод Декомпилятор не оптимален. Это может быть улучшено?
Несомненно, можно. Однако, при условии, что много подпроблем декомпиляции - все еще открытые, даже простые вещи, могут занять время. Тем временем мы рекомендуем Вам использовать редактор текста для изменения псевдокода.