Анимация
JavaScript
|
Главная Библионтека 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); Возвращает линейный адрес следующего перемещаемого элемента. Обратите внимание, что эта функция действительно возвращает адрес перемещаемого элемента, а не адрес начала содержащей его инструкции. Например: 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.
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.
long GetFixupTgtType(long ea); Функция возвращает тип перемещаемого элемента по его линейному адресу. Возможные значения перечислены в таблице ниже. Поскольку большинство из них на платформе Intel не имеет места, то подробное описание их назначения приведено в факультативном приложении к книге «Использование IDA на не-Intel платформах»
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 |