为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中使用 NtCreateSection?

如何在 Go 中使用 NtCreateSection?

Go
Cats萌萌 2022-07-04 16:44:54
我正在尝试学习如何在 Go 中使用一些 Windows API 调用,特别是一些较低级别的、未记录的函数。我在这里关注一个 C++ 示例并尝试跟随 Go。下面是我正在尝试做的输出和精简示例:c0000005:操作成功完成。package mainimport (    "fmt"    "golang.org/x/sys/windows")// Why are these not defined in the windows pkg?!const SEC_COMMIT = 0x08000000const SECTION_WRITE = 0x2const SECTION_READ = 0x4const SECTION_EXECUTE = 0x8const SECTION_RWX = SECTION_WRITE | SECTION_READ | SECTION_EXECUTEfunc createSection() error {    var e error    var err uintptr    var ntdll *windows.LazyDLL    var section uintptr    // Load DLL    ntdll = windows.NewLazySystemDLL("ntdll")    // FIXME Allocate section    err, _, e = ntdll.NewProc("NtCreateSection").Call(        section,        SECTION_RWX,        0,        uintptr(512),        windows.PAGE_EXECUTE_READWRITE,        SEC_COMMIT,        0,    )    if err != 0 {        return fmt.Errorf("%0x: %s", uint32(err), e.Error())    } else if section == 0 {        return fmt.Errorf("NtCreateSection failed for unknown reason")    }    fmt.Printf("%0x\n", section)    return nil}func main() {    var e error    if e = createSection(); e != nil {        fmt.Println(e.Error())    }}据我所知,c0000005这是一个Access Violation错误。C++ 中的相同代码似乎可以工作(参见链接博客中的第 25 行),但是数据类型略有不同。可能我使用var section uintptr不当。C++ 使用对 a 的引用HANDLE,我认为它也称为PHANDLE. 围棋似乎改为使用uintptr。任何帮助将不胜感激!
查看完整描述

1 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

您的问题是该函数采用节句柄和大小的指针参数。


这似乎有效:


package main


import (

    "fmt"

    "unsafe"


    "golang.org/x/sys/windows"

)


// Why are these not defined in the windows pkg?!

const SEC_COMMIT = 0x8000000

const SECTION_WRITE = 0x2

const SECTION_READ = 0x4

const SECTION_EXECUTE = 0x8

const SECTION_RWX = SECTION_WRITE | SECTION_READ | SECTION_EXECUTE


func createSection() error {

    var e error

    var err uintptr

    var ntdll *windows.LazyDLL

    var section uintptr


    // Load DLL

    ntdll = windows.NewLazySystemDLL("ntdll")

    size := int64(4096)

    // FIXME Allocate section

    err, _, e = ntdll.NewProc("NtCreateSection").Call(

        uintptr(unsafe.Pointer(&section)),

        SECTION_RWX,

        0,

        uintptr(unsafe.Pointer(&size)),

        windows.PAGE_EXECUTE_READWRITE,

        SEC_COMMIT,

        0,

    )

    if err != 0 {

        return fmt.Errorf("%0x: %s", uint32(err), e.Error())

    } else if section == 0 {

        return fmt.Errorf("NtCreateSection failed for unknown reason")

    }

    fmt.Printf("%0x\n", section)


    return nil

}


func main() {

    var e error


    if e = createSection(); e != nil {

        fmt.Println(e.Error())

    }

}


查看完整回答
反对 回复 2022-07-04
  • 1 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信