如何解决如何在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(§ion)),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 举报,一经查实,本站将立刻删除。