Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 [ 98 ] 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140

00000010 00000020

00000030 00000040

00 00 00 00-00 00 00 00-3E 00 00 00-01 00 FB 71 > □ q

6A 72 00 00-00 00 00 00-00 00 00 00-00 00 00 00 jr

00 00 00 00-00 00 00 00-00 00 00 00-00 00 01 00 □

00 00 0D 00-00 00 00 00-00 00 00 00-00 00 00 00

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

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

Если же обратиться к другим платформам, а не замыкаться на серии Intel 80x86, то мы столкнемся с феейверком самых разных технических решений от которого может быстро зарябить в глазах.

Каким же образом IDA может поддерживать все это одним махом? Ведь перемещаемыми элементами управляют меньше десяти функций.

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

Вот этот операнд ссылается туда. И все! Этого достаточно, что бы обеспечить нормальную функциональность и работоспособность!

Какой конкретно элемент и куда ссылается, вычисляют специальные модули, отвечающие за загрузку файла определенного формата. Ядро IDA такие проблемы не волнуют.

Поэтому фактически, поддержка перемещаемых элементов обеспечивается не IDA, а внешними модулями, к которым у пользователя программного доступа из языка скриптов нет.

Другими словами, перемещаемыми элементами пользователь не управляет. Да, конечно, он может посмотреть все существующие перемещаемые элементы и даже их скорректировать, но нужно ли это?

Большинство, использующих IDA, этой возможности ни когда в своей жизни не использовали (ну, может быть, разве что из любопытства). И это правильно.

Правильно, потому что IDA и сама неплохо справляется с поставленной задачей. Поддержка перемещаемых элементов это не та область, что требует внимания со стороны пользователя.

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

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

Основная трудность описания перемещаемых элементов в объяснении их типов. А они то же разными бывают. Причем большая часть существует только на других платформах и совершенно чужда пользователям PC с Windows и Pentium. А поэтому описывать их подробно в этой книге совершенно бессмысленно.

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

Поэтому ниже на типе перемещаемых элементах внимание акцентироваться не

будет.



МЕТОДЫ

Функция

Назначение

long GetNextFixupEA(long ea)

Возвращает линейный адрес следующего перемещаемого элемента

long GetPrevFixupEA(long ea)

Возвращает линейный адрес предыдущего перемещаемого элемента

long GetFixupTgtType(long ea)

Тип перемещаемого элемента

long GetFixupTgtSel(long ea)

Возвращает селектор перемещаемого элемента

long GetFixupTgtOff(long ea)

Возвращает смещение перемещаемого элемента

void SetFixup(long ea,long type,long targetsel,long targetoff,long displ)

Добавляет новый перемещаемый элемент

void DelFixup(long ea)

Функция удаляет перемещаемый элемент

long GetNextFixupEA(long ea);

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

Например:

dseg:0000 public start

dseg:0000 start

dseg:0000 B8 00 10

dseg:0003 8E D8

proc near

mov ax, seg dseg

mov ds, ax

Message("0x%X \n",

GetNextFixupEA(0)

0x1001

Эмулятор загрузки инициализировал перемещаемый элемент необходимым значением, указывающим на адрес сегмента в виртуальной памяти. В нашем случае он равен 0x10.

Операнд

Пояснения

Линейный адрес

Return

Завершение

Пояснения

!=BADADDR

Успешно

==BADADDR

Ошибка



long GetPrevFixupEA(long ea);

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

Например:

dseg:0000 public start

dseg:0000 start

dseg:0000 B8 00 10

dseg:0003 8E D8

proc near

mov ax, seg dseg

mov ds, ax

Message("0x%X \n",

GetNextFixupEA(-l)

0x1001

Эмулятор загрузки инициализировал перемещаемый элемент необходимым значением, указывающим на адрес сегмента в виртуальной памяти. В нашем случае он равен 0x10.

Операнд

Пояснения

Линейный адрес

Завершение

Пояснения

Return

!=BADADDR

Успешно

==BADADDR

Ошибка

long GetFixupTgtType(long ea);

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

FIXUP MASK

FIXUP BYTE

FIXUP OFF8

Восьми битное смещение

FIXUP OFF8

FIXUP OFF16

16-битное смещение

FIXUP SEG16

16-битный сегмент (селектор)

FIXUP PTR32

32-битный длинный указатель (16-бит база; 16-бит селектор)

FIXUP OFF32

32-битное смещение

FIXUP PTR4 8

48-битный указатель (16-бит база; 32-бит смещение).

FIXUP HI8

Старшие 8 бит 16-битного смещения

FIXUP HI16

Старшие 16 бит 32-битного смещения

FIXUP LOW8

Младшие 8 бит 16-битного смещения

FIXUP LOW16

Младшие 16бит 32-битного смещения

FIXUP REL

0x10

fixup is relative to the linear address specified in

the 3d parameter to set fixup()



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 [ 98 ] 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140