h5馬甲包從需求到提審需要四步驟
H5項目的出包任務分為四步:1.新建工程和基礎代碼 2.將美術資源和出包需求導入工程項目 3.(最重要的部分)進行代碼混淆 4.打包成ipa(分為debug包和release包)
前面的1、2步就不在這里贅述。主要是針對第三步和第四步。
第三步代碼混淆是最重要的步驟,主要是因為h5的馬甲包因為核心內容就是一個url的鏈接部分,其他工具等代碼部分高度相似,項目與項目之間又沒什么差別,所以如果不在這一步做好很容易被4.3打回。所以代碼混淆算是h5或是整個馬甲包工作的重心。
常用的代碼混淆方法無外是修改工程名、修改類名、方法名等等。還有一些info文件或者資源文件的更換(或者用winhex改變二進制代碼達到修改md5的目的)。在調查之后聽說蘋果審核機制中會對代碼細節做要求,可能以上簡單的混淆方法就不那么實用。結合Stanford的moss算法(代碼查重的算法,與數據流方向和語法樹有關),在想是否能有一種方法可以在編譯的時候改變程序的語法樹或者數據流方向。
抱着這種疑問,我去調查了目前市面上一些商用的“代碼加固”的產品。其實“代碼加固”和“代碼混淆”從目的來看是屬於同一個概念。市面上的代碼加固產品核心算法都是ollvm的變體等等,可以很好的達到混淆的目的。那么我們是否可以使用這種算法來混淆呢?
個人整理
獲得ollvm(從此往下 代碼可能並不能直接使用,需要根據注釋和實際情況調整)
1 $ git clone https://https://github.com/heroims/obfuscator.git 2 $ mkdir build
---------------------------------------------注意git的地址和build的地址非常重要 3 $ cd build
---------------------------------------------下面這行代碼輸入后 需要經過很長的編譯安裝時間 4 $ cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/ 5 $ make -j7
xcode集成
XCode里集成需要看版本,XCode10之前和之后是一個分水嶺,XCode9之前和之后有一個小配置不同。(因為10版本之后 xcode添加的toolschain打包的ipa不能發布,所以只能采用Xcode9版本,之后會遇到問題)
修改Info.plist
$ cd /Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins/ $ sudo cp -r Clang\ LLVM\ 1.0.xcplugin/ Obfuscator.xcplugin $ cd Obfuscator.xcplugin/Contents/ $ sudo plutil -convert xml1 Info.plist $ sudo vim Info.plist
用vim操作(操作指令 a 是insert :wq 是保存退出 )
修改下面幾項
<string>com.apple.compilers.clang</string> -> <string>com.apple.compilers.obfuscator</string> <string>Clang LLVM 1.0 Compiler Xcode Plug-in</string> -> <string>Obfuscator Xcode Plug-in</string>
修改Obfuscator.xcspec
$ sudo plutil -convert binary1 Info.plist $ cd Resources/ $ sudo mv Clang\ LLVM\ 1.0.xcspec Obfuscator.xcspec $ sudo vim Obfuscator.xcspec
Apple LLVM 8.0 不一定是 8.0
Obfuscator 4.0 不一定是 4.0
具體看你下載的版本和電腦安裝的版本
Identifier = "com.apple.compilers.llvm.clang.1_0"; -> Identifier = "com.apple.compilers.llvm.obfuscator.4_0";
Name = "Apple LLVM 8.0"; -> Name = "Obfuscator 4.0";
Description = "Apple LLVM 8.0 compiler"; -> Description = "Obfuscator 4.0";
Vendor = Apple; -> Vendor = HEIG-VD;
Version = "7.0"; -> Version = "4.0";
修改ExecPath的地址為當前build/bin的地址(!重點) 剛剛編譯出來的bulid 文件夾下的bin目錄路徑 例如 /Users/你的用戶名/xxx/bulid/bin/clang
ExecPath = "clang"; -> ExecPath = "/path/to/obfuscator_bin/clang";
最后一步
Apple\ LLVM\ 8.0.strings 不一定是 8.0
Obfuscator 4.0.strings 不一定是4.0
$ cd English.lproj/
$ sudo mv Apple\ LLVM\ 8.0.strings "Obfuscator 4.0.strings"
$ sudo plutil -convert xml1 Obfuscator\ 4.0.strings
$ sudo vim Obfuscator\ 4.0.strings
"Description" = "Apple LLVM 8.0 Compiler"; -> "Description" = "Obfuscator 4.0";
"Name" = "Apple LLVM 8.0"; -> "Name" = "Obfuscator 4.0";
"Vendor" = "Apple"; -> "Vendor" = "HEIG-VD";
"Version" = "8.0"; -> "Version" = "4.0";
以上 算是安裝成功
接下來 需要打開 xcode 進行設置
Enable Bitcode Enable Index-While-Building Functionality 都選NO
Enable Testablity 選 YES
然后編譯器選擇剛剛添加的 Obfuscator X.0 就好了
在編譯前進行參數設置 (在other c flags )
控制流扁平化
這個模式主要是把一些if-else語句,嵌套成do-while語句
-mllvm -fla:激活控制流扁平化
-mllvm -split:激活基本塊分割。在一起使用時改善展平。
-mllvm -split_num=3:如果激活了傳遞,則在每個基本塊上應用3次。默認值:1
指令替換
這個模式主要用功能上等效但更復雜的指令序列替換標准二元運算符(+ , – , & , | 和 ^)
-mllvm -sub:激活指令替換
-mllvm -sub_loop=3:如果激活了傳遞,則在函數上應用3次。默認值:1
虛假控制流程
這個模式主要嵌套幾層判斷邏輯,一個簡單的運算都會在外面包幾層if-else,所以這個模式加上編譯速度會慢很多因為要做幾層假的邏輯包裹真正有用的代碼。
另外說一下這個模式編譯的時候要浪費相當長時間包哪幾層不是鬧得!
-mllvm -bcf:激活虛假控制流程
-mllvm -bcf_loop=3:如果激活了傳遞,則在函數上應用3次。默認值:1
-mllvm -bcf_prob=40:如果激活了傳遞,基本塊將以40%的概率進行模糊處理。默認值:30
報錯代碼-90725
解決方法:
(1)下載一個xcode 10 ,直接用xcode 10 打包
(2)下載xcode 10,顯示包內容 通過以下路徑去找ios '高版本'的sdk
Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.2.sdk(高版本sdk) 將最后這個文件拷貝到xcode 9 下面的相同路徑下,把原有的 低版本的sdk 刪除掉重新編譯打包就可以上傳成功了
在觀察的是否混淆成功和混淆結果的時候可以使用 hopperdisassembler 網上有破解版