自删除在攻防中都挺常见的,自写远控通常也有需要。可是在度娘里搜不到什么办法,于是就查查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. Go之流程控制大全: 细节、示例与最佳实践

    本文深入探讨Go语言中的流程控制语法,包括基本的if-else条件分支.for循环.switch-case多条件分支,以及与特定数据类型相关的流程控制,如for-range循环和type-switch ...

  2. 【RocketMQ】顺序消息实现总结

    全局有序 在RocketMQ中,如果使消息全局有序,可以为Topic设置一个消息队列,使用一个生产者单线程发送数据,消费者端也使用单线程进行消费,从而保证消息的全局有序,但是这种方式效率低,一般不使用 ...

  3. Spring-Boot-Starter 学习笔记(1)

    Spring-Boot-Starter 1. 准备配置类和 Bean 对象 Spring Boot 提供了两个注解: @Configuration:Spring 提供的配置类注解,作用在类上,代表整个 ...

  4. LINUX线程之一次性初始化(PTHREAD_ONCE)

    1.一次性初始化 在 Linux函数列表 中描述了Linux线程中的常用函数,这里详细讲解 pthread_once 函数的功能和使用. (1)为何有"一次性初始化概念"出现? 其 ...

  5. Dubbo3应用开发—Dubbo服务管理平台DubboAdmin介绍、安装、测试

    Dubbo服务管理平台 DubboAdmin的介绍 Dubbo Admin是Apache Dubbo服务治理和管理系统的一部分. Dubbo Admin提供了一套用于服务治理的Web界面,让我们可以更 ...

  6. PostgreSQL学习笔记-6.基础知识:ALTER、TRUNCATE 、View(视图)、TRANSACTION 事务、LOCK 锁

    ALTER TABLE 命令 在 PostgreSQL 中,ALTER TABLE 命令用于添加,修改,删除一张已经存在表的列. 另外你也可以用 ALTER TABLE 命令添加和删除约束. 语法 用 ...

  7. TIM-有感BLDC转速解析

    TIM-有感BLDC转速解析 1.基本概念解析 霍尔传感器的原理:通电线圈产生的磁场会使得转子所在位置会产生磁场,其中离得最近的霍尔传感器的磁场最强,进而导致最近霍尔传感器会产生最大的电压信号,这个最 ...

  8. CDQ分治和三维偏序

    专题:CDQ 分治 本页面将完整介绍 CDQ 分治. 简介 CDQ 分治是一种思想而不是具体的算法,与动态规划类似.目前这个思想的拓展十分广泛,依原理与写法的不同,大致分为三类: 解决和点对有关的问题 ...

  9. Kubernetes:kube-apiserver 之启动流程(一)

    0. 前言 前面两篇文章 Kubernetes:kube-apiserver 之 scheme(一) 和 Kubernetes:kube-apiserver 之 scheme(二) 重点介绍了 kub ...

  10. JUC并发编程学习笔记(八)读写锁

    读写锁 ReadWriteLock ReadWriteLock只存在一个实现类那就是ReentrantReadWriteLock,他可以对锁实现更加细粒化的控制 读的时候可以有多个阅读器线程同时参与, ...