executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
re-unpack-advanced强壳脱壳:VMProtect/Themida。触发词:VMProtect、Themida、强壳、虚拟化壳、手动脱壳
Independent GitHub snapshot · Automated classification · Original documentation governs
apt install gdb / dnf install gdb / pacman -S gdb;Wine 直读:wine sample.exe 后 gdb -p <pid> attach(见 [[re-analyze/platform-tips]] Linux 分支)gdb --version;x64dbg 能载入样本并单步NtQuery/Scylla releasex64dbg/ScyllaHide release zip;x64dbg 插件目录放入后启用;release 内含 Wine 加载方案File > Script Command 能执行 Pythonrizin -v 验证按顺序执行,每步记录结果(证据路径 + sha256,见 [[re-triage]])。
反调试对抗(scyllaHide 思路):
NtQueryInformationProcess(ProcessDebugPort / ProcessDebugFlags / ProcessDebugObjectHandle)、NtSetInformationThread(ThreadHideFromDebugger)、时间差(RDTSC / GetTickCount / QueryPerformanceCounter)、调试端口(NtQuerySystemInformation)、窗口 / 进程名枚举。NtQueryInformationProcess 的 xref),scyllaHide 批量隐藏 + 剩余单点 patch(见坑 1)。找 OEP(堆栈回溯 / 内存断点组合):
ret 回到 OEP——单步 / 断点停在 ret,看栈顶地址即 OEP 线索(stub 常多段、多线程,多断几次取规律)。bp VirtualAlloc(x64dbg;gdb/Wine 用 break *VirtualAlloc)→ 每次返回后检查分配区域是否被写入可执行内容 → 对该区域下内存访问断点(View > Memory Map > 目标节 > Set breakpoint on access)→ 在"最后一次解密写入"后断下,附近即 OEP。push ebp; mov ebp,esp)+ 密集正常 API 引用。记录 OEP 地址与镜像基址。转储(默认转储优先):
gcore -o out <pid>(默认转储优先,完整流程见 [[re-memdump]];转储前按 maps 过滤 vsyscall/vdso;时机见 [[re-analyze/platform-tips]] 关键经验)。IAT 修复(Scylla,含重定向处理):
Plugins > Scylla > IAT Autosearch → Get Imports → 逐项检查 "invalid" 导入。Get Imports 确认大部分正常 API 已解析)。CALL [addr] 调用点,逆推地址表;② 解析函数:找壳的 API 解析循环(GetProcAddress 调用点或其 API hash 解析实现),在内存写入点下断,记录它往 IAT 区写入的地址;③ 强壳可能 API hash / 动态解析 / syscall 直通(无 IAT 可修)——转入"标注"路径(记录调用点语义,思路见步骤 5)。跟踪"第一个 API 调用"不是通用法:强壳的解析可能发生在多线程 / 延迟阶段,或直接 syscall 直通(无 API 调用可跟)。Delayed 选项(处理延迟导入表);bound import 按绑定时间戳判断并替换为真实导入;API resolver 类壳(运行时才解析)运行到 API 实际使用点后再 Get Imports,别在早期阶段 Fix Dump。Fix Dump 输出修复后 exe;重新反编译验证导入表([[re-ghidra]] / [[re-ida]])。虚拟化代码区域标注(不还原则标记绕过):
push imm32; mov eax, imm; jmp vm_handler(Themida 类似,节名 .vmp0/.vmp1/.themida)。vm_blackbox.txt 标注清单(地址 → 说明),随分析报告存档。NtQueryInformationProcess / 时间差函数),scyllaHide 批量隐藏常规项,剩余单点 patch 后继续Threads 面板 Suspend;gdb info threads 后单线程 continue),只在目标线程内推进FindWindowA)、时间差;对策——ScyllaHide 隐藏 + 调试器进程改名 + 先静态 patch 检测点再 attach;仍在沙箱快照内操作([[re-sandbox]])HookLibraryx86.dll + InjectorCLIx86.exe 配置),或改用内存断点 / TitanHide,再不行先静态 patch 检测点再 attachCALL [IAT] 实际调用点而非轻信导入表,用 [[re-tracing]] / [[re-frida]] 对照运行期真实调用,装饰性导入单独标记排除再下结论add eax,ecx);对策——分析插件改语义/数据流匹配而非指令文本;识别融合 Handler 时注意虚拟栈操作可能已被寄存器直连替代;3.5.1 源码公开 ≠ 3.8+ 可照搬(3.8 已重构)ExceptionInformation[0]==8 且地址在 .text 内,此时 RIP 就是真 OEP);对抗 VMP 扫描:VMP 会修复 .text 属性并抹掉 VEH 回调 → watchdog 线程定期重装回调(NtSetInformationProcess 0x28 ProcessInstrumentationCallback)+ Instrumentation Callback 在每次 syscall 返回时把 .text 剥回 RW(拉锯战);布防时机用 LATE_ARM:见过可写(解密发生)且当前可执行不可写(单看可执行会把初始密文态误判成时机)