Windows和Linux下通过go实现自删除
自删除在攻防中都挺常见的,自写远控通常也有需要。可是在度娘里搜不到什么办法,于是就查查Windows api学习记录一回。

linux
先获得当前程序的文件名,再使用syscall这个包中的Unlink调用系统来删除一个目录或者文件的链接,链接没了也就删除完成了。
fileName, _ := os.Executable()
syscall.Unlink(fileName)
但更好的还是直接使用os的Remove,他已经封装好了syscall.Unlink,更加方便。
Windows
MoveFileExW
他接收三个参数:当前程序的文件名指针,0(表示不移动或重命名文件),和0x00000004(表示在下次启动时删除文件)。这里用字节数组来调用函数能规避静态检查,但为了方便后面的就直接用字符串了。
package main
import (
"fmt"
"os"
"syscall"
"unsafe"
)
const (
FILE_FLAG_DELETE_ON_CLOSE = 0x00000004
DELETE = 0x00010000
)
func SelfDelete() {
moveFileEx := syscall.NewLazyDLL(string([]byte{
'k', 'e', 'r', 'n', 'e', 'l', '3', '2', '.', 'd', 'l', 'l',
})).NewProc(string([]byte{
'M', 'o', 'v', 'e', 'F', 'i', 'l', 'e', 'E', 'x', 'W',
}))
fileName, _ := os.Executable()
fileNamePtr, _ := syscall.UTF16PtrFromString(fileName)
moveFileEx.Call(uintptr(unsafe.Pointer(fileNamePtr)), 0, FILE_FLAG_DELETE_ON_CLOSE)
}
func main() {
fmt.Println("Hello, world!")
SelfDelete()
}
CreateFileW
这个函数创建或打开一个文件的时候会返回一个句柄,如果在这个时候去指定FILE_FLAG_DELETE_ON_CLOSE标志位,那当这个句柄关闭时文件会被删除。如下使用:
func SelfDelete() {
kernel32 := syscall.NewLazyDLL("kernel32.dll")
createFile := kernel32.NewProc("CreateFileW")
closeHandle := kernel32.NewProc("CloseHandle")
fileName, _ := os.Executable()
fileNamePtr, _ := syscall.UTF16PtrFromString(fileName)
hFile, _, _ := createFile.Call(
uintptr(unsafe.Pointer(fileNamePtr)),
uintptr(syscall.GENERIC_READ|syscall.DELETE),
0,
0,
uintptr(syscall.OPEN_EXISTING),
uintptr(syscall.FILE_FLAG_DELETE_ON_CLOSE),
0,
)
closeHandle.Call(hFile)
}
DeleteFileW
这个函数就可以删除一个已存在的文件。类似于MoveFileExW函数,不过他是在文件的最后一个句柄关闭时删除文件。例如:
func SelfDelete() {
kernel32 := syscall.NewLazyDLL("kernel32.dll")
deleteFile := kernel32.NewProc("DeleteFileW")
fileName, _ := os.Executable()
fileNamePtr, _ := syscall.UTF16PtrFromString(fileName)
deleteFile.Call(uintptr(unsafe.Pointer(fileNamePtr)))
}
效果
按道理虚拟机环境中的一些其他因素影响会少很多,但是我试的时候,编译三个可执行文件,并以普通权限执行时重启之后都没有自删除,而当我用管理员权限去执行再重启的时候只有使用了MoveFileExW自删除了。不太清楚另外两种是为什么
Windows和Linux下通过go实现自删除的更多相关文章
- Windows、Linux下文件操作(写、删除)错误的产生原因、及解决方法
catalog . 引言 . Linux平台上涉及的File IO操作 . Windows平台上涉及的File IO操作 0. 引言 本文试图讨论在windows.linux操作系统上基于C库进行文件 ...
- Windows 和 Linux 下 禁止ping的方法
Windows 和Linux 下 禁止ping的方法 目的: 禁止网络上的其他主机或服务器ping自己的服务器 运行环境: Windows 03.08 linux 方法: Windows 03下: ...
- Windows与Linux下文件操作监控的实现
一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场 ...
- 怎样在Windows和Linux下写相同的代码
目前,Linux在国内受到了越来越多的业内人士和用户的青睐.相信在不久的将来,在国内为Linux开发 的应用软件将会有很大的增加(这不,金山正在招兵买马移植WPS呢).由于未来将会是Windows和L ...
- socket在windows下和linux下的区别
原文:socket在windows下和linux下的区别 1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h 错误处理:errno.h 2 ...
- windows和linux下关闭Tomcat进程
windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...
- HDP2.0.6+hadoop2.2.0+eclipse(windows和linux下)调试环境搭建
花了好几天,搭建好windows和linux下连接HDP集群的调试环境,在此记录一下 hadoop2.2.0的版本比hadoop0.x和hadoop1.x结构变化很大,没有eclipse-hadoop ...
- windows下的java项目打jar分别编写在windows与linux下运行的脚本( 本人亲测可用!)
前言: 最近公司做了一个工具,要将这个工具打包成一个可运行的程序,编写start.bat和start.sh在windows和linux下都可以运行. 在网上找了很多资料,最后终于找到一个可靠的资料,记 ...
- Windows和Linux下通用的线程接口
对于多线程开发,Linux下有pthread线程库,使用起来比较方便,而Windows没有,对于涉及到多线程的跨平台代码开发,会带来不便.这里参考网络上的一些文章,整理了在Windows和Linux下 ...
- windows和linux下杀死Tomcat进程,解决端口占用
windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...
随机推荐
- Microsoft Build 2021第二天
C++20 Ranges are complete in Visual Studio 2019 version 16.10 https://devblogs.microsoft.com/cppblog ...
- DevOps|研发效能团队组织架构和能力建设
研发效能团队相对于各个公司主营业务规模来说并不是很大,但是在经历的几家公司里主要是有两种组织架构,职能独立型组织架构和业务闭环型组织架构.本文主要讲解这两种组织架构的特点.优劣.劣势. 业务闭环组织架 ...
- xftp 7必须更新最新版本怎么解决
下载可以查看16进制的软件: Sublime Text 运行XFTP7 双击打开是:这样的 解决方案 用Sublime Text进行打开nslicense.dll, 打开之后查找"0f88 ...
- Django框架项目之搜索功能——搜索导航栏、搜索后台接口、搜索页面
文章目录 1-搜索导航栏 Header搜索组件:选择性CV router/index.js Header.vue 2-搜索后台接口 路由:course/urls.py 视图:course/views. ...
- Chapter 57. Multi-project Builds
http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects The po ...
- 区间检测(range)
区间检测(range) 时间限制: 1 Sec 内存限制: 128 MB 题目描述 给定一个长度为n的序列,进行m次检测,每次检测某个区间中,是否有重复的数. 输入 第一行,两个整数n和m,表示序列 ...
- CF1401C
题目简化和分析: 交换数组使其变为升序,满足交互的两数 \(a_i\) 与 \(a_j\),$ \min{a_i(1\le i\le n)}|\gcd(a_i,a_j)$ . 简单思维题,Div.2 ...
- React框架的基本运行原理与组件定义方式
React框架的基本运行原理 React的本质是内部维护了一套虚拟DOM树,这个虚拟DOM树就是一棵js对象树,它和真实DOM树是一致的,一一对应的. 当某一个组件的state发生修改时,就会生成一个 ...
- Windows没有足够信息,不能验证该证书",是因为该证书的颁发者
Windows没有足够信息,不能验证该证书",无法验证该证书的颁发者 解决方案之一: 1.win+R:打开运行 2.输入 gpedit.msc,确定,打开组策略 3.选择:计算机配置---管 ...
- LNOI 2023 游记
Day -1 持续性的精神状态不太好,分明睡觉起床时间都没变,但白天就是非常非常困,为什么呢. 补不动任何题,脑子完全不转...... Day 0 13:30 才被家长叫醒,四点左右到了开发区还是好困 ...