【问题标题】:How do I find out the contents of GDT如何找出 GDT 的内容
【发布时间】:2013-03-28 09:44:00
【问题描述】:

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

mov ebx,fs:[00000004h]

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

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

有人可以帮帮我吗?

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

【问题讨论】:

  • 嗯?动态链接库?
  • 如果这是 32 位代码,它可能是从 TIB/TEB 读取的

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


【解决方案1】:

是的,这是保护模式。

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

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

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

【讨论】:

  • 听起来好像超出了我的能力范围;-)
【解决方案2】:

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

FS的值无所谓,GDT也不用瞎扯。它是 API 的文档化部分。

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 2020-05-14
    • 2012-03-11
    • 2011-01-21
    • 1970-01-01
    • 2012-07-17
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多