标题: 非标准CCF反混淆工具xdefla的一些补充讨论 创建: 2026-03-26 14:55 更新: 链接: https://scz.617.cn/unix/202603261455.txt 参看 -------------------------------------------------------------------------- OLLVM控制流平坦化混淆还原 - 九天666 [2025-3-23] https://bbs.kanxue.com/thread-286151.htm 非标准OLLVM-fla反混淆分析还原 - 九天666 [2025-04-21] https://bbs.kanxue.com/thread-286549.htm https://github.com/jiutian666/xdefla -------------------------------------------------------------------------- 作者提供测试样本libgeiri.so,其中大量函数经非标准CCF处理过,包括但不限于 sub_41D08 sub_4364C sub_81260 sub_71F74 sub_76A24 sub_9E48 D810无法对付上述函数。作者提供针对这种非标准CCF的反混淆工具xdefla,用Angr 模拟执行恢复控制流,再汇编级Patch。 实测中发现一些xdefla未处理的情形,列举一二。 1) 重建控制流步骤中,在真实块中寻找CSEL指令,再Patch。未考虑CSEL是block最后一 条指令的情形,汇编级Patch时会两次Patch同一个地址(0x41db8),丢失CSEL条件成 立时的分支。 -------------------------------------------------------------------------- 0000000000041DA0 E8 5F 40 B9 LDR W8, [SP,#0x180+var_124] 0000000000041DA4 C9 D0 84 52 69 83 AD 72 MOV W9, #0x6C1B2686 0000000000041DAC 1F 51 00 71 CMP W8, #0x14 0000000000041DB0 48 D8 89 52 E8 23 A6 72 MOV W8, #0x311F4EC2 0000000000041DB8 28 C1 88 1A CSEL W8, W9, W8, GT -------------------------------------------------------------------------- 若是汇编级Patch,或可粗暴假设其前一条指令(0x41db0)可安全修改,即可用于汇编 级Patch。微码级Patch或可解决此问题。 2) 下面是0x72d04附近代码在汇编级Patch前的状态 -------------------------------------------------------------------------- 0000000000072CF8 E8 3F 44 39 LDRB W8, [SP,#0x290+var_181] 0000000000072CFC 89 CD 98 52 C9 35 A9 72 MOV W9, #0x49AEC66C # # 这条CMP指令会在汇编级Patch中被破坏,使得之后的CSEL指令失去确定性。 # 0000000000072D04 1F 01 00 71 CMP W8, #0 0000000000072D08 88 B8 9C 52 28 EB B4 72 MOV W8, #0xA759E5C4 # # CSEL的NE对应的是"CMP W8 0" # 0000000000072D10 08 11 89 1A CSEL W8, W8, W9, NE -------------------------------------------------------------------------- 下面是0x72d04附近代码在汇编级Patch后的状态 -------------------------------------------------------------------------- 0000000000072CF8 E8 3F 44 39 LDRB W8, [SP,#0x290+var_181] 0000000000072CFC 89 CD 98 52 C9 35 A9 72 MOV W9, #0x49AEC66C # # 汇编级Patch时,破坏了CMP指令,B.NE对应的条件判断是之前的残像,使得F5结果 # 失去确定性。遇此情形,无法简单修复,只在日志中告警,"CMP is corrupted"。 # 0000000000072D04 C1 04 00 54 B.NE loc_72D9C 0000000000072D08 0D 00 00 14 B loc_72D3C -------------------------------------------------------------------------- 作者在CSEL指令前一个block中Patch结尾的两条指令,上例这样Patch会破坏与CSEL 配对的CMP指令,0x72d04处原有CMP变成B.NE,条件跳转B.NE对应的条件判断是别处 的残像,F5结果失去确定性。遇此情形,汇编级Patch无法简单修复。微码级Patch或 可解决此问题。 3) 汇编级Patch后0x44254所在block的代码在F5结果中无对应,排查后未解决。猜测是 Angr模拟执行得到的控制流(flow_dict)有问题。 -------------------------------------------------------------------------- 0000000000044254 60 46 41 F9 LDR X0, [X19,#0x288] ; file 0000000000044258 E1 03 1F 2A MOV W1, WZR ; mode 000000000004425C 11 0F FF 97 BL dlopen 0000000000044260 78 F7 81 52 MOV W24, #0xFBB 0000000000044264 60 CA 00 F9 STR X0, [X19,#0x190] 0000000000044268 D8 7A B6 72 MOVK W24, #0xB3D6,LSL#16 000000000004426C E0 03 15 2A MOV W0, W21 0000000000044270 2D FD FF 17 B loc_43724 -------------------------------------------------------------------------- 前述内容体现了反CCF的复杂性,有许多例外情形,很难在个人测试中逐一照顾周全, 需要社区协同测试,以暴露BUG。 总体来说,xdefla很不错,可在其基础上适配新样本。