Как мне узнать содержание GDT
Я анализирую дизассемблированную dll и застрял на линии
mov ebx,fs:[00000004h]
Я хочу узнать точный физический адрес данных, которые записываются в ebx с помощью этой инструкции. GDB говорит мне, что fs = 0x53.
Я уже выяснил, что адрес зависит от режима (защищенного или реального), и я почти уверен, что процессор находится в защищенном режиме (см. *). Таким образом, начало сегмента fs должно храниться где-то в GDT, верно? Я также узнал адрес GDT-register (0x009bd5c0007f)
, но GDB не позволяет мне получить доступ или прочитать регистр, поэтому я не знаю, как узнать физический адрес fs (и, следовательно, fs:[00000004h]
).
Кто-нибудь может мне помочь, пожалуйста?
Я использовал инструкцию smsw ax
, и после этого eax
был 0x280031. Таким образом, последний бит равен 1, что означает защищенный режим. Я правильно понял?
2 ответа
Да, это защищенный режим.
И вы, вероятно, нашли виртуальный адрес GDT
используя SGDT
инструкция.
Однако этот адрес вряд ли будет полезен, поскольку вы можете читать память по этому адресу только из кода, выполняемого в ядре ОС (это может быть драйвер режима ядра).
Вам нужно найти способ прочитать интересующую память изнутри ядра.
Поскольку вы упоминаете DLL, я предполагаю, что все это на Windows. В Windows FS
известно, что он указывает на информационный блок потока (TIB). По смещению 4 указатель на вершину стека. Код загружает его в EBX
, вот и все.
Значение FS не имеет значения, и вам не нужно возиться с GDT. Это документированная часть API.