JMP FAR 的用法不明确
在《Rootkits: Subverting the Windows Kernel》一书第 5 章:运行时修补第 120-125 页(Greg Hoglund,James Butler,2006)中,
他说 JMP FAR 0x08:0xAAAAAAAA
将跳转到 0xAAAAAAAA
但是,Wiki 说 0x08:0xAAAAAAAA = (0x08 * 0x10) + 0xAAAAAAAA
这是真的。
In the Book Rootkits: Subverting the Windows Kernel Chapter 5: Runtime Patching Page 120-125 (Greg Hoglund, James Butler, 2006)
he says thatJMP FAR 0x08:0xAAAAAAAA
will jump to 0xAAAAAAAA
but, Wiki says0x08:0xAAAAAAAA = (0x08 * 0x10) + 0xAAAAAAAA
what's true.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在保护模式下,选择器值(示例中地址的段部分)不使用“移位 4”计算。相反,该值用作本地或全局描述符表的索引,并使用表中的基地址。
链接的代码似乎是为 Windows 编写的。 Windows 使用简单的平面内存模型,其中大多数选择器以 0 为基数映射整个 4BG 地址空间。这就是为什么选择器 8 将映射到 0,并且跳转将(尝试)转到地址 0xAAAAAAAA。
我不确定使用远跳的意义是什么,我认为正常的跳跃(无需重新加载选择器)也可以。
In protected mode, the selector values (the segment part of the address in your example) do not use the "shift by 4" calculation. Instead, the value is used as an index into the Local or Global descriptor table, and the base address from the table is used.
The linked code seems to be made for Windows. Windows uses a simple, flat memory model, where most selectors map the whole 4BG address space with the base of 0. That's why the selector 8 will map to 0 and the jump will (try to) go to the address 0xAAAAAAAA.
I'm not sure what's the point of using a far jump, I think a normal jump (without reloading the selector) would work just as well.