我是一名從事反欺詐&風控&設備指紋相關的工作,最近對ollvm的如何逆向的問題進行了學習與思考。
ollvm是一個開源免費的so混淆工具,對于逆向的小白來說簡直是災難性的存在。
這個例子是超簡單,我想每個人都可以學會跟掌握,
先上案例看看效果
我使用ollvm混淆了
libmyapplication4.so(附加),這個例子是針對test3()方法進行反混淆
ollvm的混淆打滿
1 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
將libmyapplication4.so拖進ida,ida方法中搜索test3
ollvm混淆后的流程圖如下?
對應的按F5 返混淆的結果如下,代碼沒法看,總共兩百多行?使用基于unidbg開發的反ollvm 反混淆后的流程圖如下:
?按F5反匯編代碼如下:
相關的unidbg代碼在附件中,放到開源的unidbg中運行即可。接下來我講講原理吧。
原理篇
首先講講網上開源的跟一些前輩的處理方案,網上的處理方案比較復雜,大體流程如下:
1 收集代碼塊,這個代碼塊包含cesl指令向左還有向右收集一遍,收集代碼塊可以使用unidbg,hook代碼塊并對應執行對應方法,從而將代碼塊集合收集到
2 利用ollvm虛假代碼塊的特征將虛假代碼塊進行過濾,
3 將真實的代碼塊串聯起來。寫入so
我也跟著做了一遍,發現第1步非常容易出錯,一旦出錯某些代碼塊就沒有執行到,得到的結果是代碼出現丟失。那么腳本的兼容性就很難。
第2步,網上的前輩針對虛假代碼塊過濾也是寫了一大堆代碼,想理解起來也是比較麻煩,而且效果也不佳。
針對以上問題,讓問題變得更簡單兼容性更好,我的改進如下:
1 我直接執行一遍,將所有的代碼塊收集起來,不管它cesl指令。這里有個非常關鍵的地方是,真實的代碼塊只會執行一遍,如果如果代碼塊集合中已經存在,則不要添加進去,否則導致的結果是代碼丟失
2 根本不需要對虛擬代碼塊進行過濾,反混淆后,我們將真實執行的代碼塊串聯了起來,它們在F5逆向之后,并不會產生干擾代碼。其實最終的目的不就是為了看源碼嗎
最后如何將代碼塊串起來可能很多初學者無法理解。其實原理很簡單
將收集的代碼塊進行迭代,取當前的代碼塊最后一條指令地址,取下個代碼塊首個指令地址,算出跳轉過去要跳幾個自己,源碼中有,然后將當前代碼塊的最后一條執行改為B 跳轉
?