Как преобразовать адрес памяти в адрес сегмента кода? - PullRequest
0 голосов
/ 10 февраля 2019

Как я могу преобразовать адрес в 16-битный сегмент кода (регистр CS)?Например, если сегмент .text начинается с 00E51000, как рассчитывается регистр CS для этого сегмента?Этот вопрос относится к 32-битной архитектуре x86.

1 Ответ

0 голосов
/ 10 февраля 2019

В 32-битном режиме вы можете (и обычно должны) всегда использовать значение CS, которое ссылается на запись GDT с base = 0 / limit = -1.Если вы работаете в пользовательском пространстве под основной операционной системой, ваш процесс уже начнется в этом случае.Фактически DS / ES / SS будет настроен таким же образом, то есть модель с плоской памятью.(FS или GS могут иметь ненулевое основание для локального хранилища потока.)

Затем вы можете ссылаться на память в этом разделе / ​​сегменте со смещением = 0x00E51000.например, mov eax, 0x00E51234 / jmp eax.

С DS / ES / SS, также равным 0 / -1, у вас есть модель с плоской памятью, где mov eax, [0x00E51234] загружает те же байты, которые вы скачалик.

...