小编NTA*_*ity的帖子

BND RET在x86中的含义

突然遇到这个奇怪的指令时,我正在对CRT库(特别是SEH序言)进行一些分解bnd ret。任何人都可以f2c3(ret opcode)之前解释前缀的含义吗?

x86 assembly return opcode disassembly

7
推荐指数
1
解决办法
1611
查看次数

访问线程环境块时,程序会发生混乱

我正在开发一个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)

windows assembly go

2
推荐指数
1
解决办法
90
查看次数

标签 统计

assembly ×2

disassembly ×1

go ×1

opcode ×1

return ×1

windows ×1

x86 ×1