Несколько вопросов по дизассемблированию 16-битной программы в IDA

Тема в разделе "WASM.BEGINNERS", создана пользователем cmpayc, 12 мар 2010.

  1. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    В продолжение темы http://wasm.ru/forum/viewtopic.php?id=36674

    Дизассемблирую 16-разрядную программу под MS-DOS. Программа невелика, весь код — в одном сегменте. IDA пользуюсь впервые, поэтому возникло несколько вопросов:

    1. Довольно часто встречается последовательность:
    Код (Text):
    1. push cs
    2. ...
    3. pop ds
    4. mov dx, imm16
    Затем следует вызов одной из функций Int 21h, которой в DS:lol: X следует передавать адрес массива. Например, буфера, из которого пишет в файл. В данном сегменте по адресу cs:imm16, действительно, находится такой массив. При нажатии Enter на этом imm16, переходит к массиву. Но по Ctrl-X этот массив не видит.

    Иногда push и pop разнесены на десяток строк, тогда может писать "ds:undefined".

    То же самое бывает и с SI и DI. (Правда, есть случаи, когда ES и DS не совпадают с CS.)

    Вопрос: как заменить эти imm16 на имена массивов? Наподобие "offset buffer1". Так, чтобы их было видно через "Jump-Cross reference".

    2. Аналогично с функциями обработки прерываний:
    Код (Text):
    1. push cs
    2. pop ds
    3. mov dx, imm16
    4. mov ah, 25h
    5. mov al, 9
    6. int 21h
    В данном примере cs:imm16 — обработчик прерываний клавиатуры, устанавливаемый вместо системного. Эту функцию дизассемблер не распознал, показал как данные. Я преобразовал её в код, вставил название через "Edit-Functions-Make function".

    Её обозвало "far". Правильно ли это?

    Как сделать так, чтобы быстро искало ссылающиеся на неё imm16?

    3. При загрузке стояло "преобразовать 90h после джампов в nop". Преобразовало не все. Стоит ли это сделать вручную? Как?
     
  2. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    cmpayc

    как я понимаю imm16 это автоматически сгенеренные константы
    так что нужно просто указать курсором на операнд и сказать иде что это смещение - в версии иды 2.8 для этого горячая клавиша латинская буква o
     
  3. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    аналогично за исключением того что указываете относительно текущего сегмента
     
  4. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    Верно.
    Оказалось нужно "Edit-Operand types-Offset by current segment" Ctrl-O.

    Спасибо!

    Там сработало оно же.
     
  5. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Еще можно иде подсказать конкретное значение ds после pop с помощью Ctrl-G.
     
  6. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    По Ctrl-G у меня открывается окно "Choose address to jump" :)
    Может, Alt-G? Спасибо.
     
  7. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Да, опечатался.