agentic-awesome-skills 反逆向技术 Skill 深度解析:授权安全边界、反调试/反虚拟机检测与脱壳实战方法论【免费下载链接】agentic-awesome-skillsAAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600+ agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.项目地址: https://gitcode.com/GitHub_Trending/an/agentic-awesome-skills本指南围绕 agentic-awesome-skills 开源仓库中anti-reversing-techniques(反逆向技术)技能展开,完整继承其 SKILL.md 的元数据、授权门槛与操作规范,并以其引用的 implementation-playbook.md 为技术主干,系统梳理 Windows/Linux 反调试、反虚拟机检测、代码混淆、加壳脱壳、代码虚拟化等对抗维度的检测原理、绕过思路与对应工具链。读完本文,你将掌握:在明确授权前提下识别二进制保护机制的能力、对常见反调试与反虚拟机检测点的定位方法、控制流平坦化与不透明谓词的还原思路、以及从加壳样本中定位 OEP 并修复导入表的完整脱壳流程,同时理解 AAS(Agentic Awesome Skills)体系中 offensive 类技能被设计为“授权门控 + 防御导向”的合规使用范式。一、技能定位:AAS 生态中的 offensive 类安全技能在 agentic-awesome-skills 仓库中,anti-reversing-techniques属于风险等级标记为risk: offensive的双用途(dual-use)安全技能。其 SKILL.md 以标准 AAS Skill 格式组织,frontmatter 元数据如下:--- name: anti-reversing-techniques description: "AUTHORIZED USE ONLY: This skill contains dual-use security techniques. Before proceeding with any bypass or analysis: > 1." risk: offensive source: community date_added: "2026-02-27" ---各字段含义:字段值说明nameanti-reversing-techniques技能唯一标识,即仓库中对应的目录名descriptionAUTHORIZED USE ONLY: ...面向 Agent 的触发描述,第一语义即强调“仅限授权使用”,避免被误触发riskoffensiveAAS 风险分级体系中的进攻性等级,表示该技能包含可被用于攻击的对抗性技术,需要额外授权门控sourcecommunity技能来源为社区贡献date_added2026-02-27收录日期,便于目录审计与变更追踪该技能在仓库中存在于多处分发副本:主 skills 目录、plugins/agentic-awesome-skills 以及 plugins/agentic-awesome-skills-claude。其中 Claude 插件副本额外携带完整的resources/implementation-playbook.md技术手册,是本文技术内容的主要依据。这种“SKILL.md 声明边界 + resources 承载技术细节”的结构,正是 AAS 技能仓库的典型组织方式:Agent 通过轻量 SKILL.md 决定是否激活技能,再按需加载深度 playbook。二、不可逾越的授权门槛(Mandatory Confirmation Gate)这是本技能区别于普通逆向知识文档的核心特征:任何绕过、探测、修改、持久化、数据提取或凭据访问行为,都必须先通过强制确认门(Mandatory Confirmation Gate)。SKILL.md 规定的四步确认流程:明确目标:让用户陈述确切的攻击目标——URL、IP、账户或具体资源;确认授权:让用户确认书面授权与允许的范围(scope);展示命令:展示将要执行的确切命令并解释其预期效果;等待确认:在当前对话中等待用户的明确确认。未获确认时,技能必须保持只读状态,仅提供防御性指导,并优先建议在沙箱、一次性虚拟机或受控实验环境(controlled lab)中操作。同时,技能要求验证授权时确认用户属于以下合法情境之一:软件所有者的书面许可、CTF 竞赛、授权渗透测试、恶意软件分析或安全研究;并提醒未经授权绕过软件保护可能触犯 CFAA(美国计算机欺诈与滥用法)、DMCA 反规避条款等法律。从设计角度看,这一门槛与仓库的安全治理文档体系一脉相承。AAS 仓库中的安全治理文档(如 SECURITY_GUARDRAILS.md)普遍采用“先声明授权、再给出技术”的编排,将合规审查前置到技能激活阶段,使 Agent 在进入技术细节前就完成合法性确认。三、适用场景与禁用场景:Agent 的触发决策依据SKILL.md 明确划定了技能的使用边界,Agent 应据此决定是否激活本技能。适用场景(Use this skill when):在明确授权下分析受保护二进制(Analyzing protected binaries with explicit authorization);在范围内开展恶意软件分析或安全研究(Conducting malware analysis or security research in scope);参与 CTF 或经批准的训练演练(Participating in CTFs or approved training exercises);为防御目的理解反调试或混淆技术(Understanding anti-debugging or obfuscation techniques for defense)。禁用场景(Do not use this skill when):缺乏书面授权或未定义明确范围(You lack written authorization or a defined scope);目标是出于盗版或滥用目的绕过保护(The goal is to bypass protections for piracy or misuse);法律或政策限制禁止此类分析(Legal or policy restrictions prohibit analysis)。这四个“适用”与三个“禁用”条件共同构成 Agent 的决策过滤器:只有任务同时满足“有授权、有范围、有合法目的”三个条件时,才允许进入技术执行阶段;任一条件不满足,则退回只读的防御性建议模式。四、执行指令与安全规范(Instructions & Safety)当授权确认完成,技能按以下四步指令推进分析任务:确认授权、范围与法律约束(Confirm written authorization, scope, and legal constraints)——不是一次性的,而是在每个敏感操作前重申;识别保护机制并选择安全的分析方法(Identify protection mechanisms and choose safe analysis methods)——先分类(反调试/反 VM/混淆/加壳/虚拟化),再匹配对应分析策略;记录发现,避免不必要地修改样本(Document findings and avoid modifying artifacts unnecessarily)——保持证据原始性,分析过程中的补丁尽量打在内存或副本上;提供防御性建议与缓解指导(Provide defensive recommendations and mitigation guidance)——分析的最终输出应落回防御视角,反哺防护设计。安全规范(Safety)包含两条硬性要求:不得在授权语境之外分享绕过步骤;在恶意软件分析场景下保全证据并维持证据链(chain-of-custody)。后者直接对应数字取证的基本要求——任何对样本的改动都必须被记录,确保后续司法或合规审查时证据可追溯。技能还声明了明确的局限性(Limitations):仅在任务与上述范围清晰匹配时使用;输出不能替代环境特定的验证、测试或专家评审;当所需输入、权限、安全边界或成功标准缺失时,应停止并请求澄清。这要求 Agent 将本技能视为分析辅助而非结论本身。五、反调试技术(Anti-Debugging Techniques)implementation-playbook.md 是技术细节的主体,其核心主题是:理解授权软件分析、安全研究与恶意软件分析中遇到的保护机制,帮助分析人员绕过保护以完成合法分析任务。反调试是样本最常用的第一道防线。5.1 Windows API 级检测程序通过调用 Windows 调试相关 API 探测自身是否处于调试器之下:// IsDebuggerPresent if (IsDebuggerPresent()) { exit(1); } // CheckRemoteDebuggerPresent BOOL debugged = FALSE; CheckRemoteDebuggerPresent(GetCurrentProcess(), &debugged); if (debugged) exit(1); // NtQueryInformationProcess - ProcessDebugPort (class 7) typedef NTSTATUS (NTAPI *pNtQueryInformationProcess)( HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG); DWORD debugPort = 0; NtQueryInformationProcess( GetCurrentProcess(), ProcessDebugPort, // 7 &debugPort, sizeof(debugPort), NULL ); if (debugPort != 0) exit(1); // Debug flags - ProcessDebugFlags (0x1F) DWORD debugFlags = 0; NtQueryInformationProcess( GetCurrentProcess(), ProcessDebugFlags, // 0x1F &debugFlags, sizeof(debugFlags), NULL ); if (debugFlags == 0) exit(1); // 0 means being debugged原理要点:IsDebuggerPresent()是最高层的封装,实际读取 PEB 的BeingDebugged标志,最容易被挂钩或补丁绕过;CheckRemoteDebuggerPresent可检测本地或远程调试器;NtQueryInformationProcess是更底层的原生 API:ProcessDebugPort(类号 7)在被调试时返回非零端口;ProcessDebugFlags(类号 0x1F)返回 0 表示处于调试状态。因为它是未文档化的原生 API,样本常直接调用它来规避对 Win32 API 的挂钩。绕过思路(Bypass Approaches):使用 x64dbg 的 ScyllaHide 插件自动处理常见反调试检查;手工补丁:将IsDebuggerPresent的返回值改为 0、将PEB.BeingDebugged清零、挂钩NtQueryInformationProcess;IDAPython 脚本化补丁,将检查指令 NOP 掉:# IDAPython: Patch checks ida_bytes.patch_byte(check_addr, 0x90) # NOP5.2 PEB 结构级检测许多样本不依赖 API,直接读取进程环境块(PEB)中的调试标志,这类检测对 API 挂钩免疫:// Direct PEB access #ifdef _WIN64 PPEB peb = (PPEB)__readgsqword(0x60); #else PPEB peb = (PPEB)__readfsdword(0x30); #endif // BeingDebugged flag if (peb->BeingDebugged) exit(1); // NtGlobalFlag // Debugged: 0x70 (FLG_HEAP_ENABLE_TAIL_CHECK | // FLG_HEAP_ENABLE_FREE_CHECK | // FLG_HEAP_VALIDATE_PARAMETERS) if (peb->NtGlobalFlag & 0x70) exit(1); // Heap flags PDWORD heapFlags = (PDWORD)((PBYTE)peb->ProcessHeap + 0x70); if (*heapFlags & 0x50000062) exit(1);关键偏移速查:x64 下 PEB 位于gs:[0x60],x86 下位于fs:[0x30];BeingDebugged位于 PEB 偏移 2;NtGlobalFlag在 x64 下位于偏移 0xBC,正常值为 0,被调试时常为 0x70(同时置位堆尾检查、空闲块检查、参数校验三个标志);堆标志检查读取ProcessHeap偏移 0x70 处的Flags/ForceFlags(掩码 0x50000062)。绕过思路:; In debugger, modify PEB directly ; x64dbg: dump at gs:[60] (x64) or fs:[30] (x86) ; Set BeingDebugged (offset 2) to 0 ; Clear NtGlobalFlag (offset 0xBC for x64)5.3 时序检测(Timing-Based)调试器单步执行会显著拖慢程序运行,样本通过测量代码段执行耗时来间接推断是否被调试:// RDTSC timing uint64_t start = __rdtsc(); // ... some code ... uint64_t end = __rdtsc(); if ((end - start) > THRESHOLD) exit(1); // QueryPerformanceCounter LARGE_INTEGER start, end, freq; QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&start); // ... code ... QueryPerformanceCounter(&end); double elapsed = (double)(end.QuadPart - start.QuadPart) / freq.QuadPart; if (elapsed > 0.1) exit(1); // Too slow = debugger // GetTickCount DWORD start = GetTickCount(); // ... code ... if (GetTickCount() - start > 1000) exit(1);绕过思路:优先使用硬件断点(hardware breakpoints)而非软件断点(INT3),减少时序扰动;直接补丁时序检查阈值;使用可控制时间的虚拟机环境;挂钩时序 API(如QueryPerformanceCounter、GetTickCount),返回一致性数值。5.4 异常机制检测(Exception-Based)样本利用调试器会“吞掉”异常这一行为特征来反调试。SEH(结构化异常处理)方案:正常运行时int 3产生的异常被自身异常处理器捕获,若异常被调试器截获则程序流不经过处理器,从而判定被调试:// SEH-based detection __try { __asm { int 3 } // Software breakpoint } __except(EXCEPTION_EXECUTE_HANDLER) { // Normal execution: exception caught return; } // Debugger ate the exception exit(1);VEH(向量化异常处理)方案则主动处理断点异常并恢复执行:// VEH-based detection LONG CALLBACK VectoredHandler(PEXCEPTION_POINTERS ep) { if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT) { ep->ContextRecord->Rip++; // Skip INT3 return EXCEPTION_CONTINUE_EXECUTION; } return EXCEPTION_CONTINUE_SEARCH; }5.5 Linux 反调试Linux 平台的检测手法以ptrace体系为核心:// ptrace self-trace if (ptrace(PTRACE_TRACEME, 0, NULL, NULL) == -1) { // Already being traced exit(1); } // /proc/self/status FILE *f = fopen("/proc/self/status", "r"); char line[256]; while (fgets(line, sizeof(line), f)) { if (strncmp(line, "TracerPid:", 10) == 0) { int tracer_pid = atoi(line + 10); if (tracer_pid != 0) exit(1); } } // Parent process check if (getppid() != 1 && strcmp(get_process_name(getppid()), "bash") != 0) { // Unusual parent (might be debugger) }ptrace(PTRACE_TRACEME)的自追踪检测利用了 Linux 同一进程只能被一个 tracer 跟踪的特性;/proc/self/status中的TracerPid非 0 即表示有调试器附加;父进程检查则识别 gdb 等调试器通常不是bash或init的异常父子关系。绕过思路(LD_PRELOAD 挂钩 ptrace):# LD_PRELOAD to hook ptrace # Compile: gcc -shared -fPIC -o hook.so hook.c long ptrace(int request, ...) { return 0; // Always succeed } # Usage LD_PRELOAD=./hook.so ./target通过LD_PRELOAD注入一个始终返回成功的ptrace实现,即可让依赖 ptrace 返回值的检测全部失效。六、反虚拟机检测(Anti-VM Detection)恶意软件常通过识别运行环境是否为虚拟机来逃避沙箱分析,主要手段有硬件指纹、注册表/文件痕迹与时序异常三类。6.1 硬件指纹(Hardware Fingerprinting)CPUID 指令是核心检测点——虚拟化环境会暴露 hypervisor 特征:// CPUID-based detection int cpuid_info[4]; __cpuid(cpuid_info, 1); // Check hypervisor bit (bit 31 of ECX) if (cpuid_info[2] & (1 << 31)) { // Running in hypervisor } // CPUID brand string __cpuid(cpuid_info, 0x40000000); char vendor[13] = {0}; memcpy(vendor, &cpuid_info[1], 12); // "VMwareVMware", "Microsoft Hv", "KVMKVMKVM", "VBoxVBoxVBox" // MAC address prefix // VMware: 00:0C:29, 00:50:56 // VirtualBox: 08:00:27 // Hyper-V: 00:15:5DCPUID 叶子1的 ECX 第 31 位(hypervisor present bit)在虚拟化环境下被置位;叶子0x40000000返回的厂商字符串直接暴露虚拟机品牌(VMware、Microsoft Hyper-V、KVM、VirtualBox);网卡 MAC 前缀同样是高置信度指纹。6.2 注册表/文件/进程痕迹检测// Windows registry keys // HKLM\SOFTWARE\VMware, Inc.\VMware Tools // HKLM\SOFTWARE\Oracle\VirtualBox Guest Additions // HKLM\HARDWARE\ACPI\DSDT\VBOX__ // Files // C:\Windows\System32\drivers\vmmouse.sys // C:\Windows\System32\drivers\vmhgfs.sys // C:\Windows\System32\drivers\VBoxMouse.sys // Processes // vmtoolsd.exe, vmwaretray.exe // VBoxService.exe, VBoxTray.exeVMware Tools、VirtualBox Guest Additions 等客户机增强组件会在注册表、驱动文件与后台进程中留下明确痕迹,样本通过查询这些标志物即可完成虚拟机判定。6.3 时序型 VM 检测虚拟机执行特权指令(如CPUID)会产生 VM exit,耗时显著高于裸机:// VM exits cause timing anomalies uint64_t start = __rdtsc(); __cpuid(cpuid_info, 0); // Causes VM exit uint64_t end = __rdtsc(); if ((end - start) > 500) { // Likely in VM (CPUID takes longer) }反制思路:使用裸机分析环境;加固虚拟机(移除客户机工具、修改 MAC);补丁检测代码;或使用专为恶意软件分析优化的 FLARE-VM 等专门分析虚拟机。七、代码混淆技术(Code Obfuscation)混淆的目的是提高逆向分析的静态成本。Playbook 将其分为控制流混淆、数据混淆与指令级混淆三个层次。7.1 控制流平坦化(Control Flow Flattening)将原本清晰的 if/else 分支改写为“状态变量 + 无限循环 + switch”的扁平结构,抹平控制流层级,使静态分析难以直接还原逻辑分支:// Original if (cond) { func_a(); } else { func_b(); } func_c(); // Flattened int state = 0; while (1) { switch (state) { case 0: state = cond ? 1 : 2; break; case 1: func_a(); state = 3; break; case 2: func_b(); state = 3; break; case 3: func_c(); return; } }分析思路:识别状态变量 → 映射状态转移 → 重构原始流程;工具方面可借助 IDA 的 D-810 插件与 SATURN 等去平坦化工具。7.2 不透明谓词(Opaque Predicates)在正常逻辑中插入“恒真/恒假但证明复杂”的条件判断,并附带永不执行的死代码(junk code),干扰分析者对程序真实路径的判断:// Always true, but complex to analyze int x = rand(); if ((x * x) >= 0) { // Always true real_code(); } else { junk_code(); // Dead code } // Always false if ((x * (x + 1)) % 2 == 1) { // Product of consecutive = even junk_code(); }分析思路:识别常量表达式;使用符号执行证明谓词真假;对已知不透明谓词模式做模式匹配,从而剔除死代码。7.3 数据混淆:字符串加密与栈字符串字符串是逆向分析的高价值目标,样本常对敏感字符串(URL、API 名)做加密处理:// XOR encryption char decrypt_string(char *enc, int len, char key) { char *dec = malloc(len + 1); for (int i = 0; i < len; i++) { dec[i] = enc[i] ^ key; } dec[len] = 0; return dec; } // Stack strings char url[20]; url[0] = 'h'; url[1] = 't'; url[2] = 't'; url[3] = 'p'; url[4] = ':'; url[5] = '/'; url[6] = '/'; // ...栈字符串将字符串拆成单字节逐字压栈构造,避免在数据段留下连续可搜索的字符串字面量。自动化分析工具:# FLOSS for automatic string deobfuscation floss malware.exe # IDAPython string decryption def decrypt_xor(ea, length, key): result = "" for i in range(length): byte = ida_bytes.get_byte(ea + i) result += chr(byte ^ key) return resultFLOSS(FireEye Labs Obfuscated String Solver)可从样本中自动提取解码后的字符串;IDAPython 脚本则可针对已知 XOR 密钥批量还原。7.4 API 混淆:动态解析与哈希通过GetProcAddress动态解析 API 地址、或使用哈希值代替 API 名字符串比较,规避静态导入表分析:// Dynamic API resolution typedef HANDLE (WINAPI *pCreateFileW)(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE); HMODULE kernel32 = LoadLibraryA("kernel32.dll"); pCreateFileW myCreateFile = (pCreateFileW)GetProcAddress( kernel32, "CreateFileW"); // API hashing DWORD hash_api(char *name) { DWORD hash = 0; while (*name) { hash = ((hash >> 13) | (hash << 19)) + *name++; } return hash; } // Resolve by hash comparison instead of string分析思路:识别哈希算法 → 构建已知 API 哈希库 → 使用 IDA 的 HashDB 插件辅助 → 或通过动态分析在运行时解析真实调用目标。7.5 指令级混淆:死代码插入与指令替换; Original mov eax, 1 ; With dead code push ebx ; Dead mov eax, 1 pop ebx ; Dead xor ecx, ecx ; Dead add ecx, ecx ; Dead ; Original: xor eax, eax (set to 0) ; Substitutions: sub eax, eax mov eax, 0 and eax, 0 lea eax, [0] ; Original: mov eax, 1 ; Substitutions: xor eax, eax inc eax push 1 pop eax语义等价指令替换让同样的操作呈现不同字节形态,增加特征匹配与模式识别的难度;死代码插入则稀释有效指令密度,迫使分析者逐条甄别。八、加壳与脱壳(Packing and Unpacking)8.1 常见加壳器加壳器类型特征UPX开源压缩壳体积小、易识别、官方可脱Themida商业保护壳基于 VM 的保护,对抗调试器能力强VMProtect商业保护壳代码虚拟化,将原生代码转为虚拟机字节码ASPack压缩壳以压缩为主要目的PECompact压缩壳以压缩为主要目的Enigma商业保护壳功能全面的保护方案8.2 脱壳方法论(Unpacking Methodology)Playbook 给出标准的四阶段流程:1. Identify packer (DIE, Exeinfo PE, PEiD) 2. Static unpacking (if known packer): - UPX: upx -d packed.exe - Use existing unpackers 3. Dynamic unpacking: a. Find Original Entry Point (OEP) b. Set breakpoint on OEP c. Dump memory when OEP reached d. Fix import table (Scylla, ImpREC) 4. OEP finding techniques: - Hardware breakpoint on stack (ESP trick) - Break on common API calls (GetCommandLineA) - Trace and look for typical entry patterns关键点解读:第一步用 Detect It Easy(DIE)、Exeinfo PE 或 PEiD 识别壳类型;已知壳优先静态脱壳(如 UPX 直接upx -d);未知壳则进入动态脱壳:定位原始入口点(OEP)→ 在 OEP 下断 → 内存转储 → 用 Scylla 或 ImpREC 修复导入表(IAT)。OEP 定位的经典技巧包括 ESP 硬件断点法(壳执行 PUSHAD/POPAD 后栈顶即指向 OEP 附近)与在GetCommandLineA等壳必然调用的 API 上下断。8.3 手工脱壳实例(Manual Unpacking Example)1. Load packed binary in x64dbg 2. Note entry point (packer stub) 3. Use ESP trick: - Run to entry - Set hardware breakpoint on [ESP] - Run until breakpoint hits (after PUSHAD/POPAD) 4. Look for JMP to OEP 5. At OEP, use Scylla to: - Dump process - Find imports (IAT autosearch) - Fix dump完整流程为:将加壳样本载入 x64dbg → 记录壳入口(packer stub)→ 运行至入口后对[ESP]设硬件断点,运行至断点命中(壳的 PUSHAD/POPAD 序列之后)→ 寻找跳向 OEP 的 JMP → 在 OEP 处用 Scylla 转储进程、自动搜索导入表并修复转储文件。该流程对 UPX、ASPack 等传统壳几乎通用。九、代码虚拟化保护(Virtualization-Based Protection)9.1 原理:原生代码 → 自定义字节码代码虚拟化将原始 x86 指令转换为自定义字节码,由内嵌虚拟机在运行时解释执行,静态逆向者面对的是虚拟指令集而非原生指令:Original x86 code is converted to custom bytecode interpreted by embedded VM at runtime. Original: VM Protected: mov eax, 1 push vm_context add eax, 2 call vm_entry ; VM interprets bytecode ; equivalent to original9.2 分析路径(Analysis Approaches)1. Identify VM components: - VM entry (dispatcher) - Handler table - Bytecode location - Virtual registers/stack 2. Trace execution: - Log handler calls - Map bytecode to operations - Understand instruction set 3. Lifting/devirtualization: - Map VM instructions back to native - Tools: VMAttack, SATURN, NoVmp 4. Symbolic execution: - Analyze VM semantically - angr, Triton分析顺序从识别虚拟机组件(调度器 dispatcher、处理器表 handler table、字节码位置、虚拟寄存器/栈)开始,通过追踪执行日志建立“字节码 → 操作”映射,再借助 VMAttack、SATURN、NoVmp 等工具做指令提升(lifting)与反虚拟化,或使用 angr、Triton 对 VM 做语义层面的符号执行分析。这也是 Themida、VMProtect 类保护最耗时的分析环节。十、绕过策略总览与工具矩阵10.1 通用五原则(General Principles)理解保护:先识别样本使用了哪类技术(Identify what technique is used);定位检查点:在二进制中定位保护代码(Locate protection code in binary);补丁或挂钩:将检查修改为恒通过(Modify check to always pass);使用合适工具:如 ScyllaHide、x64dbg 插件(Use appropriate tools);记录发现:持续记录被绕过的保护项(Keep notes on bypassed protections)。10.2 工具推荐矩阵(Tool Recommendations)分析场景推荐工具反调试绕过ScyllaHide, TitanHide脱壳x64dbg + Scylla, OllyDumpEx反混淆D-810, SATURN, miasmVM 分析VMAttack, NoVmp, 手工追踪字符串解密FLOSS, 自定义脚本符号执行angr, Triton十一、伦理边界与防御视角(Ethical Considerations)Playbook 在结尾再次收紧使用边界。本技能知识仅允许用于:授权安全研究、恶意软件分析(防御性)、CTF 竞赛、理解保护机制的合法目的、教育目的。严禁用于:软件盗版、未授权访问、恶意目的。这与 SKILL.md 的“Safety”条款(不分享绕过步骤、保全证据链)共同构成完整的合规闭环:技能元数据负责激活前的授权确认,playbook 技术章节负责授权后的分析方法,而伦理章节负责收尾时的边界重申。值得强调的是,这一技能在 AAS 体系中的定位是攻防一体的防御支撑:了解反调试、反虚拟机与混淆技术,其直接价值在于恶意软件分析师能高效剥离保护、提取 IoC(威胁指标),以及安全工程师能反向评估自身产品的防护强度。分析产出的最终输出应落回“防御性建议与缓解指导”这一技能指令的第四步。十二、使用约束与局限性总结本技能仅在任务与文档声明的授权范围清晰匹配时使用;输出不能替代环境特定的验证、测试或专家评审——脱壳结果、去混淆结论都需在目标环境中二次确认;当所需输入(目标、授权、范围)或成功标准缺失时,Agent 必须停止并请求澄清,而非自行假设授权;未获确认时保持只读,仅提供防御性指导,并优先使用沙箱、一次性 VM 等隔离环境。对开发者与安全从业者而言,若要在本地使用该技能,需先通过 AAS 的技能激活机制(参考 GETTING_STARTED.md 与 USAGE.md)安装并加载对应插件副本;加载后由 Agent 依据本技能 SKILL.md 的触发条件与授权门槛决定是否进入分析流程,完整技术细节以 implementation-playbook.md 为准。【免费下载链接】agentic-awesome-skillsAAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600+ agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.项目地址: https://gitcode.com/GitHub_Trending/an/agentic-awesome-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
agentic-awesome-skills 反逆向技术 Skill 深度解析:授权安全边界、反调试/反虚拟机检测与脱壳实战方法论【免费下载链接】agentic-awesome-skillsAAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600+ agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.项目地址: https://gitcode.com/GitHub_Trending/an/agentic-awesome-skills本指南围绕 agentic-awesome-skills 开源仓库中anti-reversing-techniques(反逆向技术)技能展开,完整继承其 SKILL.md 的元数据、授权门槛与操作规范,并以其引用的 implementation-playbook.md 为技术主干,系统梳理 Windows/Linux 反调试、反虚拟机检测、代码混淆、加壳脱壳、代码虚拟化等对抗维度的检测原理、绕过思路与对应工具链。读完本文,你将掌握:在明确授权前提下识别二进制保护机制的能力、对常见反调试与反虚拟机检测点的定位方法、控制流平坦化与不透明谓词的还原思路、以及从加壳样本中定位 OEP 并修复导入表的完整脱壳流程,同时理解 AAS(Agentic Awesome Skills)体系中 offensive 类技能被设计为“授权门控 + 防御导向”的合规使用范式。一、技能定位:AAS 生态中的 offensive 类安全技能在 agentic-awesome-skills 仓库中,anti-reversing-techniques属于风险等级标记为risk: offensive的双用途(dual-use)安全技能。其 SKILL.md 以标准 AAS Skill 格式组织,frontmatter 元数据如下:--- name: anti-reversing-techniques description: "AUTHORIZED USE ONLY: This skill contains dual-use security techniques. Before proceeding with any bypass or analysis: > 1." risk: offensive source: community date_added: "2026-02-27" ---各字段含义:字段值说明nameanti-reversing-techniques技能唯一标识,即仓库中对应的目录名descriptionAUTHORIZED USE ONLY: ...面向 Agent 的触发描述,第一语义即强调“仅限授权使用”,避免被误触发riskoffensiveAAS 风险分级体系中的进攻性等级,表示该技能包含可被用于攻击的对抗性技术,需要额外授权门控sourcecommunity技能来源为社区贡献date_added2026-02-27收录日期,便于目录审计与变更追踪该技能在仓库中存在于多处分发副本:主 skills 目录、plugins/agentic-awesome-skills 以及 plugins/agentic-awesome-skills-claude。其中 Claude 插件副本额外携带完整的resources/implementation-playbook.md技术手册,是本文技术内容的主要依据。这种“SKILL.md 声明边界 + resources 承载技术细节”的结构,正是 AAS 技能仓库的典型组织方式:Agent 通过轻量 SKILL.md 决定是否激活技能,再按需加载深度 playbook。二、不可逾越的授权门槛(Mandatory Confirmation Gate)这是本技能区别于普通逆向知识文档的核心特征:任何绕过、探测、修改、持久化、数据提取或凭据访问行为,都必须先通过强制确认门(Mandatory Confirmation Gate)。SKILL.md 规定的四步确认流程:明确目标:让用户陈述确切的攻击目标——URL、IP、账户或具体资源;确认授权:让用户确认书面授权与允许的范围(scope);展示命令:展示将要执行的确切命令并解释其预期效果;等待确认:在当前对话中等待用户的明确确认。未获确认时,技能必须保持只读状态,仅提供防御性指导,并优先建议在沙箱、一次性虚拟机或受控实验环境(controlled lab)中操作。同时,技能要求验证授权时确认用户属于以下合法情境之一:软件所有者的书面许可、CTF 竞赛、授权渗透测试、恶意软件分析或安全研究;并提醒未经授权绕过软件保护可能触犯 CFAA(美国计算机欺诈与滥用法)、DMCA 反规避条款等法律。从设计角度看,这一门槛与仓库的安全治理文档体系一脉相承。AAS 仓库中的安全治理文档(如 SECURITY_GUARDRAILS.md)普遍采用“先声明授权、再给出技术”的编排,将合规审查前置到技能激活阶段,使 Agent 在进入技术细节前就完成合法性确认。三、适用场景与禁用场景:Agent 的触发决策依据SKILL.md 明确划定了技能的使用边界,Agent 应据此决定是否激活本技能。适用场景(Use this skill when):在明确授权下分析受保护二进制(Analyzing protected binaries with explicit authorization);在范围内开展恶意软件分析或安全研究(Conducting malware analysis or security research in scope);参与 CTF 或经批准的训练演练(Participating in CTFs or approved training exercises);为防御目的理解反调试或混淆技术(Understanding anti-debugging or obfuscation techniques for defense)。禁用场景(Do not use this skill when):缺乏书面授权或未定义明确范围(You lack written authorization or a defined scope);目标是出于盗版或滥用目的绕过保护(The goal is to bypass protections for piracy or misuse);法律或政策限制禁止此类分析(Legal or policy restrictions prohibit analysis)。这四个“适用”与三个“禁用”条件共同构成 Agent 的决策过滤器:只有任务同时满足“有授权、有范围、有合法目的”三个条件时,才允许进入技术执行阶段;任一条件不满足,则退回只读的防御性建议模式。四、执行指令与安全规范(Instructions & Safety)当授权确认完成,技能按以下四步指令推进分析任务:确认授权、范围与法律约束(Confirm written authorization, scope, and legal constraints)——不是一次性的,而是在每个敏感操作前重申;识别保护机制并选择安全的分析方法(Identify protection mechanisms and choose safe analysis methods)——先分类(反调试/反 VM/混淆/加壳/虚拟化),再匹配对应分析策略;记录发现,避免不必要地修改样本(Document findings and avoid modifying artifacts unnecessarily)——保持证据原始性,分析过程中的补丁尽量打在内存或副本上;提供防御性建议与缓解指导(Provide defensive recommendations and mitigation guidance)——分析的最终输出应落回防御视角,反哺防护设计。安全规范(Safety)包含两条硬性要求:不得在授权语境之外分享绕过步骤;在恶意软件分析场景下保全证据并维持证据链(chain-of-custody)。后者直接对应数字取证的基本要求——任何对样本的改动都必须被记录,确保后续司法或合规审查时证据可追溯。技能还声明了明确的局限性(Limitations):仅在任务与上述范围清晰匹配时使用;输出不能替代环境特定的验证、测试或专家评审;当所需输入、权限、安全边界或成功标准缺失时,应停止并请求澄清。这要求 Agent 将本技能视为分析辅助而非结论本身。五、反调试技术(Anti-Debugging Techniques)implementation-playbook.md 是技术细节的主体,其核心主题是:理解授权软件分析、安全研究与恶意软件分析中遇到的保护机制,帮助分析人员绕过保护以完成合法分析任务。反调试是样本最常用的第一道防线。5.1 Windows API 级检测程序通过调用 Windows 调试相关 API 探测自身是否处于调试器之下:// IsDebuggerPresent if (IsDebuggerPresent()) { exit(1); } // CheckRemoteDebuggerPresent BOOL debugged = FALSE; CheckRemoteDebuggerPresent(GetCurrentProcess(), &debugged); if (debugged) exit(1); // NtQueryInformationProcess - ProcessDebugPort (class 7) typedef NTSTATUS (NTAPI *pNtQueryInformationProcess)( HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG); DWORD debugPort = 0; NtQueryInformationProcess( GetCurrentProcess(), ProcessDebugPort, // 7 &debugPort, sizeof(debugPort), NULL ); if (debugPort != 0) exit(1); // Debug flags - ProcessDebugFlags (0x1F) DWORD debugFlags = 0; NtQueryInformationProcess( GetCurrentProcess(), ProcessDebugFlags, // 0x1F &debugFlags, sizeof(debugFlags), NULL ); if (debugFlags == 0) exit(1); // 0 means being debugged原理要点:IsDebuggerPresent()是最高层的封装,实际读取 PEB 的BeingDebugged标志,最容易被挂钩或补丁绕过;CheckRemoteDebuggerPresent可检测本地或远程调试器;NtQueryInformationProcess是更底层的原生 API:ProcessDebugPort(类号 7)在被调试时返回非零端口;ProcessDebugFlags(类号 0x1F)返回 0 表示处于调试状态。因为它是未文档化的原生 API,样本常直接调用它来规避对 Win32 API 的挂钩。绕过思路(Bypass Approaches):使用 x64dbg 的 ScyllaHide 插件自动处理常见反调试检查;手工补丁:将IsDebuggerPresent的返回值改为 0、将PEB.BeingDebugged清零、挂钩NtQueryInformationProcess;IDAPython 脚本化补丁,将检查指令 NOP 掉:# IDAPython: Patch checks ida_bytes.patch_byte(check_addr, 0x90) # NOP5.2 PEB 结构级检测许多样本不依赖 API,直接读取进程环境块(PEB)中的调试标志,这类检测对 API 挂钩免疫:// Direct PEB access #ifdef _WIN64 PPEB peb = (PPEB)__readgsqword(0x60); #else PPEB peb = (PPEB)__readfsdword(0x30); #endif // BeingDebugged flag if (peb->BeingDebugged) exit(1); // NtGlobalFlag // Debugged: 0x70 (FLG_HEAP_ENABLE_TAIL_CHECK | // FLG_HEAP_ENABLE_FREE_CHECK | // FLG_HEAP_VALIDATE_PARAMETERS) if (peb->NtGlobalFlag & 0x70) exit(1); // Heap flags PDWORD heapFlags = (PDWORD)((PBYTE)peb->ProcessHeap + 0x70); if (*heapFlags & 0x50000062) exit(1);关键偏移速查:x64 下 PEB 位于gs:[0x60],x86 下位于fs:[0x30];BeingDebugged位于 PEB 偏移 2;NtGlobalFlag在 x64 下位于偏移 0xBC,正常值为 0,被调试时常为 0x70(同时置位堆尾检查、空闲块检查、参数校验三个标志);堆标志检查读取ProcessHeap偏移 0x70 处的Flags/ForceFlags(掩码 0x50000062)。绕过思路:; In debugger, modify PEB directly ; x64dbg: dump at gs:[60] (x64) or fs:[30] (x86) ; Set BeingDebugged (offset 2) to 0 ; Clear NtGlobalFlag (offset 0xBC for x64)5.3 时序检测(Timing-Based)调试器单步执行会显著拖慢程序运行,样本通过测量代码段执行耗时来间接推断是否被调试:// RDTSC timing uint64_t start = __rdtsc(); // ... some code ... uint64_t end = __rdtsc(); if ((end - start) > THRESHOLD) exit(1); // QueryPerformanceCounter LARGE_INTEGER start, end, freq; QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&start); // ... code ... QueryPerformanceCounter(&end); double elapsed = (double)(end.QuadPart - start.QuadPart) / freq.QuadPart; if (elapsed > 0.1) exit(1); // Too slow = debugger // GetTickCount DWORD start = GetTickCount(); // ... code ... if (GetTickCount() - start > 1000) exit(1);绕过思路:优先使用硬件断点(hardware breakpoints)而非软件断点(INT3),减少时序扰动;直接补丁时序检查阈值;使用可控制时间的虚拟机环境;挂钩时序 API(如QueryPerformanceCounter、GetTickCount),返回一致性数值。5.4 异常机制检测(Exception-Based)样本利用调试器会“吞掉”异常这一行为特征来反调试。SEH(结构化异常处理)方案:正常运行时int 3产生的异常被自身异常处理器捕获,若异常被调试器截获则程序流不经过处理器,从而判定被调试:// SEH-based detection __try { __asm { int 3 } // Software breakpoint } __except(EXCEPTION_EXECUTE_HANDLER) { // Normal execution: exception caught return; } // Debugger ate the exception exit(1);VEH(向量化异常处理)方案则主动处理断点异常并恢复执行:// VEH-based detection LONG CALLBACK VectoredHandler(PEXCEPTION_POINTERS ep) { if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT) { ep->ContextRecord->Rip++; // Skip INT3 return EXCEPTION_CONTINUE_EXECUTION; } return EXCEPTION_CONTINUE_SEARCH; }5.5 Linux 反调试Linux 平台的检测手法以ptrace体系为核心:// ptrace self-trace if (ptrace(PTRACE_TRACEME, 0, NULL, NULL) == -1) { // Already being traced exit(1); } // /proc/self/status FILE *f = fopen("/proc/self/status", "r"); char line[256]; while (fgets(line, sizeof(line), f)) { if (strncmp(line, "TracerPid:", 10) == 0) { int tracer_pid = atoi(line + 10); if (tracer_pid != 0) exit(1); } } // Parent process check if (getppid() != 1 && strcmp(get_process_name(getppid()), "bash") != 0) { // Unusual parent (might be debugger) }ptrace(PTRACE_TRACEME)的自追踪检测利用了 Linux 同一进程只能被一个 tracer 跟踪的特性;/proc/self/status中的TracerPid非 0 即表示有调试器附加;父进程检查则识别 gdb 等调试器通常不是bash或init的异常父子关系。绕过思路(LD_PRELOAD 挂钩 ptrace):# LD_PRELOAD to hook ptrace # Compile: gcc -shared -fPIC -o hook.so hook.c long ptrace(int request, ...) { return 0; // Always succeed } # Usage LD_PRELOAD=./hook.so ./target通过LD_PRELOAD注入一个始终返回成功的ptrace实现,即可让依赖 ptrace 返回值的检测全部失效。六、反虚拟机检测(Anti-VM Detection)恶意软件常通过识别运行环境是否为虚拟机来逃避沙箱分析,主要手段有硬件指纹、注册表/文件痕迹与时序异常三类。6.1 硬件指纹(Hardware Fingerprinting)CPUID 指令是核心检测点——虚拟化环境会暴露 hypervisor 特征:// CPUID-based detection int cpuid_info[4]; __cpuid(cpuid_info, 1); // Check hypervisor bit (bit 31 of ECX) if (cpuid_info[2] & (1 << 31)) { // Running in hypervisor } // CPUID brand string __cpuid(cpuid_info, 0x40000000); char vendor[13] = {0}; memcpy(vendor, &cpuid_info[1], 12); // "VMwareVMware", "Microsoft Hv", "KVMKVMKVM", "VBoxVBoxVBox" // MAC address prefix // VMware: 00:0C:29, 00:50:56 // VirtualBox: 08:00:27 // Hyper-V: 00:15:5DCPUID 叶子1的 ECX 第 31 位(hypervisor present bit)在虚拟化环境下被置位;叶子0x40000000返回的厂商字符串直接暴露虚拟机品牌(VMware、Microsoft Hyper-V、KVM、VirtualBox);网卡 MAC 前缀同样是高置信度指纹。6.2 注册表/文件/进程痕迹检测// Windows registry keys // HKLM\SOFTWARE\VMware, Inc.\VMware Tools // HKLM\SOFTWARE\Oracle\VirtualBox Guest Additions // HKLM\HARDWARE\ACPI\DSDT\VBOX__ // Files // C:\Windows\System32\drivers\vmmouse.sys // C:\Windows\System32\drivers\vmhgfs.sys // C:\Windows\System32\drivers\VBoxMouse.sys // Processes // vmtoolsd.exe, vmwaretray.exe // VBoxService.exe, VBoxTray.exeVMware Tools、VirtualBox Guest Additions 等客户机增强组件会在注册表、驱动文件与后台进程中留下明确痕迹,样本通过查询这些标志物即可完成虚拟机判定。6.3 时序型 VM 检测虚拟机执行特权指令(如CPUID)会产生 VM exit,耗时显著高于裸机:// VM exits cause timing anomalies uint64_t start = __rdtsc(); __cpuid(cpuid_info, 0); // Causes VM exit uint64_t end = __rdtsc(); if ((end - start) > 500) { // Likely in VM (CPUID takes longer) }反制思路:使用裸机分析环境;加固虚拟机(移除客户机工具、修改 MAC);补丁检测代码;或使用专为恶意软件分析优化的 FLARE-VM 等专门分析虚拟机。七、代码混淆技术(Code Obfuscation)混淆的目的是提高逆向分析的静态成本。Playbook 将其分为控制流混淆、数据混淆与指令级混淆三个层次。7.1 控制流平坦化(Control Flow Flattening)将原本清晰的 if/else 分支改写为“状态变量 + 无限循环 + switch”的扁平结构,抹平控制流层级,使静态分析难以直接还原逻辑分支:// Original if (cond) { func_a(); } else { func_b(); } func_c(); // Flattened int state = 0; while (1) { switch (state) { case 0: state = cond ? 1 : 2; break; case 1: func_a(); state = 3; break; case 2: func_b(); state = 3; break; case 3: func_c(); return; } }分析思路:识别状态变量 → 映射状态转移 → 重构原始流程;工具方面可借助 IDA 的 D-810 插件与 SATURN 等去平坦化工具。7.2 不透明谓词(Opaque Predicates)在正常逻辑中插入“恒真/恒假但证明复杂”的条件判断,并附带永不执行的死代码(junk code),干扰分析者对程序真实路径的判断:// Always true, but complex to analyze int x = rand(); if ((x * x) >= 0) { // Always true real_code(); } else { junk_code(); // Dead code } // Always false if ((x * (x + 1)) % 2 == 1) { // Product of consecutive = even junk_code(); }分析思路:识别常量表达式;使用符号执行证明谓词真假;对已知不透明谓词模式做模式匹配,从而剔除死代码。7.3 数据混淆:字符串加密与栈字符串字符串是逆向分析的高价值目标,样本常对敏感字符串(URL、API 名)做加密处理:// XOR encryption char decrypt_string(char *enc, int len, char key) { char *dec = malloc(len + 1); for (int i = 0; i < len; i++) { dec[i] = enc[i] ^ key; } dec[len] = 0; return dec; } // Stack strings char url[20]; url[0] = 'h'; url[1] = 't'; url[2] = 't'; url[3] = 'p'; url[4] = ':'; url[5] = '/'; url[6] = '/'; // ...栈字符串将字符串拆成单字节逐字压栈构造,避免在数据段留下连续可搜索的字符串字面量。自动化分析工具:# FLOSS for automatic string deobfuscation floss malware.exe # IDAPython string decryption def decrypt_xor(ea, length, key): result = "" for i in range(length): byte = ida_bytes.get_byte(ea + i) result += chr(byte ^ key) return resultFLOSS(FireEye Labs Obfuscated String Solver)可从样本中自动提取解码后的字符串;IDAPython 脚本则可针对已知 XOR 密钥批量还原。7.4 API 混淆:动态解析与哈希通过GetProcAddress动态解析 API 地址、或使用哈希值代替 API 名字符串比较,规避静态导入表分析:// Dynamic API resolution typedef HANDLE (WINAPI *pCreateFileW)(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE); HMODULE kernel32 = LoadLibraryA("kernel32.dll"); pCreateFileW myCreateFile = (pCreateFileW)GetProcAddress( kernel32, "CreateFileW"); // API hashing DWORD hash_api(char *name) { DWORD hash = 0; while (*name) { hash = ((hash >> 13) | (hash << 19)) + *name++; } return hash; } // Resolve by hash comparison instead of string分析思路:识别哈希算法 → 构建已知 API 哈希库 → 使用 IDA 的 HashDB 插件辅助 → 或通过动态分析在运行时解析真实调用目标。7.5 指令级混淆:死代码插入与指令替换; Original mov eax, 1 ; With dead code push ebx ; Dead mov eax, 1 pop ebx ; Dead xor ecx, ecx ; Dead add ecx, ecx ; Dead ; Original: xor eax, eax (set to 0) ; Substitutions: sub eax, eax mov eax, 0 and eax, 0 lea eax, [0] ; Original: mov eax, 1 ; Substitutions: xor eax, eax inc eax push 1 pop eax语义等价指令替换让同样的操作呈现不同字节形态,增加特征匹配与模式识别的难度;死代码插入则稀释有效指令密度,迫使分析者逐条甄别。八、加壳与脱壳(Packing and Unpacking)8.1 常见加壳器加壳器类型特征UPX开源压缩壳体积小、易识别、官方可脱Themida商业保护壳基于 VM 的保护,对抗调试器能力强VMProtect商业保护壳代码虚拟化,将原生代码转为虚拟机字节码ASPack压缩壳以压缩为主要目的PECompact压缩壳以压缩为主要目的Enigma商业保护壳功能全面的保护方案8.2 脱壳方法论(Unpacking Methodology)Playbook 给出标准的四阶段流程:1. Identify packer (DIE, Exeinfo PE, PEiD) 2. Static unpacking (if known packer): - UPX: upx -d packed.exe - Use existing unpackers 3. Dynamic unpacking: a. Find Original Entry Point (OEP) b. Set breakpoint on OEP c. Dump memory when OEP reached d. Fix import table (Scylla, ImpREC) 4. OEP finding techniques: - Hardware breakpoint on stack (ESP trick) - Break on common API calls (GetCommandLineA) - Trace and look for typical entry patterns关键点解读:第一步用 Detect It Easy(DIE)、Exeinfo PE 或 PEiD 识别壳类型;已知壳优先静态脱壳(如 UPX 直接upx -d);未知壳则进入动态脱壳:定位原始入口点(OEP)→ 在 OEP 下断 → 内存转储 → 用 Scylla 或 ImpREC 修复导入表(IAT)。OEP 定位的经典技巧包括 ESP 硬件断点法(壳执行 PUSHAD/POPAD 后栈顶即指向 OEP 附近)与在GetCommandLineA等壳必然调用的 API 上下断。8.3 手工脱壳实例(Manual Unpacking Example)1. Load packed binary in x64dbg 2. Note entry point (packer stub) 3. Use ESP trick: - Run to entry - Set hardware breakpoint on [ESP] - Run until breakpoint hits (after PUSHAD/POPAD) 4. Look for JMP to OEP 5. At OEP, use Scylla to: - Dump process - Find imports (IAT autosearch) - Fix dump完整流程为:将加壳样本载入 x64dbg → 记录壳入口(packer stub)→ 运行至入口后对[ESP]设硬件断点,运行至断点命中(壳的 PUSHAD/POPAD 序列之后)→ 寻找跳向 OEP 的 JMP → 在 OEP 处用 Scylla 转储进程、自动搜索导入表并修复转储文件。该流程对 UPX、ASPack 等传统壳几乎通用。九、代码虚拟化保护(Virtualization-Based Protection)9.1 原理:原生代码 → 自定义字节码代码虚拟化将原始 x86 指令转换为自定义字节码,由内嵌虚拟机在运行时解释执行,静态逆向者面对的是虚拟指令集而非原生指令:Original x86 code is converted to custom bytecode interpreted by embedded VM at runtime. Original: VM Protected: mov eax, 1 push vm_context add eax, 2 call vm_entry ; VM interprets bytecode ; equivalent to original9.2 分析路径(Analysis Approaches)1. Identify VM components: - VM entry (dispatcher) - Handler table - Bytecode location - Virtual registers/stack 2. Trace execution: - Log handler calls - Map bytecode to operations - Understand instruction set 3. Lifting/devirtualization: - Map VM instructions back to native - Tools: VMAttack, SATURN, NoVmp 4. Symbolic execution: - Analyze VM semantically - angr, Triton分析顺序从识别虚拟机组件(调度器 dispatcher、处理器表 handler table、字节码位置、虚拟寄存器/栈)开始,通过追踪执行日志建立“字节码 → 操作”映射,再借助 VMAttack、SATURN、NoVmp 等工具做指令提升(lifting)与反虚拟化,或使用 angr、Triton 对 VM 做语义层面的符号执行分析。这也是 Themida、VMProtect 类保护最耗时的分析环节。十、绕过策略总览与工具矩阵10.1 通用五原则(General Principles)理解保护:先识别样本使用了哪类技术(Identify what technique is used);定位检查点:在二进制中定位保护代码(Locate protection code in binary);补丁或挂钩:将检查修改为恒通过(Modify check to always pass);使用合适工具:如 ScyllaHide、x64dbg 插件(Use appropriate tools);记录发现:持续记录被绕过的保护项(Keep notes on bypassed protections)。10.2 工具推荐矩阵(Tool Recommendations)分析场景推荐工具反调试绕过ScyllaHide, TitanHide脱壳x64dbg + Scylla, OllyDumpEx反混淆D-810, SATURN, miasmVM 分析VMAttack, NoVmp, 手工追踪字符串解密FLOSS, 自定义脚本符号执行angr, Triton十一、伦理边界与防御视角(Ethical Considerations)Playbook 在结尾再次收紧使用边界。本技能知识仅允许用于:授权安全研究、恶意软件分析(防御性)、CTF 竞赛、理解保护机制的合法目的、教育目的。严禁用于:软件盗版、未授权访问、恶意目的。这与 SKILL.md 的“Safety”条款(不分享绕过步骤、保全证据链)共同构成完整的合规闭环:技能元数据负责激活前的授权确认,playbook 技术章节负责授权后的分析方法,而伦理章节负责收尾时的边界重申。值得强调的是,这一技能在 AAS 体系中的定位是攻防一体的防御支撑:了解反调试、反虚拟机与混淆技术,其直接价值在于恶意软件分析师能高效剥离保护、提取 IoC(威胁指标),以及安全工程师能反向评估自身产品的防护强度。分析产出的最终输出应落回“防御性建议与缓解指导”这一技能指令的第四步。十二、使用约束与局限性总结本技能仅在任务与文档声明的授权范围清晰匹配时使用;输出不能替代环境特定的验证、测试或专家评审——脱壳结果、去混淆结论都需在目标环境中二次确认;当所需输入(目标、授权、范围)或成功标准缺失时,Agent 必须停止并请求澄清,而非自行假设授权;未获确认时保持只读,仅提供防御性指导,并优先使用沙箱、一次性 VM 等隔离环境。对开发者与安全从业者而言,若要在本地使用该技能,需先通过 AAS 的技能激活机制(参考 GETTING_STARTED.md 与 USAGE.md)安装并加载对应插件副本;加载后由 Agent 依据本技能 SKILL.md 的触发条件与授权门槛决定是否进入分析流程,完整技术细节以 implementation-playbook.md 为准。【免费下载链接】agentic-awesome-skillsAAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600+ agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.项目地址: https://gitcode.com/GitHub_Trending/an/agentic-awesome-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考