突然遇到这个奇怪的指令时,我正在对CRT库(特别是SEH序言)进行一些分解bnd ret。任何人都可以f2在c3(ret opcode)之前解释前缀的含义吗?
我正在开发一个Go库来访问一些内部Windows线程结构(线程环境块),这需要编写一些汇编代码.我一直试图理解为什么它适用于Win32 C++应用程序,但它不在我的Go库上.
这个Go汇编代码片段访问fs:[0x18]以返回指向线程关联TEB的指针:
// func ReadFsDword(offset uint32) (dword uint32)
TEXT ·ReadFsDword(SB),$0-8
MOVL offset+0(FP), AX
// mov eax, dword ptr fs:[eax]
BYTE $0x64; BYTE $0x8B; BYTE $0x00
MOVL AX, ret+8(FP)
RET
Run Code Online (Sandbox Code Playgroud)
这是等效的MASM代码,可以在MSVC上编译和运行:
void* readfsdword(unsigned offset_)
{
unsigned dw;
__asm {
mov eax, offset_
mov eax, fs:[eax]
mov dw, eax
}
return (void*)dw;
}
Run Code Online (Sandbox Code Playgroud)
当访问返回指向TEB的指针时,Go程序会发生混乱.这是我得到的信息:
panic:运行时错误:无效的内存地址或nil指针取消引用[signal 0xc0000005 code = 0x0 addr = 0x0 pc = 0x498d5b]
Go汇编代码似乎对我而言,但我无法理解该程序如何以及为何会引起恐慌.任何帮助深表感谢!
这是重现问题的示例:
intrinsics.s
#include "textflag.h"
#include "funcdata.h"
// func ReadFsDword(offset uint32) (ret …Run Code Online (Sandbox Code Playgroud)