Android SO檔案保護OLLVM混淆加固——混淆篇(二)
國慶假期,別人都玩的玩,回家的回家,我索性無聊,品一杯香茶,記一篇部落格,望能夠對這方面的網友有所幫助。。。。。
*************************************************************************
記上一次對JNI介面函式的混淆有一段時間了,沒看的網友可以看這裡:點選開啟連結;
今天我們分析最近在移動端比較火的原始碼級別的編譯混淆OLLVM,除了各大論壇的壓軸題用到了此技術,包括各移動加固廠商也相繼用到了此技術,說明此技術的重要性,下面開搞。。
原理篇:
這裡我們需要明白幾個重要問題:
1.LLVM是什麼?
2.OLLVM又是什麼?
3.為什麼這個可以用到Android的編譯上?
對於第一個問題:
曰:LLVM是一個編譯器框架,由於設計上的眾多優點,被很多編譯器所採用,比如知名的Clang,現在最大的支援方為蘋果公司,至於它具體的優點,設計等等,網上很多,總之很牛掰。
對於第二個問題:
曰:LLVM-Obfuscator 是瑞士西北應用科技大學安全實驗室針對LLVM編譯元件開發的代
碼混淆工具,該工具完全開源,目的是為了增加逆向工程的難度,保證程式碼的安全性。
我們可以把這個OLLVM這個結合到ndk中使我們產生編譯產生混淆程式碼,後面會細講。
對於第三個問題:
曰:對於android4.4以後引入ART機制,增加了llvm編譯器的分量,我們來看一下這個圖:
實現篇:
環境:Ubuntu 14.04 64bit
步驟:
第一步:
先將ndkllvm.tar(附件會給出)解壓到 /opt 目錄中 命令如下
$ sudo tar -xv -f ndkllvm.tar -C /opt
第二步:
配置環境變數
$ vim ~/.profile //在檔案末尾新增
export LLVM=/opt/Android-ndk-r10b
如圖:
第三步:
載入環境變數
$ source ~/.profile
第四步:
然後可進入 llvm_project/hello 目錄 通過
$ $LLVM/ndk-build // 進行編譯專案了
注意:
這個可能會遇到點小問題,由於時間比較早了我記不太清了,好像是缺少一部分32位的庫,百度一發網上有解決辦法。
這裡我們拿我之前寫的一個反除錯工程,進行操作,以便看的剛清楚,原始碼會放到後面。
我們在編譯前:
注意:
第一:把對應的xxx.c或者xxx.cpp檔案放在llvm_project/hello/jni目錄下面;
第二:編寫正確的與之對應的Android.mk檔案(如果用Android studio要注意);
如圖所示:
最後在AK下面重編譯打包,OK,執行結果是:
混淆的效果:
使得IDA的空格鍵失效顯示不了控制流圖,這個不知道為什麼會這樣?以前混淆過後的控制流圖變的異常的複雜。
在後面我會總結針對這兩種較為流行混淆的反混淆以及逆向破解方法。
總結篇:
環境搭建的核心步驟:
第一步:
先將 ndkllvm.tar 解壓到 /opt 目錄中 命令如下
$ sudo tar -xv -f ndkllvm.tar -C /opt
第二步:
然後 配置環境變數
$ vim ~/.profile //在檔案末尾新增
export LLVM=/opt/Android-ndk-r10b
第三步:
載入環境變數
$ source ~/.profile
第四步:
然後可進入 llvm_project/hello 目錄 通過
$ $LLVM/ndk-build
注意的問題:
第一:補充32位的依賴庫;
第二:把對應的xxx.c或者xxx.cpp檔案放在llvm_project/hello/jni目錄下面;
第三:編寫正確的與之對應的Android.mk檔案(如果用Android studio要注意);