资讯动态

agentic-awesome-skills 反逆向技术实战手册:反调试、反虚拟机、代码混淆与脱壳分析

发布时间:2026/10/21 1:17:32 来源:尧图企业网站定制
agentic-awesome-skills 反逆向技术实战手册反调试、反虚拟机、代码混淆与脱壳分析【免费下载链接】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的实现手册implementation playbook的完整技术解读。该技能定位为**仅限授权使用AUTHORIZED USE ONLY**的双用途安全技术集合适用于恶意软件分析、授权渗透测试、CTF 竞赛与学术安全研究等合法场景。读完本文你将掌握 Windows/Linux 平台反调试检测的识别与绕过思路、反虚拟机指纹探测原理、控制流与数据混淆手法、通用加壳/脱壳方法论以及代码虚拟化保护的逐层分析方法并理解在 AASagentic-awesome-skills技能体系中该类 offensive 型技能的授权边界与使用约束。技能定位与授权边界为什么它是 offensive 型技能在 AAS 仓库的技能目录 data/catalog.json 中anti-reversing-techniques被归类为category: security、risk: offensive、source: community对应技能入口文件为 skills/anti-reversing-techniques/SKILL.md注意仓库根目录下亦有 plugins/agentic-awesome-skills-claude/skills/anti-reversing-techniques/SKILL.md 与 plugins/agentic-awesome-skills/skills/anti-reversing-techniques/SKILL.md 两份插件分发副本正文即技能引用的 resources/implementation-playbook.md。该技能在 SKILL.md 中明确设置了强制确认门禁mandatory confirmation gate在执行任何探测、利用、修改、持久化、数据提取或凭据访问类命令之前必须先完成以下步骤要求用户陈述确切的目标 URL、IP、账户或资源要求用户确认书面授权与允许范围展示将要执行的确切命令并解释其预期效果在当前会话中等待用户的明确确认。未获得确认前技能保持只读状态仅提供防御性指导并优先建议在沙箱、一次性虚拟机或受控实验环境中操作。同时SKILL.md 声明了技能适用的场景分析受保护二进制、恶意软件分析、CTF、理解反调试/混淆技术以用于防御以及禁止使用的场景缺乏书面授权或范围、为盗版或滥用绕过保护、法律法规限制分析。本文后续所有技术内容均在此授权框架下展开。反调试技术Anti-DebuggingWindows API 层检测实现手册给出的第一类反调试手段基于 Windows 调试 API核心思路是进程是否被调试器附加这类信息本就可通过公开 API 查询程序据此自检并提前退出IsDebuggerPresent()最直接、最易被绕过的检测检查 PEB 的BeingDebugged标志CheckRemoteDebuggerPresent(GetCurrentProcess(), debugged)同样查询调试器状态NtQueryInformationProcess通过ProcessDebugPort信息类编号 7读取调试端口非 0 即表示被调试通过ProcessDebugFlags信息类编号0x1F读取调试标志0表示正在被调试调试标志组合debugFlags 0即判定被调试并退出。绕过思路手册给出的三类手段使用 x64dbg 的ScyllaHide插件自动补丁常见反调试检测调试器内手工补丁将IsDebuggerPresent返回值改为 0、将 PEB.BeingDebugged 清零、HookNtQueryInformationProcess使用 IDAPython 脚本化补丁例如将检测指令 NOP 掉ida_bytes.patch_byte(check_addr, 0x90) # NOPPEB 结构检测绕过 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 下通过__readgsqword(0x60)取 PEBx86 下通过__readfsdword(0x30)取 PEBBeingDebugged位于 PEB 偏移 2 处NtGlobalFlag在被调试时通常被置为0x70堆尾检查、释放检查、参数校验三个标志的叠加x64 下该字段位于 PEB 偏移0xBC堆标志ProcessHeap 0x70处在调试器下通常包含0x50000062这类特征位。绕过方法直接在调试器中修改 PEB——x64dbg 中观察gs:[60]x64或fs:[30]x86内存区将BeingDebugged偏移 2写 0并清除NtGlobalFlagx64 偏移0xBC。基于计时的检测调试器单步执行会显著拖慢程序运行因此计时类检测通过对比代码段执行耗时来暴露调试行为// 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);手册给出的绕过方向优先使用硬件断点而非软件断点避免 INT3 引发的单步开销、直接补丁计时检查、使用时间可控的虚拟机、或 Hook 计时 API 使其返回一致的值。基于异常的检测利用异常处理机制也能反调试——调试器吞掉异常与程序自身捕获异常是两种不同的行为路径// 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-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; }原理int 3软件断点在无调试器时由 SEH/VEH 处理若程序自身能捕获并继续执行说明未被调试若异常被调试器抢走程序便判定自己被调试并退出。Linux 平台反调试Linux 下的检测核心围绕ptrace与/proc文件系统// 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)自我追踪若返回 -1说明进程已被其他调试器追踪Linux 同一进程只能被一个追踪者 attach读取/proc/self/status中的TracerPid:字段非 0 即被调试检查父进程正常由 initPID 1或 shell 启动异常父进程可能是调试器。绕过方法手册给出 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反虚拟机检测Anti-VM Detection硬件指纹虚拟机监控器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要点CPUID功能号 1 的 ECX 位 31hypervisor present bit为 1 表示运行在虚拟机监控器之上功能号0x40000000返回的厂商字符串可识别具体虚拟化平台VMware、Hyper-V、KVM、VirtualBox 等。MAC 地址前缀也是常见指纹VMware 常见00:0C:29、00:50:56VirtualBox 为08:00:27Hyper-V 为00:15:5D。注册表 / 文件 / 进程痕迹Windows 下可通过以下特征检测虚拟机手册整理注册表键HKLM\SOFTWARE\VMware, Inc.\VMware Tools、HKLM\SOFTWARE\Oracle\VirtualBox Guest Additions、HKLM\HARDWARE\ACPI\DSDT\VBOX__驱动文件C:\Windows\System32\drivers\vmmouse.sys、vmhgfs.sysVMware、VBoxMouse.sysVirtualBox进程vmtoolsd.exe、vmwaretray.exeVMwareVBoxService.exe、VBoxTray.exeVirtualBox。基于计时的 VM 检测VM exit虚拟机退出比普通指令慢得多因此可用 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) }绕过思路使用裸金属bare-metal分析环境、加固虚拟机移除 guest tools、修改 MAC 地址、补丁检测代码或使用专门的加固分析虚拟机如 FLARE-VM。代码混淆技术Code Obfuscation控制流混淆控制流平坦化Control Flow Flattening将原有 if/else 分支结构改写为一个while(1)switch(state)的状态机抹平控制流图显著增加静态阅读难度// 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; } }分析思路定位状态变量 → 梳理状态迁移关系 → 还原原始控制流常用工具包括 D-810IDA 插件与 SATURN。不透明谓词Opaque Predicates插入结果恒定但难以静态证明的条件判断并附带永不执行的死代码干扰分析者// 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(); }分析思路识别恒定表达式、用符号执行证明谓词恒真/恒假、对已知不透明谓词模式做模式匹配。数据混淆字符串加密避免明文字符串直接出现在二进制中常见手法为 XOR 加密与逐字符入栈构造stack strings// 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 自动解密字符串floss malware.exe或用 IDAPython 编写 XOR 解密脚本# 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 resultAPI 混淆动态解析 API Hashing运行时通过LoadLibraryA/GetProcAddress动态获取 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 插件 → 结合动态分析在运行时解析实际调用的 API。指令级混淆死代码插入Dead Code Insertion在关键指令间插入不影响语义的垃圾指令; Original mov eax, 1 ; With dead code push ebx ; Dead mov eax, 1 pop ebx ; Dead xor ecx, ecx ; Dead add ecx, ecx ; Dead指令替换Instruction Substitution用语义等价但形态不同的指令组合替换原指令例如清零操作的多种写法; 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 Encryption常见加壳工具加壳工具类型与特点UPX开源压缩壳最容易脱壳upx -d即可还原Themida商业壳基于 VM 的强保护VMProtect商业壳代码虚拟化ASPack压缩型壳PECompact压缩型壳Enigma商业保护壳通用脱壳方法论手册将脱壳流程归纳为四步识别壳使用 DIE、Exeinfo PE、PEiD 等工具判断壳类型静态脱壳针对已知壳UPX 类直接upx -d packed.exe或使用现成脱壳器动态脱壳a. 找到原始入口点OEP, Original Entry Pointb. 在 OEP 处下断点c. 断点命中后 dump 内存映像d. 使用 Scylla、ImpREC 修复导入表OEP 查找技巧使用 ESP 技巧在栈上设硬件断点、在常见 API如GetCommandLineA上下断、单步跟踪寻找典型入口模式。手工脱壳示例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 dumpESP 技巧的原理壳在解压阶段会先PUSHAD保存寄存器现场将 ESP 指向栈上保存的寄存器区对[ESP]设硬件断点在POPAD之后命中此时程序已接近 OEP 的JMP跳转。基于虚拟化的保护Virtualization-Based Protection代码虚拟化原理代码虚拟化将原始 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 original分析方法论手册给出了四层递进的分析路径识别 VM 组件定位 VM 入口dispatcher、handler 分发表、字节码存放位置、虚拟寄存器/虚拟栈跟踪执行记录 handler 调用日志、将字节码映射为操作、理解该 VM 的自定义指令集Lifting / 反虚拟化devirtualization将 VM 指令映射回原生指令常用工具 VMAttack、SATURN、NoVmp符号执行从语义层面分析 VM常用 angr、Triton。绕过策略总结与工具矩阵通用原则手册总结的五步通用流程理解保护识别具体使用的技术定位检查点在二进制中找到保护代码位置补丁或 Hook修改检查逻辑使其始终通过使用合适工具如 ScyllaHide、各类 x64dbg 插件记录发现保存绕过的保护及其绕过方式的笔记。工具推荐矩阵任务推荐工具反调试绕过ScyllaHide、TitanHide脱壳x64dbg Scylla、OllyDumpEx反混淆D-810、SATURN、miasmVM 分析VMAttack、NoVmp、手工跟踪字符串解密FLOSS、自定义脚本符号执行angr、Triton伦理边界必须遵守本手册的知识仅可用于授权安全研究、恶意软件分析防御视角、CTF 竞赛、为合法目的理解保护机制、教育用途。严禁用于软件盗版、未经授权访问、恶意目的。在 AAS 仓库中这一约束同时体现在技能的risk: offensive标记与 SKILL.md 的强制确认门禁中——未取得明确书面授权并确认范围之前只能进行只读的防御性分析并在沙箱或一次性受控环境中进行。总结anti-reversing-techniques是 AAS 仓库中一条双用途安全技能其 implementation-playbook.md 系统覆盖了从 Windows 调试 API/PEB/计时/异常检测到 Linux ptrace 探测、从 CPUID 反虚拟机指纹到控制流平坦化与不透明谓词、从字符串/API 混淆到加壳脱壳与代码虚拟化分析的全链条方法论并配套完整的可编译 C 示例、可执行的 Python/汇编补丁片段和工具矩阵。对分析者而言它是一份可直接照做的操作手册对防御者而言它同样揭示了当前恶意软件保护技术的主流形态。使用时务必遵循技能内置的授权门禁与伦理边界在受控、合规的前提下发挥其价值。【免费下载链接】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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑