一、OLLVM混淆工具
OLLVM是一種針對LLVM框架的混淆器,通過改變代碼的結構和控制流程等方式來隱藏程序的真實邏輯,從而增加程序的安全性。
一般而言,混淆的目標包括:1) 使程序的靜態分析變得困難,增加逆向破解的難度;2) 對抗動態分析,如反調試和反病毒軟體等。
OLLVM的混淆層次可以分為三個:基本混淆、掩蓋混淆和複雜混淆。其中,掩蓋混淆指讓分析人員無法輕易地發現控制流程,使程序難以靜態分析;複雜混淆指在程序中添加大量虛假代碼,使逆向分析者需要大量時間來區分真偽代碼。
下面是一段基於Foo函數的基本混淆示例:
define i32 @Foo(i32 %0, i32 %1) {
entry:
%add = add i32 %1, %0
%cmp = icmp sgt i32 %add, 5
%sub = sub i32 %add, 1
%tobool = icmp ne i32 %add, 1337
%sel = select i1 %cmp, i32 %sub, i32 %add
%ret = select i1 %tobool, i32 0, i32 %sel
ret i32 %ret
}
二、OLLVM技能
OLLVM不僅具有混淆功效,還有其他實用技能。
其中一項比較值得注意的技能是:增加對新硬體和新架構的支持。由於硬體和架構的升級變化不斷,因此需要保持對新型號的兼容性。如果沒有類似OLLVM這樣的框架,代碼的遷移或者編譯調試會非常繁瑣。
此外,OLLVM還支持目標平台的錯誤注入。這項技能的主要應用場景是:在程序執行的過程中,通過意外注入、修改,刻意製造錯誤,從而達到測試目的,可有效降低程序崩潰風險。
三、OLLVM台詞
由於OLLVM經常用於程序混淆,其名字也被玩弄了起來,如下:
1、Oblivious LLVM(不知道的LLVM)
2、Offensive LLVM(攻擊性的LLVM)
3、Onion LLVM(洋蔥式的LLVM)
4、Obfuscating LLVM(混淆的LLVM)
當然,這裡還有一些基於名字的「梗」(僅供娛樂):
1、LLVM is Everywhere, OLLeVM is Everywhere Also
2、Life is short, Use OLLeVM
3、Trust no one, trust OLLeVM
四、OLLVM加強
針對OLLVM的一些不足,研究者也開展了多項加強研究。
1、優化混淆策略,以更好地保護程序。例如,引入AST基於push/pull模型的控制流混淆,動態混淆等等。
2、增加正確性保證和安全性證明。是為了避免混淆過程中帶來的副作用,例如混淆後程序無法運行,或者在混淆後易受攻擊等問題。
3、為高階編譯器提供使用便利性。例如,加強對日常編程語言(如Python、Java、Rust、Go)的支持。
代碼示例
以下是一段基於OLLVM的混淆代碼示例:
int Foo(int a, int b)
{
int c = a + b;
c = c > 5 ? (c - 1) : c;
c = c != 1337 ? c : 0;
return c;
}
在經過OLLVM混淆後:
define i32 @Foo(i32 %0, i32 %1) {
entry:
%add_1 = add i32 %1, %0
%0x = and i32 %add_1, 0x7fffffff
%shr_1 = ashr i32 %add_1, 31
%add_2 = add i32 %0x, %shr_1
%cmp = icmp sgt i32 %add_2, 5
%sub = sub i32 %add_2, 1
%0x_1 = and i32 %sub, 0x7fffffff
%shr = ashr i32 %sub, 31
%and = and i32 %shr, -4
%tobool = icmp ne i32 %add_1, 1337
%sel = select i1 %cmp, i32 %0x_1, i32 %and
%ret = select i1 %tobool, i32 0, i32 %sel
ret i32 %ret
}
可以看到,原有的代碼被修改,並添加了很多無實際意義的指令,增加了逆向破解的難度。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/280784.html
微信掃一掃
支付寶掃一掃