首页 > 系统相关 >Windows和Linux下通过go实现自删除

Windows和Linux下通过go实现自删除

时间:2023-09-18 11:38:29浏览次数:37  
标签:kernel32 删除 Windows fileName syscall Linux go fileNamePtr DELETE

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

image-20230918110827370

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自删除了。不太清楚另外两种是为什么

标签:kernel32,删除,Windows,fileName,syscall,Linux,go,fileNamePtr,DELETE
From: https://www.cnblogs.com/bktown/p/17711400.html

相关文章

  • Google Chrome 自动更新 关闭
    更新日期:SatSep03202220:20:00GMT+0800,阅读量:10847请访问原文链接:如何禁用GoogleChrome自动更新(macOS,Linux,Windows),查看最新版。原创作品,转载请保留出处。作者主页:sysin.org禁用浏览器自动更新系列文章:如何禁用Firefox自动更新(macOS,Linux,Windows)......
  • Linux常用快捷键
    一、最常用快捷键Tab:快速补全命令;Ctrl+l:清屏,相当于执行clear命令;二、剪切、粘贴、删除快捷键Ctrl+h:删除光标左方位置的一个字符;Ctrl+d:删除光标位置的字符;Ctrl+u:删除(剪切)光标到行首之间的字符;Ctrl+k:删除(剪切)光标到行尾之间的字符;Ctrl+w:删除(剪切)从光标位置前到当前所处......
  • windows导出mysql(mysqldump)
      dump.batechooffclsecho正在初始化环境变量……echo.setbackup_date=%date:~0,4%%date:~5,2%%date:~8,2%setdb_name=db_testecho%backup_date%D:\mysql57\bin\mysqldump-hlocalhost-uudumpmonitor-pmysql-P13306%db_name%--default-character-set=ut......
  • 2023年了,复习了一下spring boot配置使用mongodb
    前言MongoDB是一个基于分布式文件存储的开源数据库系统,使用C++语言编写。它是一个介于关系数据库和非关系数据库之间的产品,具有类似关系数据库的功能,但又有一些非关系数据库的特点。MongoDB的数据模型比较松散,采用类似json的bson格式,可以灵活地存储各种类型的数据MongoDB的优......
  • MongoDB 中使用 explain 分析创建的索引是否合理
    MongoDB中如何使用explain分析查询计划前言查询计划explainexplain1、queryPlanner2、executionStats3、allPlansExecutionindexfilterStage参数说明参考MongoDB中如何使用explain分析查询计划前言创建完索引,如何分析索引的执行情况呢,MongoDB中同......
  • 每天一个linux命令(43):killall命令
    Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name)。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一,是一个很好用的命令。1.命令格式:killall[......
  • 每天一个linux命令(44)0:top命令
    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,to......
  • 每天一个linux命令(45):free 命令
    free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。在Linux系统监控的工具中,free命令是最经常使用的命令之一。1.命令格式:free [参数]2.命令功能:free 命令显示系统使用和空闲的内存情况,包括物理内存、交互区内存(swap)和内核缓冲区内存。......
  • 每天一个linux命令(46):vmstat命令
    vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。vmstat 工具提供了一种低开销的系统性能观察方式。因为 vmstat 本身就是低开销工具,在非常高负......
  • 每天一个linux命令(47):iostat命令
    Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。iostat属于s......