【问题标题】:Is there an API for Win32 which will allow me to use ES, GS, FS?是否有适用于 Win32 的 API 允许我使用 ES、GS、FS?
【发布时间】:2012-02-11 23:48:03
【问题描述】:

我想在汇编程序中使用 ES、FS 和 GS,以允许我拥有 3 个独立的地址空间。

是否有一个Win32 API,它将设置LDT并为我提供适当的选择器的值?

【问题讨论】:

  • 我认为您将段与地址空间混淆了。即使您设法将段寄存器设置为指向不同段的不同选择器,这些段仍将驻留在同一虚拟地址空间中。你想达到什么目的?
  • “地址空间”是指单独的内存段。例如,MOV AX,ES:[BX] 会从与 MOV AX,GS:[BX] 不同的“空间”移动,因为 ES 和 GS 将包含不同的选择器。我想要完成的是将我的 16 位应用程序移植到 32 位应用程序,但我的 16 位应用程序使用 ES、FS 和 GS 来访问 3 个不同的 64K 内存区域。

标签: winapi assembly x86 cpu-registers memory-segmentation


【解决方案1】:

答案是:是的,但是。

您想要的 API 实际上在 NT 内核中,称为 NtSetLdtEntries。它没有标题。没有任何文档。存根位于 ntdll.lib 中,它不是 SDK 的一部分。你必须像我做的那样在逆向工程站点中摸索并手动绑定东西,直到我可以让它工作。

还有更糟的。您不能使用 GS,因为 Windows 在内部使用它;每当您进行系统调用时,它都会将其任意设置为 0(我认为它也可能在中断时将其随机设置为 0)。如果您尝试使用 GS 调试程序,Windows 会在断点处将其设置为 0!

ES 和 FS 都很好。我想。

这是我编写的一个未记录的文件,它使用了所有这些东西。如果你足够勇敢,你或许能够从中提取足够的信息来做一些有用的事情。祝你好运...

http://lbw.git.sourceforge.net/git/gitweb.cgi?p=lbw/lbw;a=blob;f=src/syscalls/thread.cc;hb=a3b44871bd89009e644894431cbc6534fe033369

【讨论】:

  • 是否可以在正在运行的线程上使用 NtSetLdtEntries?如果没有,我会假设 SetThreadContext 函数会更容易使用。
  • 我的软件目前运行在 16 位模式,我大量使用 GS。但程序在 XP 16 位窗口中运行时有时会崩溃。你认为同样的错误存在于 16 位模式中吗?
  • 不知道,TBH。我相信 XP 16 位模式是一个完整的虚拟化环境,这意味着所有的赌注都没有了。您可以尝试使用 windbg 单步执行您的代码,看看 GS 是否一直重置为 0。
  • ES 可能 没问题;它被rep stosrep movs 隐式使用,编译器或C 库有时内联已知大小的中小型memset 或memcpy。 (在某些情况下,GCC 曾经将 rep cmpsb 内联为短 strcmp,尽管它很慢,所以 GCC 不再这样做了。)
  • 在 32 位 x86 Windows 中,FS:0 应指向线程信息块 (TIB)。它没有记录,但被微软自己的 C RTL 广为人知和使用。如果突然没有,不确定 API 的哪些部分会中断。
猜你喜欢
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多