-
-
[原创]OLLVM (二)条件跳转分支混淆
-
发表于: 2025-6-15 17:37 666
-
最近学习了OLLVM,代码工程链接。我对原有代码添加了注释并做了代码分析。
以ll文件中的语句举例。
混淆前:
混淆后:
sw.bb4模块代码对比图:

@_Z9calculateddc_IndirectBrTargets是目标块地址加密数组:
首先定义了一个全局数组@_Z9calculateddc_IndirectBrTargets,它包含两个指针:
在sw.bb4基本块中:
这个代码是在实现某种控制流混淆(control flow obfuscation)技术:
本质上,这段代码等价于:
但使用了复杂的间接跳转来实现相同功能。
这种技术使得静态分析难以确定控制流的目标,增加了逆向工程的难度。
逻辑在NumberBasicBlock内。目标基本块下文简写为目标块。
逻辑在getIndirectTargets0函数内。根据目标块的地址加上一个随机的偏移,计算出一个新的地址,这个地址是目标块加密后的地址,多个目标块加密后的地址组成一个加密地址数组,例如:
这就是上文混淆后的加密地址数组。所谓的加密是指目标块地址加了-3224706807后,就是加密了。
TODO 待分析
TODO 待分析
遍历函数中的所有基本块找到其中的条件分支,判断条件分支的所有后继模块是否被第1步收集到,被收集到的情况下将其替换为间接跳转,转换前后对比:

相关代码:
相关代码:
相关代码:
double calculate(double a, double b, char op) {
printf(calculate_print_format, a, b, op);
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/':
if (b != 0)
return a / b;
else
// return 0.0 / 0.0; // NaN
return -1; // NaN
default:
// return 0.0 / 0.0; // NaN
return -1; // NaN
}
}
sw.bb4: ; preds = %entry
%10 = load double, ptr %b.addr, align 8
%cmp = fcmp une double %10, 0.000000e+00
br i1 %cmp, label %if.then, label %if.else
sw.bb4: ; preds = %entry
%10 = load double, ptr %b.addr, align 8
%cmp = fcmp une double %10, 0.000000e+00
%11 = select i1 %cmp, i64 1, i64 0
%12 = getelementptr [2 x ptr], ptr @_Z9calculateddc_IndirectBrTargets, i64 0, i64 %11
%EncDestAddr = load ptr, ptr %12, align 8
%13 = getelementptr i8, ptr %EncDestAddr, i64 3224706807
indirectbr ptr %13, [label %if.then, label %if.else]
@_Z9calculateddc_IndirectBrTargets = private global [2 x ptr] [ptr getelementptr (i8, ptr blockaddress(@_Z9calculateddc, %if.else), i64 -3224706807), ptr getelementptr (i8, ptr blockaddress(@_Z9calculateddc, %if.then), i64 -3224706807)]
if (b != 0.0)
goto if_then;
else
goto if_else;
@_Z9calculateddc_IndirectBrTargets = private global [2 x ptr] [ptr getelementptr (i8, ptr blockaddress(@_Z9calculateddc, %if.else), i64 -3224706807), ptr getelementptr (i8, ptr blockaddress(@_Z9calculateddc, %if.then), i64 -3224706807)]
[培训]《冰与火的战歌:Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
最后于 6天前
被不歪编辑
,原因:
赞赏
他的文章
赞赏
雪币:
留言: