winapi - 用于获取 TIB 地址的内联 __asm 代码 (fs:[0x18])
问题描述
我想得到一个进程的TIB,然后得到它的PEB等等。我没有这样做,因为我对__readfsdword(0x18)
函数有一些问题,所以如果可能的话,我想用__asm
内联代码来做。该程序是为 x86 编译的,所以我认为这意味着 TIB 将位于0x18
FS 寄存器的偏移量处。在 x64 上它应该是 on gs:[0x30]
。
我将如何实现这个内联汇编的想法?
编辑
NtCurrentTeb()
并__readfsdword
给出了不同的返回地址,所以我想尽可能低地找出哪一个出现故障。不工作的原因__readfsdword
是因为我认为这些库彼此不兼容,所以我用更新的版本替换了它们,现在它可以正常工作了。
解决方案
__readfsdword
/__readgsqword
是编译器内部函数,它们将生成更优化的代码,没有理由使用内联汇编。Microsoft 的 64 位目标编译器甚至不支持内联汇编。
#include <intrin.h>
__declspec(naked) void* __stdcall GetTEB()
{
__asm mov eax, dword ptr fs:[0x18] ;
__asm ret ;
}
...
void *teb;
__asm push eax ;
__asm mov eax, dword ptr fs:[0x18] ;
__asm mov teb, eax ;
__asm pop eax ;
printf("%p == %p == %p\n", GetTEB(), teb, __readfsdword(0x18));
正如评论中所建议的,NtCurrentTeb()由 Windows SDK 提供。它很可能只是使用__readfsdword
.
推荐阅读
- javascript - 在 Javascript 中使用异步结果的最简洁方法
- reactjs - 如何在 ReactJS 中创建搜索字段
- database - 数据库中被视为数据重复的限制在哪里?
- python - 当我在终端运行 python3.6 时,它给了我“SyntaxError: invalid syntax”
- c# - 对多个对象使用相同的处理程序 WPF C#
- android - 设置适配器在改造 2 回调方法中给出空异常?
- python - 从另一个执行脚本时未导入 Jinja
- bash - 消除行首同时包含 + 和 - 字符的所有文本内容
- google-chrome - 为 Android Mobile 构建 PWA 应用程序
- java - 无法获取 getText()