微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Go中使用NtCreateSection?

如何解决如何在Go中使用NtCreateSection?

我正在尝试学习如何在Go中使用某些Windows API调用,特别是一些较低级别的未记录功能。我正在遵循一个C ++示例here,并试图与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,uintptr(512),windows.PAGE_EXECUTE_READWRITE,SEC_COMMIT,)
    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 ++使用对HANDLE的引用,我认为它也称为PHANDLE。 Go似乎改用uintptr。任何帮助将不胜感激!

解决方法

您的问题是该部分的句柄和大小的function takes pointer arguments

这似乎可行:

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,uintptr(unsafe.Pointer(&size)),windows.PAGE_EXECUTE_READWRITE,SEC_COMMIT,)
    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())
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。