Смещение

eXeL@B DVD

Материал из Справочник исследователя программ

Перейти к: навигация, поиск

Обычно информация рассматриваются некоторым упорядоченным фрагментом (куском). Наиболее естественным способом различать элементы фрагмента просто занумеровать их. В информатике принято начинать нумерацию с нуля. При объединении фрагментов вычисляют абсолютные адреса (номера относительно начала объединения фрагментов) только для начальных элементов фрагментов. Для каждого фрагмента этот адрес будет базовым. Абсолютные адреса остальных элементов каждого фрагмента можно узнать сложив базовый адрес и адрес относительно начала фрагмента.

Определение

Смещением называется адрес(номер) элемента(байта) относительно начального(нулевого).

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

Пример: Смещение в файле - адрес данного байта в файле, считая первый байт в файле за нулевой


Я знаю адрес команды, которую мне надо изменить, в памяти. Как мне узнать, по какому смещению (адресу) относительно начала файла находится эта команда в файле?

Лично я смотрю смещение нужной команды в файле с помощью IDA Pro или W32Dasm. В обеих этих программах смещение выделенной команды/адреса в файле показывается в строке состояния (такая панелька в самом низу окна программы). Например в W32Dasm'e, если вам надо найти смещение нужной команды в памяти, выделите эту команду и в строке состояния смотрите такую строку: @Offset 00XXXXXX in File <filename>. Это значит что по смещению XXXXXX относительно начала файла и находится машинный код вашей команды. Аналогично в IDA Pro смотрите искомое смещение в строке состояния слева от текущего адреса. Также смещение нужной команды в файле, зная ее (даже и виртуальный) адрес, можно найти с помощью своеобразного калькулятора в PE Tools или LordPE (PE Editor -> FLC).

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

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