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
自删除了。不太清楚另外两种是为什么😥
本文作者:lockly
本文链接:https://www.cnblogs.com/bktown/p/17711400.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
Golang
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步