用于获取 TIB 地址的内联 __asm 代码 (fs:[0x18])
Inline __asm code for getting the address of TIB (fs:[0x18])
我想获取进程的 TIB,然后获取其 PEB 等等。我没有这样做是因为 __readfsdword(0x18)
函数有一些问题,所以如果可能的话,我想用 __asm
内联代码来完成。
该程序是为 x86 编译的,所以我认为这意味着 TIB 将位于 FS 寄存器的偏移量 0x18
处。在 x64 上它应该在 gs:[0x30]
.
我将如何实现这个内联汇编的想法?
编辑
NtCurrentTeb()
和 __readfsdword
给出了不同的 return 地址,所以我想获得尽可能低的级别来找出哪个发生故障。
__readfsdword
不工作的原因是因为我认为这些库彼此不兼容,所以我用更新的版本替换它们,现在它工作正常。
__readfsdword
/__readgsqword
是编译器内部函数,将生成更优化的代码,没有理由使用内联汇编。微软的 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
.
我想获取进程的 TIB,然后获取其 PEB 等等。我没有这样做是因为 __readfsdword(0x18)
函数有一些问题,所以如果可能的话,我想用 __asm
内联代码来完成。
该程序是为 x86 编译的,所以我认为这意味着 TIB 将位于 FS 寄存器的偏移量 0x18
处。在 x64 上它应该在 gs:[0x30]
.
我将如何实现这个内联汇编的想法?
编辑
NtCurrentTeb()
和 __readfsdword
给出了不同的 return 地址,所以我想获得尽可能低的级别来找出哪个发生故障。
__readfsdword
不工作的原因是因为我认为这些库彼此不兼容,所以我用更新的版本替换它们,现在它工作正常。
__readfsdword
/__readgsqword
是编译器内部函数,将生成更优化的代码,没有理由使用内联汇编。微软的 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
.