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-deobfuscate反混淆:花指令、控制流平坦化、字符串加密。触发词:反混淆、花指令、控制流平坦化、字符串解密、obfuscation
Independent GitHub snapshot · Automated classification · Original documentation governs
apt install ghidra / brew install --cask ghidra(官方 release zip 也可),验证 analyzeHeadless -help;或 [[re-ida]] / [[re-radare2]] 的反编译视图。先产出反编译代码,再针对混淆点处理File > Script Command 能执行 Pythonrizin -v 验证rzpipe(pip install rzpipe,rizinorg/rz-pipe)eshard/d810(GitHub 镜像 zhkl0228/d810,原仓 README 已 fork 注明)release,复制到 IDA plugins/ 目录(要求 IDA 7.5+ / Python 3.7+,来源:官方 README)apt install python3(多数系统自带);按需 pip install pefile rzpipepython3 --version按顺序执行,每步记录结果(证据路径 + sha256,见 [[re-triage]])。修改前先备份原文件(见坑 1)。
花指令清除(patch NOP / 跳转修复):
jz/jnz 下一句即目标)、call+pop 取址、插入的垃圾指令(xor eax,eax 后无意义)、反汇编器误入垃圾字节形成的碎片。wx 90 @ 0x401000(单字节 NOP);批量用脚本按特征扫描填充Edit > Patch Program > AssembleC 强制标记代码 / 右键 Create Function;反汇编器漏分析的段手动定义。控制流平坦化识别与还原(D-810 / 手动):
switch 分发循环)、状态变量(dispatcher 的索引)在每个块尾部被改写、原 if/while 分支块被拆成小块。Deobfuscate 菜单 → Flattened code,选中平坦化函数一键还原(失败回落手动)。字符串解密循环定位与仿真:
memcpy/strcpy 前指针)→ 分析解密循环(XOR 单字节 / 多字节 key、查表、逐字节变换)。x/s 读结果。# 例:单字节 XOR 解密
key, out = 0x7f, bytearray()
for b in open('data.bin','rb').read():
out.append(b ^ key)
print(out[:64])
批量脚本化(解密所有字符串):
import idaapi, idc
# 例:枚举引用 sym_decrypt 的调用点,取参数地址后 idc.get_bytes 解密并打印
rizin -A sample -c 'axt @ sym.decrypt' 列引用,脚本循环解密,导出 strings_decrypted.txt 供 [[re-ioc]] / 人工分析。还原前后对比验证:
sha256sum 记录修改前后;objdump -d 对比花指令区域字节差异。x*x-x>=0、奇偶恒等)扩展路径干扰分析;对策——识别后直接确定分支目标(恒真取真支、恒假取假支)批量化简,先消 opaque predicate 再做平坦化还原与符号执行ida_hexrays 的 mblock.npred()/pred()/tail/type、mop_r/mop_S/mop_d 递归取变量stp x29,x30 检测会漏;对策——扩展三种序言模式检测,函数数可大增(238→291);PAC/BTI 着陆点反而是函数边界与间接跳转目标的精确标记,利用而非绕过"gs1a" 追踪执行路径)动静结合是 VM 还原的必要组合__asm { BR X8 } 或 v278 = v277(...)(无跳转符号),IDA 控制流图断裂(分支未识别进函数体);原因——OLLVM 间接混淆:目标地址经复杂逻辑运算后存寄存器再跳转,静态无法确定目标;对策——动态执行取寄存器值(断点停在 BR/BLR 处读 X8),人工计算目标地址效率太低;拿到目标后 keypatch 统一 patch 成直接跳转(BR X9 → B 0x153AF0);CSEL 条件分支拆解:X8 = (X0>0) ? X8 : X9 三目表达式逐段计算两个目标,patch 成条件跳转;多条件链(EQ 系列)同理逐个拆