C语言在
unix
下可以通过直接覆写argv的方式隐藏参数,但是Golang的os.Args为string类型,无法直接覆盖,因此可以考虑使用unsafe.Pointer
配合uintptr
实现覆盖string的目的
以覆盖第三个参数为例,这种覆盖方式不会受到参数是否为ASCII的影响,覆盖后命令行将变成对应字节数个*
感谢@wdvxdr1123对本方法在
unsafe.Pointer
使用方面提出的建议,以下是已修正版本
p := *(*unsafe.Pointer)(unsafe.Pointer(&os.Args[position]))
for i := 0; i < len(os.Args[position]); i++ {
*(*uint8)(unsafe.Pointer(uintptr(p) + uintptr(i))) = '*'
}
此时利用ps
查看参数,已经实现覆盖。
go run test.go 1 2 飒飒 4 5
ps -ux
USER ...... COMMAND
fumiama ...... ....../test 1 2 ****** 4 5
......
直接使用
为方便起见,本方法已经封装成了package,使用也很简单,只需要像下面这样写即可,而且在windows
系统下也可实现隐藏,详见使用Go语言 在windows下 实现隐藏进程命令行参数 保护密码等数据
import para "github.com/fumiama/go-hide-param"
// This will hide os.Args[index]
para.Hide(index)