· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› Замена косвенного вызова на прямой

Посл.отвђт Сообщенiе


Дата: Май 8, 2004 15:18:38

Какие проблемы могут возникнуть при замене call DWOR ptr ds:[косвенный адрес] на call адрес ? У меня после этой, как казалось, равнозначной замены, получаются два разных кода в памяти во время исполнения. Из-за чего это может происходить ? Я думал что из-за релоков, но у меня ImageBase равен адресу загрузки, т.е. релоков быть не может.

И второй вопрос, почему hex код команды call адрес (адрес один и тот же) может быть разным в разных местах программы ? проверено с п-ю Hiew 6.86 ввожу в режиме редактирования call адрес и получаю разный hex код

428793665__


Дата: Май 8, 2004 18:09:06

И второй вопрос, ...

Потому что CALL содержит смещение относительно следующей за CALL команды, таким образом CALL на то же место из разных мест кода будет содержать разное смещение:
CALL FOO  ; смещение вписанное здесь = плюс 500 байт

...  ; 500 байт кода

FOO PROC

...  ; 1500 байт кода

CALL FOO  ; смещение вписанное здесь = минус 1500 байт


Дата: Май 10, 2004 13:36:00

Получается, если мне нужно пропатчить 100 команд, HexView не поможет автоматизировать эту процедуру ? т.е. придется в нем ручками 100 раз поиск/редактирование/применить ?


Дата: Май 10, 2004 14:35:40

AsmGuru62
Что-то я не пойму, разве в инструкции CALL указывается не смещение относительно начала сегмента? Причем тут смещение относительно инструкции?


Дата: Май 10, 2004 15:06:43

AsmGuru62
Сейчас сам посмотрел. Действительно, вы правы. Но, у Зубкова я, кажется, про это не читал... Или плохо читал?
Команда:
CALL операнд
Назначение:
Вызов процедуры
Процессор:
8086

Сохраняет текущий адрес в стеке и передает управление по адресу, указанному в операнде. Операндом может быть непосредственное значение адреса (метка в ассемблерных программах), регистр или переменная, содержащие адрес перехода. Если в качестве адреса перехода указано только смещение, считается, что адрес расположен в том же сегменте, что и команда CALL. При этом, так же как и в случае с JMP, выполняется ближний вызов процедуры. Процессор помещает значение регистра EIP (IP при 16-битной адресации), соответствующее следующей за CALL команде, в стек и загружает в EIP новое значение, осуществляя тем самым передачу управления. Если операнд CALL — регистр или переменная, то его значение рассматривается как абсолютное смещение, если операнд — метка в программе, то ассемблер указывает ее относительное смещение. Чтобы осуществить дальний CALL в реальном режиме, режиме V86 или в защищенном режиме при переходе в сегмент с теми же привилегиями, процессор помещает в стек значения регистров CS и EIP (IP при 16-битной адресации) и выполняет дальний переход аналогично команде JMP.


Дата: Май 11, 2004 19:39:21

По-моему это общеизвестно.

В коде операции внутрисегментного CALL\JMP в непосредственном
операнде записывается смещение относительно этой команды.

В ассемблерной мнемонике этих инструкций
записывается целевой адрес.

При ассемблировании\дизассемблировании эти представления
переводятся друг в друга. Так сложилось...


Дата: Май 11, 2004 20:41:38 · Поправил: Oleg_SK

captain cobalt
Да, я этого не знал. Я считал, что смещение относительно команды указывается только при адресации типа: short, а при адресации типа: near, указывается смещение относительно начала сегмента.


Дата: Май 12, 2004 09:08:04

т.е. все таки HexView не помощник в автоматизации, итог то каков ?


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.054