gpt4 book ai didi

windows - Go 程序在访问线程环境 block 时出现 panic

转载 作者:IT王子 更新时间:2023-10-29 01:26:00 25 4
gpt4 key购买 nike

我正在开发一个 Go 库来访问一些内部 Windows 线程结构(线程环境 block ),这需要编写一些汇编代码。我一直在试图理解为什么这适用于 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

这是等效的 MASM 代码,它在 MSVC 上编译和运行得很好:

void* readfsdword(unsigned offset_)
{
unsigned dw;

__asm {
mov eax, offset_
mov eax, fs:[eax]
mov dw, eax
}

return (void*)dw;
}

Go 程序在访问返回的指向 TEB 的指针时发生困惑。这是我收到的消息:

panic: runtime error: invalid memory address or nil pointer dereference [signal 0xc0000005 code=0x0 addr=0x0 pc=0x498d5b]

Go 汇编代码对我来说似乎是正确的,但我不明白程序是如何以及为什么会崩溃的。非常感谢任何帮助!

这是重现问题的示例:

intrinsics.s

#include "textflag.h"
#include "funcdata.h"

// func ReadFsDword(offset uint32) (ret 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

intrinsics.go

package nt

func ReadFsDword(offset uint32) (ret uint32)

test.go

package main

import "nt"

func main() {
GetProcAddress("LoadLibraryExW")
}

func GetProcAddress(proc string) unsafe.Pointer {
teb := nt.NtGetTeb()
fmt.Printf("%p", teb)

// todo: implement
return nil
}

最佳答案

问题已解决。显然,Windows 在 x64 上使用偏移量为 0x30 的 gs 寄存器,而在 x86/WoW64 模式下使用 fs 和偏移量 0x18。解决方案是根据 GOARCH 的值使用具有相应偏移量的 fsgs

关于windows - Go 程序在访问线程环境 block 时出现 panic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51639548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com