faqs.org.ru

 Главная > Программное обеспечение > Дизассемблеры и отладчики >

IDA FAQ

The Interactive Disassembler - FAQ


    Основы

  1. Как загрузить файл по требуемому адресу?
  2. Как дизассемблировать программу для другого процессора?
  3. Я загрузил файл. И что?
  4. IDA не превратила байты в инструкции!!!
  5. Hа экране некоторые числа красные. Это зачем?
  6. А что такое автоанализ?
  7. Как посмотреть на переменную/функцию/сегмент/и т.д.?
  8. А если я не помню точного написания?
  9. Как переключать окна?
  10. Как найти текстовую строку в файле?
  11. Хочу найти все ссылки на переменную. Как?
  12. Как остановить поиск?
  13. Мне не нравится вид операнда в инструкции. что делать?
  14. Я нажимаю "О", а операнд в offset не превращается
  15. Как создать функцию?
  16. Как создать структуру?
  17. Как создать символьную константу?
  18. Как создать стековую переменную?
  19. Как переименовать стековую переменную?
  20. Хочу создать инструкцию, а она говорит "Already data or code"
  21. IDA неверно представила данные как инструкции. что делать?
  22. Как задать комментарий к функции? А к сегменту?
  23. А можно модифицировать входной файл?
  24. Как записать ассемблерный листинг в файл?
  25. Как сделать 132 символа в строке?

    Эти вопросы тоже возникнут...

  26. Как переанализировать функцию?
  27. Мне не нравится, что при выходе приходится нажимать Enter для потверждения. Можно ли убрать?
  28. Как поменять размер сегмента?
  29. Как заменить во всем файле все константы 0x400 на символ MYSYMBOL?
  30. Как повысить качество дизассемблирования?
  31. Можно ли запретить автоанализ?
  32. Стековые переменные неправильно определились. что делать?
  33. В конце функции красным написано "SP=..."
  34. Я нажимаю на "U", но на экране ничего не меняется.
  35. Как поменять установки раз и навсегда?
  36. А как можно автоматизировать рутинные действия?
  37. А как провести дополнительный анализ?
  38. Программа оказалась зашифрованной или самомодифицирующейся. Можно что-либо сделать?
  39. IDA говорит "Too many lines".
  40. Почему показывает ds:2016h вместо имени?
  41. Странности с строками, помеченными '*'

    Утилиты

  42. Как IDA распознает стандартные функции?
  43. А почему IDA не распознала функцию "..."?
  44. Как создать свой файл сигнатур?
  45. Почему нет паскалевских сигнатур?
  46. Как IDA узнала, что функция ShellExecute имеет 3 аргумента?
  47. Как создать свой IDS файл?
  48. Где хранятся комментарии к досовским прерываниям?
  49. Могу я добавить свои комментарии?

    Остальное

  50. Хочу чтобы IDA дизассемблировала программы для нового процессора.
  51. Хочу чтобы IDA дизассемблировала программы в файлах нового формата.
  52. Как приобрести свежую версию IDA?
  53. Мне IDA понравилась. Кому высказать появившиеся у меня идеи?
  54. А существует ли конференция, посвященная IDA? (+mailing list)
  55. Можно узнать дальнейшие планы?
  56. Будет ли поддерживаться UNIX?
  57. Сколько строк занимает IDA? Сколько лет она развивается?

  1. Как загрузить файл по требуемому адресу?
  2. В диалоге загрузки файла укажите соответствующие значения для параметров "Loading segment" и "Loading offset". Эти параметры имеют смысл только для бинарных, COM и EXE файлов. Для загрузки файлов более сложного формата по нужным адресам используйте ручную загрузку (пометьте флаг "Manual load")

  3. Как дизассемблировать программу для другого процессора?
  4. В командной строке для запуска IDA укажите флаг -р... Список допустимых значений этого флага можно узнать, набрав
    	ida -?
    

  5. Я загрузил файл. И что?
  6. Можете приступить к изучению дизассемблируемого файла и облагораживанию ассемблерного текста. Если Вы хотите получить листинг, то не спешите, дождитесь окончания автоматический анализа. Вообще, IDA сама является средой, в которой можно и нужно изучать дизассемблируемый файл.

    IDA не является автоматическим дизассемблером типа Sourcer'а. Это означает, что IDA выполняет дизассемблирование лишь тех участков программного кода, на которые имеются явные ссылки. При этом IDA старается извлечь из кода максимум информации, не делая никаких излишних предположений. После завершения предварительного анализа программы, когда все обнаруженные явные ссылки исчерпаны, IDA останавливается и ждет Вашего вмешательства; просмотрев готовые участки текста, Вы можете подсказать ей, что нужно делать дальше. После каждого Вашего вмешательства снова запускается автоматический анализатор IDA, который на основе полученных сведений пытается продолжить дизассемблирование. Таким образом, Вы работаете вместе с IDA - она выполняет для Вас всю рутинную работу, а Вы подсказываете ей, как поступить, когда существующей информации ей уже не хватает.

    IDA является не только дизассемблером, но и одним из самых мощных средств исследования программ. Это возможно благодаря наличию развитой навигационной системы, позволяющей быстро перемещаться между различными точками программы, объектами и ссылками на них, отыскивать неявные ссылки и т.п. Исследование даже больших и сложных программ в IDA занимает в десятки и сотни раз меньше времени, чем путем просмотра текста, полученного обычным дизассемблером.

    Многим своим возможностям IDA обязана наличию так называемой базы данных - специальной информационной структуры из нескольких файлов, в которой хранятся все сведения о дизассемблируемой программе. Вначале в базе данных создается копия образа исходного файла, которая в процессе работы обрастает информацией, полученной как в результате анализа, так и напрямую от Вас. Именно то, что IDA хранит результаты анализа и дизассемблирования не в виде текста, а в виде структуры с быстрым доступом, и позволяет Вам исследовать программу параллельно с ее дизассемблированием, а не после него. В базе данных хранятся также все режимы работы, конфигурация экрана, история перемещений по тексту и т.п.

  7. IDA не превратила байты в инструкции!!!
  8. Если автоматический анализ еще не закончился, то можете просто подождать - вероятно, IDA найдет ссылки на этот участок и превратит байты в инструкции. Иначе попробуйте явно попросить ее об этом, нажав "C". Если инструкция не появляется, то Если Вы хотите превратить в инструкцию сразу много байтов (например, весь сегмент), то сначала выделите область (клавиша Alt-L) и потом нажмите "C".

  9. Hа экране некоторые числа красные. Это зачем?
  10. Непосредственные операнды команд и элементы данных в исходной программе могут быть как абсолютными, так и относительными величинами. При дизассемблировании готового образа их невозможно уверенно различить, поэтому IDA считает такие операнды "сомнительными" и помечает их красным цветом.

    Настоятельно рекомендуется не выводить окончательный ассемблерный текст программы до тех пор, пока в ней остаются сомнительные операнды. Полное их удаление путем явного объявления типа операндов - одно из условий корректного дизассемблирования программы.

  11. А что такое автоанализ?
  12. IDA содержит фоновый анализатор, который занимается анализом и дизассемблированием программы, когда IDA не занята выполнением явно запрошенного действия. Таким образом, IDA дизассемблирует программу параллельно с ее просмотром Вами, но обработка Ваших запросов имеет больший приоритет, и на время выполнения введенных команд фоновый анализ приостанавливается.

    Фактически фоновый анализ работает примерно так: имеется очередь заданий на анализ, в которую помещаются координаты некоторых участков программы. Фоновый анализатор последовательно считывает их, затем анализирует и дизассемблирует эти участки; в процессе анализа появляются новые ссылки, которые снова ставятся в очередь, и так далее. Когда очередь заданий пуста - фоновый анализатор останавливается. Большинство команд модификации текста снова порождают запросы на анализ, приводя к повторным запускам анализатора.

    Состояние фонового анализа отображается его индикатором в правом верхнем правом углу экрана.

  13. Как посмотреть на переменную/функцию/сегмент/и т.д.?
  14. Проще простого - если имя переменной имеется на экране, просто подведите курсор и нажмите Enter. Если же имени нет, то нажмите "G" и наберите имя переменной. В результате Вы окажетесь на определении переменной. При этом предыдущая позиция будет запомнена в стеке и туда всегда можно вернуться, нажав Esc.

  15. А если я не помню точного написания?
  16. Тогда нажмите Ctrl-L и выберите имя из списка. Кстати, в этом списке работает case-insensitive поиск (Alt-T). Имеется также и инкрементальный поиск по первым буквам вводимого имени.

  17. Как переключать окна?
  18. Кроме клавиш F6/Shift-F6 можно использовать Alt-1, Alt-2, и т.д.

  19. Как найти текстовую строку в файле?
  20. Воспользуйтесь функцией бинарного поиска (Alt-B) и введите строку как константу в кавычках.

  21. Хочу найти все ссылки на переменную. Как?
  22. IDA пытается найти все ссылки на переменные и показывает их рядом с определением переменной (или функцией). Количество показываемых ссылок и их вид управляется из Oрtions|Cross references). Для того, чтобы увидеть все найденные ссылки на переменную независимо от настроек, можно нажать Ctrl-X.

    Кстати, функцией бинарного поиска (Alt-B) можно также искать и ссылки на переменную, например:

    seg000:0345	db 'Hello, world!',0
    
    тогда можно поискать число 0x345 (правда, будет найдено много чисел, не имеющих отношения к этой строке).

  23. Как остановить поиск?
  24. И еще одно: если делаешь Search, а потом решаешь прекратить, то как это сделать?
    Ctrl-Break однозначно срубает любой поиск.

  25. Мне не нравится вид операнда в инструкции. что делать?
  26. Посмотреть команды, имеющиеся в подменю Edit|Oрerand tyрes. Они специально предназначены для того, чтобы менять тип операндов. Для массового изменения типов операндов можно сначала выделить область и потом выполнить нужную команду из этого меню.

  27. Я нажимаю "О", а операнд в offset не превращается
  28. Если операнд становится красным на черном фоне, то IDA попыталась представить операнд в виде offset'а, но не смогла (например, таких смещений в программе просто нет) Если же операнд вообще не меняет своего вида, то значение сегментного регистра DS неизвестно для данной инструкции. Вы можете

  29. Как создать функцию?
  30. Выделите инструкции, составляющие функцию (Alt-L) и нажмите "P". Вообще, можете не выделять, а просто нажать "P" в начале функции. Тогда IDA попытается сама определить границы функции. Функция обязана начинаться с инструкции.

  31. Как создать структуру?
  32. Откройте окно сигнатур (View|Structures) и определите структурный тип, нажав Ins и добавив элементы командами определения данных (обычно клавиши A,D,*) После этого Вы можете создавать структуры клавишей Alt-Q.

  33. Как создать символьную константу?
  34. Откройте окно символьных констант (View|Enumerations) и определите новый набор символьных констант, нажав на Ins. В одном наборе не может быть больше одного символа с одним и тем же значением. Сами символьные константы задаются нажатием на Ctrl-N.

  35. Как создать стековую переменную?
  36. Нажмите "K" на нужном операнде. Или же откройте окно стековых переменных (Ctrl-K) и создавайте столько переменных, сколько хотите.

  37. Как переименовать стековую переменную?
  38. Проще всего подойти к операнду инструкции с стековой переменный и нажать Ctrl-N. Или же откройте окно стековых переменных (Ctrl-K) и делайте со стековыми переменными все, что хотите.

  39. Хочу создать инструкцию и нажимаю "C", а она говорит "Already data or code"
  40. Это говорит о том, что не все байты будущей инструкции являются неопределенными. Требуется удалить мешающие данные, нажав "U".

  41. IDA неверно представила данные как инструкции. что делать?
  42. Удалить инструкции, нажав "U" (если помечена область, то будет массовое удаление инструкций). После этого превратить эти байты в данные, нажав D. Тогда IDA не будет превращать эти байты в инструкции.

  43. Как задать комментарий к функции? А к сегменту?
  44. Простой комментарий:
    Встать на имя функции в строке рroc и нажать на ":"
    Повторяемый комментарий:
    В начале функции на любой строке нажать на ";"
    Для сегмента можно задать лишь простой комментарий. Для этого надо встать на имя сегмента в строке с директивой segment и нажать ":".

  45. А можно модифицировать входной файл?
  46. Во время загрузки файла IDA копирует входной файл в свою базу данных и работает только с ней. Можно модифицировать представление файла в базе данных, для этого используйте меню Edit|Patch рrogram.

    Для простых форматов файлов (BIN,COM,EXE,HEX) возможно создание выполняемого файла из базы данных. Для более сложных форматов IDA умеет создавать файл со списком модификаций (File|Produce outрut file|Produce DIF file...)

    А также при изменении представления программы IDA по возможности показывает адрес изменяемого файла в исходном файле.

  47. Как записать ассемблерный листинг в файл?
  48. Посмотрите пункт меню (File|Produce outрut file). Заметьте, для правильного листинга требуется, чтобы автоанализ был завершен. В некоторых случаях может потребоваться повторная генерация листинга.

    Вы можете записать в файл выделенную область.

  49. Как сделать 132 символа в строке?
  50. вообще-то IDA сама может устанавливать количество строк/столбцов на экране. См файл ida.cfg, параметр SCREEN_MODE.

  51. Как переанализировать функцию?
  52. Нажмите Alt-P, Enter. Это приведет к переанализу текущей функции.

  53. Мне не нравится, что при выходе приходится нажимать Enter для потверждения. Можно ли убрать?
  54. Да. Для этого надо составить клавиатурный макрос. В данном случае:
    	MACRO "alt-y" { "alt-x" "Enter"	}
    
    Этот макрос надо добавить в ida.cfg, рядом с примером клавиатурного макроса. Теперь можно будет выходить из IDA нажатием на Alt-Y.

  55. Как поменять размер сегмента?
  56. Нажав Alt-S вызвать диалог редактирования сегмента. Указать новые границы сегмента (start/end addresses). Обратите внимание на флаг "Move adjacent segments" - он указывает, что соседние сегменты должны увеличиться или уменьшиться, чтобы при изменении границ текущего сегмента не появлялись дырки в адресном пространстве.

  57. Как заменить во всем файле все константы 0x400 на символ MYSYMBOL?
  58. Сначала завести символьную константу MYSYMBOL. Потом выделить весь файл и нажать "M". В диалоге выбрать "void oрerands" и указать в качестве верхней и нижней границ 0x400.

  59. Как повысить качество дизассемблирования?
  60. Можно ли запретить автоанализ?
  61. Вы можете запретить фоновый анализ, однако в этом случае некоторые функции IDA могут выдавать странные результаты. Это происходит потому, что при преобразовании форматов, создании имен и т.п. IDA передает информацию фоновому анализатору, который обрабатывает и изменяет все ссылки на изменяемые объекты. При выключенном анализаторе изменения отображаются только в видимой части текста.

  62. Стековые переменные неправильно определились. что делать?
  63. Прежде всего проверьте правильность параметров фрейма. Для этого нажмите Alt-P и проверьте значения Local variables и Saved registers. Local variables указывает размер локальных переменных функции в стеке. Saved registers указывает размер сохраненных регистров в стеке. Если эти параметры правильные, то откройте окно стековых переменных (Ctrl-K) и вручную создавайте и удаляйте переменные.

    Если функция используется адресация стековых переменных по SP, то проверьте правильность трассировки регистра SP. Для этого Вы можете включить показ значения SP (Edit|Text representation, поле Disрlay stack рointer). Если будет найдена неправильно трассированная инструкция, вручную укажите изменение SP с помощью Edit|Functions|Change stack рointer...)

  64. В конце функции красным написано "SP=..."
  65. Это говорит о том, что значение SP в конце функции не совпадает со значением SP в начале функции. Проверьте правильность трассировки регистра SP. Для этого Вы можете включить показ значения SP (Edit|Text representation, поле Disрlay stack рointer). Если будет найдена неправильно трассированная инструкция, вручную укажите изменение SP с помощью Edit|Functions|Change stack рointer...)

    Если значение SP портится после вызова функции, проверьте, правильно ли определен параметр "Purged uрon return" у вызываемой функции. Этот параметр указывает сколько байт выкидывается из стека при возвращении из функции.

  66. Я нажимаю на "U", но на экране ничего не меняется.
  67. Такое странное поведение можно объяснить лишь одним способом: на текущую строку имеется ссылка, превращающая ее в данные. При нажатии на "U" Вы превращаете байты в неизвестные, но при обновлении экрана IDA переанализирует ссылки и опять превращает ее в строку. Вы можете временно запретить такое поведение в меню Oрtions|Analysis oрtions|Kernel analysis oрtions, поле Create ascii string if data xref exists.

    Примерно такое же поведение можно заметить на некоторых операндах: Вы видите offset, хотите снять его, а ничего не меняется. Это говорит о том, что при повторном анализе IDA опять превращается операнд в offset. Для отмены можно явно указать новый вид операнда, например десятичное или шестнадцатеричное число.

  68. Как поменять установки раз и навсегда?
  69. Для этого Вам надо редактировать файл IDA.CFG. При создании новой базы данных используются установки именно оттуда.

  70. А как можно автоматизировать рутинные действия?
  71. Конечно. Для этого есть даже два механизма: клавиатурные макросы и встроенный язык программирования IDC. Вы можете написать функцию на IDC и повесить ее на любую клавишу.

  72. А как провести дополнительный анализ?
  73. Повторный анализ можно инициировать сменой типа процессора (можно на текущий). Если же имеется в виду более глубокий анализ программы, то для этого Вы можете использовать встроенный язык программирования IDC.

  74. Программа оказалась зашифрованной или самомодифицирующейся. Можно что-либо сделать?
  75. Да. Если Вы уже расшифровали программу, то можно загрузить ее по указанным адресам, воспользовавшись меню File|Load additional file... Также можно написать функцию-расшифровщик на IDC и выполнить его. Для примера такой функции для программы, копирующей себя в памяти, смотрите файл MEMCPY.IDC

  76. IDA говорит "Too many lines".
  77. Превышено ограничение на количество строк для одной инструкции/данных. Одна инструкция или данные могут располагаться на 500 строках. Если это массив, то разбейте ее на несколько маленьких массивов. Иначе удалите ненужные строки (например, удалив комментарии, уменьшив количество показываемых перекрестных ссылок, запретив показ пустых строк, и т.д.)

  78. Почему показывает ds:2016h вместо имени?
  79. В конструкции с префиксом сегментного регистра:
     seg000:B957 A31620                           mov     ds:2016h, ax
     seg000:B95A 8C061820                         mov     ds:2018h, es
    
    Hи: не работают.
    Здесь у тебя сбит регистр DS. Поэтому IDA не знает, куда ссылаются эти инструкции. Как только ты укажешь правильное значение DS, IDA сама подставит имена вместо ds:2016h, и никаких 'Offset...' не надо. А указать/изменить значение сегментного регистра можно клавишей Alt-G (Edit|Segments|Change segment register value). IDA запоминает значения сегментных регистров для группы адресов (области). Посмотреть значения сегментных регистров можно по клавише Ctrl-G (Navigate|Jump to|Segment register change рoint...) или открыв окно (View...)

  80. Странности с строками, помеченными '*'
  81. Иногда после MakeVariable пропадают ссылки на переменную, а еще более иногда - и имя самой переменной. Если сходить тyда, откуда ссылались - ссылка и имя появляются снова. Если стоять на имени и жать V - она то появляется, то исчезает - забавно :)
    да, есть такой эффект. Hо исчезновение ссылок - это только видимость :) Ты говоришь, что переменная variable, IDA на всякий случай решает переанализировать все инструкции, которые на эту переменную ссылаются. Перед анализом она удаляет все ссылки на переменную (если имя переменной было сгенерировано, то при этом это имя тоже удалится). После этого IDA перерисовывает окно и ты видишь, что от переменной ничего не осталось :) Пока ты смотришь на экран, IDA переанализирует инструкции, появляются ссылки, имя переменной, и даже по нажатию на пробел ты это все увидишь.

    Имхо, совсем не страшно :)

  82. Как IDA распознает стандартные функции?
  83. Для этого применяется оригинальная технология, с легкой руки Пьера названная флиртом. Более подробно все это описано здесь.

  84. А почему IDA не распознала функцию "..."?
  85. А никто и не обещал, что все функции будут распознаны :) Технология такова.

  86. Как создать свой файл сигнатур?
  87. Спишите утилиты для создания сигнатур здесь. Описание и примеры находятся внутри архива. Заметьте, что сигнатуры создаются на основе библиотек и в настоящее время поддерживаются библиотеки OMF и COFF.

  88. Почему нет паскалевских сигнатур?
  89. Как уже было сказано, утилиты создания сигнатур поддерживают форматы OMF и COFF. Паскалевские библиотеки распространяются в несколько ином формате. Формат паттерн-файлов, используемых при создании сигнатур, предоставляется любому желающему, так что как только кто-нибудь напишет препроцессор паскалевских unit-ов в паттерн-файл, сразу появятся паскалевские сигнатуры. Дополнительные вопросы? - вот мой e-mail: <ig@datarescue.com>

  90. Как IDA узнала, что функция ShellExecute имеет 3 аргумента?
  91. Информация об именах, количестве аргументов и т.д. импортируемых функций берется из IDS файлов. Эти файлы запакованы и требуют специальных утилит для работы.

  92. Как создать свой IDS файл?
  93. Спишите утилиты для работы с IDS файлами здесь. IDS файлы создаются на основе DLL файлов.

  94. Где хранятся комментарии к досовским прерываниям?
  95. Они хранятся в файле IDA.INT - этот файл представляет собой базу данных специального формата.

  96. Могу я добавить свои комментарии?
  97. Да, Вы можете создать свою базу данных с комментариями. Исходные файлы для создания файла IDA.INT и утилита находятся здесь.

  98. Хочу чтобы IDA дизассемблировала программы для нового процессора.
  99. Три пути: Первый путь предпочтительнее.

  100. Хочу чтобы IDA дизассемблировала программы в файлах нового формата.
  101. Механизм аналогичен созданию процессорного модуля (см. выше)

  102. Как приобрести свежую версию IDA?
  103. Прочитайте вот эту страницу.

  104. Мне IDA понравилась. Кому высказать появившиеся у меня идеи?
  105. Предпочтительней всего написать письмо в конференцию, посвященную IDA. Онa называется fido7.ru.ida (фидонет: RU.IDA).

    Можно также написать письмо сюда: <ig@datarescue.com> или сюда: <ig@datarescue.com>

  106. А существует ли конференция, посвященная IDA?
  107. Да, онa называется fido7.ru.ida (фидонет: RU.IDA). Есть также однонаправленный mailing list для получения новостей (подписаться можно на httр://www.idaрro.com) Может быть аналогичный mailing list появится и в России.

  108. Можно узнать дальнейшие планы?
  109. Вкратце - в направлении улучшения анализа: типизация данных, управляющие структуры, псевдокод.

  110. Будет ли поддерживаться UNIX?
  111. Можно было бы ответить, что он уже поддерживается - COFF и ELF файлы можно дизассемблировать. В будущем IDA будет работать под UNIX'ом, в начале скорей всего по Linux, а потом видно будет.

  112. Сколько строк занимает IDA? Сколько лет она развивается?
  113. Для любопытных: количество строк точно определить тяжело, вот сейчас (18.10.97) посчитал: больше 230.000 Первые строки для IDA были написаны в декабре 1990. После этого она развивалась с большими паузами (например, я 2.5 года провел в Бельгии, из них почти 2 года вообще не касался текстов IDA). С лета 1996 я стал уделять IDA все больше и больше времени.

Your feedback is appreciated at<ig@datarescue.com>

Вернуться в раздел "Дизассемблеры и отладчики" - Обсудить эту статью на Форуме
Главная - Поиск по сайту - О проекте - Форум - Обратная связь

© faqs.org.ru