内联__asm代码,用于获取TIB的地址(fs:[0x18])

时间:2019-08-17 17:24:12

标签: winapi visual-c++ x86 inline-assembly cpu-registers

我想获取流程的TIB,然后获取其PEB,依此类推。我之所以没有这样做,是因为我在__readfsdword(0x18)函数中遇到了一些问题,因此,如果可能的话,我想使用__asm内联代码来完成它。 该程序是针对x86编译的,因此我认为这意味着TIB将位于FS寄存器的偏移量0x18处。在x64上,它应该在gs:[0x30]上。

我将如何实现这种内联汇编想法?

编辑

NtCurrentTeb()__readfsdword给出了不同的寄信人地址,所以我想尽可能地降低底层地址,以找出哪个发生了故障。 __readfsdword不起作用的原因是因为我认为这些库彼此不兼容,所以我用更新的版本替换了它们,现在它可以正常工作。

1 个答案:

答案 0 :(得分:2)

__readfsdword / __readgsqword是编译器的内在函数,将生成更多优化的代码,因此无需使用内联汇编。对于64位目标,Microsoft编译器甚至不支持内联汇编。

#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