AsmLdr 是一款使用 x64 汇编语言实现的高级 shellcode 加载器,专为 Windows x64 环境设计。其主要目的是执行加密的有效载荷,同时最大限度降低被高级防病毒软件、端点检测与响应(EDR)系统、沙箱和调试器检测到的风险。它通过在运行时动态解析模块、API 和系统调用来实现这一点,从而消除导入表或硬编码地址等静态依赖。这种方法可生成紧凑且检测特征极低的二进制文件。
该加载器使用模块踩踏(module stomping)技术将 shellcode 放入现有 DLL 的可执行节中,在内存中解密有效载荷,并通过带栈欺骗的间接系统调用执行。它包含多项规避功能,例如反调试措施、为模拟正常应用程序模式而进行的时间调整,以及绕过 Windows 事件跟踪(ETW)。这些能力使其成为红队作战和安全研究的工具。 道德免责声明:本项目仅用于教育和研究目的。它演示了 Windows 底层内部机制,包括 PEB 遍历、导出表解析、系统调用解除挂钩(syscall unhooking)和内存保护操作。请在受控环境(例如虚拟机)中使用。将其滥用于恶意活动是非法且不道德的。作者对任何滥用行为不承担任何责任。
AsmLdr 提供了一系列用于隐蔽执行有效载荷和规避检测的功能。以下逐项介绍,重点说明其功能与优势:
通过 PEB 遍历解析模块:加载器沿 PEB 的模块链枚举正在运行的模块。它通过 Unicode 比较来匹配模块名称,从而找到并返回目标 DLL 的基址。此方法绕过了标准加载函数,降低了被拦截的风险。
从导出表解析 API:加载器检查 DLL 的导出目录以定位函数。它使用哈希匹配 API,或可选择使用带长度校验的直接名称检查,以防止相似函数名之间产生混淆。这样无需依赖预链接的导入即可获得函数地址。
反调试保护:加载器通过多重检查检测调试行为,若任何一项检查表明正在被分析,则干净退出。
生成垃圾代码以抵抗分析:加载器执行一系列非必要操作,在反汇编中制造令人困惑的模式,使静态分析更加困难,同时不影响运行时效率。
时序与行为正常化:加载器测量系统速度,以运行与正常应用程序模式相匹配的模拟工作负载,帮助其融入合法进程。它还会在关键操作前短暂暂停,以使执行时序正常化。
绕过 ETW 日志记录:加载器在 ETW 日志记录 API 上设置硬件断点,以拦截并跳过事件日志调用,防止在系统日志中留下痕迹。
多层解除挂钩:加载器通过直接检查函数来动态获取有效的系统调用号(SSN);若函数被挂钩,则扫描附近代码;或统计 ntdll 中的模式以估算编号,并针对已知例外进行调整。
使用的技术:
间接系统调用与栈欺骗:加载器在 ntdll 中查找干净的系统调用代码路径,并链式执行多达 32 个操作,隐藏调用栈以规避跟踪。完成后恢复原始状态。
DLL 镂空(DLL Hollowing):加载器载入目标 DLL,临时允许写入其代码节,插入加密的 shellcode,对其进行解密,然后将保护重置为仅可执行。
内存中解密:加载器直接在注入的内存中应用循环密钥模式来解密 shellcode。
工具函数:加载器包含用于测量字符串长度、比较字符串(标准或宽字符)、对名称进行哈希以用于查找、验证内存指针,以及读取时间戳以进行时序控制等工具。
Python 脚本 generate.py 对原始 shellcode 文件进行加密。它会添加填充以进行对齐,创建或使用一个密钥,并以循环方式将每个字节与密钥进行 XOR 运算。输出文件 shellcode.asm 定义了大小、加密数据和密钥的数组,以及一个在运行时加载数据的例程。加载器的内存解密过程与此流程相匹配。请注意,密钥越长,等待时间越长。
准备一个原始 shellcode 二进制文件(例如 payload.bin)。运行 python generate.py payload.bin [optional_key] 以生成 shellcode.asm。
修改 szDllName(evader.asm 中的 Unicode 十六进制字)以使用其他 DLL,例如 urlmon.dll。使用 str_hash 逻辑为新 API 重新计算 DJB2 哈希。注释掉宏(例如 KILL_DEBUGGERS)以进行调试。
AsmLdr 针对 Windows 10 和 11 x64 进行了优化;内核更新可能会更改偏移量(例如 PEB+0x18)或 NTDLL 模式(例如 0xb8d18b4c),因此需要验证。错误处理依赖 NTSTATUS 返回值(例如 <0 表示失败),没有内置日志。垃圾和虚假操作会消耗 CPU 周期,在资源受限的系统上可能引起资源监视器的警觉。请仅在受控环境中使用。