如何在 Go 中使用 NtCreateSection?

我正在尝试学习如何在 Go 中使用一些 Windows API 调用,特别是一些较低级别的、未记录的函数。我在这里关注一个 C++ 示例并尝试跟随 Go。下面是我正在尝试做的输出和精简示例:


c0000005:操作成功完成。


package main


import (

    "fmt"


    "golang.org/x/sys/windows"

)


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

const SEC_COMMIT = 0x08000000

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")


    // 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。任何帮助将不胜感激!


Cats萌萌
浏览 179回答 1
1回答

沧海一幻觉

您的问题是该函数采用节句柄和大小的指针参数。这似乎有效:package mainimport (    "fmt"    "unsafe"    "golang.org/x/sys/windows")// Why are these not defined in the windows pkg?!const SEC_COMMIT = 0x8000000const 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")    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())    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go