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

自删除在攻防中都挺常见的,自写远控通常也有需要。可是在度娘里搜不到什么办法,于是就查查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自删除了。不太清楚另外两种是为什么😥

posted @ 2023-09-18 11:16  lockly  阅读(296)  评论(0编辑  收藏  举报