1

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

mov ebx,fs:[00000004h]

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

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

有人可以帮我吗?

我使用了指令smsw ax,然后eax是 0x280031。所以最后一位是1,表示保护模式。我做对了吗?

4

2 回答 2

2

是的,它是保护模式。

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

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

您需要找到一种从内核内部读取感兴趣内存的方法。

于 2013-03-28T11:37:43.787 回答
0

既然你提到了一个 DLL,我假设它都在 Windows 上。在 Windows 上,FS已知指向线程信息块 (TIB)。在偏移量 4 处,有指向栈顶的指针。代码将其加载到EBX中,就是这样。

FS 的值无所谓,也不需要在 GDT 周围闲逛。它是 API 的文档化部分。

于 2013-03-28T16:55:36.990 回答