自删除在攻防中都挺常见的,自写远控通常也有需要。可是在度娘里搜不到什么办法,于是就查查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实现自删除的更多相关文章

  1. Windows、Linux下文件操作(写、删除)错误的产生原因、及解决方法

    catalog . 引言 . Linux平台上涉及的File IO操作 . Windows平台上涉及的File IO操作 0. 引言 本文试图讨论在windows.linux操作系统上基于C库进行文件 ...

  2. Windows 和  Linux 下 禁止ping的方法

    Windows 和Linux 下 禁止ping的方法 目的: 禁止网络上的其他主机或服务器ping自己的服务器 运行环境: Windows 03.08  linux 方法: Windows 03下: ...

  3. Windows与Linux下文件操作监控的实现

    一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场 ...

  4. 怎样在Windows和Linux下写相同的代码

    目前,Linux在国内受到了越来越多的业内人士和用户的青睐.相信在不久的将来,在国内为Linux开发 的应用软件将会有很大的增加(这不,金山正在招兵买马移植WPS呢).由于未来将会是Windows和L ...

  5. socket在windows下和linux下的区别

    原文:socket在windows下和linux下的区别 1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h    错误处理:errno.h 2 ...

  6. windows和linux下关闭Tomcat进程

    windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...

  7. HDP2.0.6+hadoop2.2.0+eclipse(windows和linux下)调试环境搭建

    花了好几天,搭建好windows和linux下连接HDP集群的调试环境,在此记录一下 hadoop2.2.0的版本比hadoop0.x和hadoop1.x结构变化很大,没有eclipse-hadoop ...

  8. windows下的java项目打jar分别编写在windows与linux下运行的脚本( 本人亲测可用!)

    前言: 最近公司做了一个工具,要将这个工具打包成一个可运行的程序,编写start.bat和start.sh在windows和linux下都可以运行. 在网上找了很多资料,最后终于找到一个可靠的资料,记 ...

  9. Windows和Linux下通用的线程接口

    对于多线程开发,Linux下有pthread线程库,使用起来比较方便,而Windows没有,对于涉及到多线程的跨平台代码开发,会带来不便.这里参考网络上的一些文章,整理了在Windows和Linux下 ...

  10. windows和linux下杀死Tomcat进程,解决端口占用

    windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...

随机推荐

  1. Ionic 整合 pixi.js

    最近做了个app,上线google play不大顺利,说是有假冒行为,然后改了下icon和名字以及描述,但是没啥信息去上,于是暂时放下搞点别的. 因为近期看到个比较有趣的绘图创意, 于是想通过ioni ...

  2. 「codeforces - 185D」Visit of the Great

    link. 简单提一下做法,注意到 \(k^{2^a}\equiv k^{2^b}\equiv-1\equiv (-1)^{2^{b-a}}=1\pmod{(k^{2^a}+1,k^{2^{b}}+1 ...

  3. 算法2:寻找吸血鬼数(JS)

    任务二:寻找吸血鬼数 打印所有4位吸血鬼数和它们的獠牙   提示:一共有7个: 吸血鬼数: -该鬼的位数为偶数: -该数的所有位中.是0的位少一半: -该数每一位上的数字重新组合为两个位数相等的数,乘 ...

  4. Welcome to the Android Open Source Project!

    Android is an open-source software stack for a wide range of mobile devices and a corresponding open ...

  5. mybtis-plus 出现 Wrong namespace

    今天进行项目整合,刚开始代码搬的还挺快乐的,但是到后面调试起来,头晕眼花的.记录一个基本的错误. Cause: org.apache.ibatis.builder.BuilderException:  ...

  6. [Python急救站课程]Python集成环境IDEA:Pycham专业版2023.2.3安装与破解方法

    今天给大家带来了我们的第一课内容,Pycharm专业版2023.2.3安装并破解 首先,在浏览器中搜索Pycharm即可进入官网下载:https://www.jetbrains.com/pycharm ...

  7. JavaScript 简介与引用

    作者:WangMin 格言:努力做好自己喜欢的每一件事 我们通常写好的HTML网页是处于一个静态的效果,在用户体验这一方面就不是很好,给人一种死板的感觉.这里我们就可以用到JavaScript来为网页 ...

  8. 高精度减法(C语言实现)

    高精度减法(C语言实现) 介绍 众所周知,整数在C和C++中以int ,long,long long三种不同大小的数据存储,数据大小最大可达2^64,但是在实际使用中,我们仍不可避免的会遇到爆long ...

  9. Golang面试题从浅入深高频必刷「2023版」

    大家好,我是阳哥.专注Go语言的学习经验分享和就业辅导. Go语言特点 Go语言相比C++/Java等语言是优雅且简洁的,是我最喜爱的编程语言之一,它既保留了C++的高性能,又可以像Java,Pyth ...

  10. 一个java文件的JVM之旅

    准备 我是小C同学编写得一个java文件,如何实现我的功能呢?需要去JVM(Java Virtual Machine)这个地方旅行. 变身 我高高兴兴的来到JVM,想要开始JVM之旅,它确说:&quo ...