2013-06-20 4 views
4

У меня есть эта простая команда ассемблера:Assembler: Вычисление адреса памяти с регистром базой

mov eax, fs:[30h]; 

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

Может ли кто-нибудь объяснить мне математику за расчет адреса?

+0

О каком конкретном ассемблере вы говорите? –

+0

Используется Ida Pro. Есть ли разница? – Robert

+0

Различные ассемблеры имеют разный синтаксис, так что да. –

ответ

3

FS - это индекс в таблицу , которая, в свою очередь, содержит базовый адрес, который добавляется к адресу. В win32 FS используется для доступа к информационному блоку потока (или, точнее, дескриптор сегмента, проиндексированный FS, имеет базовый адрес, так что FS:[0] является началом TIB), а FS:[30h] - это местоположение указателя на блок рабочей среды процесса , В win64 для доступа к TIB используется GS.

+0

Спасибо за описание, но я знаю, что делает код. Мне нужно рассчитать адреса памяти, чтобы я мог получить доступ к TIB вручную без кода ... – Robert

+2

@Robert без кода ..? Ну, вы можете запустить VMMap и посмотреть, где находятся TIB (они находятся на более высоких адресах) – harold

+0

Спасибо за подсказку VMMap, теперь я знаю адрес, где искать TIB. В любом случае было бы интересно понять вычисление адресов ассемблера x86. – Robert

-1

Лучшее объяснение (и даже с картинками) находится здесь:

http://flint.cs.yale.edu/cs422/doc/art-of-asm/pdf/

Глава 4 является то, что вы должны читать.

+0

Регистр fs является 16-битным регистром, поэтому просто добавление смещения не дает вам действительного указателя. – Robert

+0

Хорошо, я отредактировал его, чтобы сохранить ссылку на самую мощную книгу asm, которую я когда-либо читал (и все еще читал). – icbytes

1

Чтобы получить базовый адрес сегмента FS в Win32, вы можете использовать функцию GetThreadSelectorEntry (только для x86).

Если вы пишете отладчик, вы можете использовать значение из структур CREATE_THREAD_DEBUG_INFO/CREATE_PROCESS_DEBUG_INFO, которые отправляются в отладчик для каждого нового потока или процесса. Это указывает на потоки TEB и работает для процессов x86 и x64 (на x64 для TEB используется регистр GS).