我如何找到GDT的内容

时间:2013-03-28 09:44:00

标签: assembly x86 memory-address protected-mode gdt

我正在分析一个反汇编的dll并被卡在线上

mov ebx,fs:[00000004h]

我想找出使用​​此指令写入ebx的数据的确切物理地址。 gdb告诉我fs = 0x53.

我已经发现地址取决于模式(受保护或真实),我很确定CPU处于保护模式(参见 * )。所以段fs的开始应该存储在GDT的某个地方,对吧?我还找到了GDT-register (0x009bd5c0007f)的地址,但gdb不允许我访问或读取寄存器,所以我不知道如何找出fs的物理地址(因此,{{{ 1}})。

有人可以帮帮我吗?

我使用了fs:[00000004h]指令,之后smsw ax为0x280031。所以最后一位是1,这意味着保护模式。我做对了吗?

2 个答案:

答案 0 :(得分:2)

是的,它是受保护的模式。

您可能使用GDT指令找到了SGDT的虚拟地址。

但是,该地址不太可能有用,因为您只能从OS内核中执行的代码读取该地址的内存(可能是内核模式驱动程序)。

你需要找到一种方法来从内核中读取感兴趣的内存。

答案 1 :(得分:0)

由于你提到了一个DLL,我认为它全部都在Windows上。在Windows上,已知FS指向线程信息块(TIB)。在偏移量4处,有指向堆栈顶部的指针。代码将其加载到EBX,即它。

FS的价值无关紧要,也不需要围绕GDT。它是API的文档部分。