iOS混淆调研-基于llvm
关于iOS混淆-基于llvm
在此之前,你需要先了解 llvm
源码: https://github.com/microsoft/llvm
文档: https://releases.llvm.org/11.0.1/docs/index.html
在巨人的肩膀上:https://www.zhihu.com/column/llvm-clang (帮助我们快速了解,对于基础不好且没有大量时间阅读源码的你)
关于混淆:
一: o-llvm
目前市面上大部分的混淆,都是基于o-llvm 基础修改实现的。
ollvm源码:https://github.com/obfuscator-llvm/obfuscator.git;
目前支持的版本为llvm-4.0版本,有其他pull最高可以支持到8.0,尚未对8.0的pull进行测试。手动配置也是先用cmake编译,build目录下编译成功“clang4.0”可执行文件即视为编译成功。
配置可以参考:https://www.cnblogs.com/exchen/p/10352687.html
二:Hikari
1.Giuhub
https://github.com/HikariObfuscator/Hikari/releases
2.版本支持:
hikari也是基于o-llvm基础修改实现的,目前支持llvm-8.0版本,xcode11和xcode10版本.并且支持了非bitcode模式。
3.安装包
安装包:https://mega.nz/file/m4ciGKya#JiTib0ax6N10htUmmkFicNjYtL0ZnwU2F_HRhMcRaqY
密码:StarNightSnow
源码:https://codeload.github.com/HikariObfuscator/Hikari/zip/20200504
4.源码编译说明
参考:https://github.com/HikariObfuscator/Hikari/wiki/Compile-&-Install
4.1安装工具:
Cmake: brew install cmake
Ninja: brew install ninja
4.2 执行命令
git clone --recursive -b release_80 https://github.com/HikariObfuscator/Hikari.git Hikari && cd Hikari && git submodule update --remote --recursive && cd ../ && mkdir Build && cd Build && cmake -G "Ninja" -DLLDB_CODESIGN_IDENTITY='' -DCMAKE_BUILD_TYPE=MinSizeRel -DLLVM_APPEND_VC_REV=on -DLLDB_USE_SYSTEM_DEBUGSERVER=YES -DLLVM_CREATE_XCODE_TOOLCHAIN=on -DCMAKE_INSTALL_PREFIX=~/Library/Developer/ ../Hikari && ninja &&ninja install-xcode-toolchain && git clone https://github.com/HikariObfuscator/Resources.git ~/Hikari && rsync -a --ignore-existing /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/ ~/Library/Developer/Toolchains/Hikari.xctoolchain/ && rm ~/Library/Developer/Toolchains/Hikari.xctoolchain/ToolchainInfo.plist
4.3 命令解释
(1)创建Hikari 文件夹,下载git代码,创建 Hikari 同级目录build文件夹,用来存放cmake编译后的产物
$ git clone --recursive -b release_80 https://github.com/HikariObfuscator/Hikari.git Hikari
$ cd Hikari
$ git submodule update --remote --recursive
$ cd ../
$ mkdir Build
$ cd Build
(2)使用cmake编译源码,-DLLDB_CODESIGN_IDENTITY='' 舍弃lldb配置;-DCMAKE_BUILD_TYPE=MinSizeRel 工程编译生成的版本类型(Debug , Release , RelWithDebInfo 和 MinSizeRel )MinSizeRel :与release模式相比,此模式更加倾向于最小代码编译优化,而不是速度优先。 后面几个参数都是cmake的一些编译配置。一般来说在build的bin目录下生成了clang可执行文件就是成功
$ cmake -G "Ninja" -DLLDB_CODESIGN_IDENTITY='' -DCMAKE_BUILD_TYPE=MinSizeRel -DLLVM_APPEND_VC_REV=on -DLLDB_USE_SYSTEM_DEBUGSERVER=YES -DLLVM_CREATE_XCODE_TOOLCHAIN=on -DCMAKE_INSTALL_PREFIX=~/Library/Developer/ ../Hikari
(3)使用 ninja 安装 toolchain
$ ninja
$ ninja install-xcode-toolchain
(4)下载资源文件到用户目录下
$ git clone https://github.com/HikariObfuscator/Resources.git ~/Hikari
(5)把Xcode.app/xctoolchain下的文件copy到Library/Developer/Toolchains/Hikari.xctoolchain下,copy过程忽略同名文件,只更新Hikari.xctoolchain下不存在文件,一些其他编译文件等。注意这里的路径Xcode.app需要修改自己实际的xcode命名,绝对路径
$ rsync -a --ignore-existing /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/ ~/Library/Developer/Toolchains/Hikari.xctoolchain/
(6)移除多copy过来的ToolchainInfo.plist文件
$ rm ~/Library/Developer/Toolchains/Hikari.xctoolchain/ToolchainInfo.plist
4.4 使用
作者: https://github.com/HikariObfuscator/Hikari/wiki/Usage
(作者的wiki非常清楚,尽可能全部阅读,如果英文不好可以在谷歌浏览器打开用中文模式阅读)
简书用户链接: https://www.jianshu.com/p/1219b5a84ad2 <--有图有真相
详情:
在 Build Settings -> Other C Flags 中加入混淆标记
-mllvm -enable-bcfobf 启用伪控制流
-mllvm -enable-cffobf 启用控制流平坦化
-mllvm -enable-splitobf 启用基本块分割
-mllvm -enable-subobf 启用指令替换
-mllvm -enable-acdobf 启用反class-dump
-mllvm -enable-indibran 启用基于寄存器的相对跳转,配合其他加固可以彻底破坏IDA/Hopper的伪代码(俗称F5)
-mllvm -enable-strcry 启用字符串加密
-mllvm -enable-funcwra 启用函数封装
-mllvm -enable-allobf 依次性启用上述所有标记
4.5 其他说明参考wiki:https://github.com/HikariObfuscator/Hikari/wiki
4.6其他参考:
https://www.jianshu.com/p/9fc7776cce9b
https://blog.csdn.net/deft_mkjing/article/details/84943381
4.8 删除-如果想移除
截屏2021-01-21 下午7.29.25.png三: 关于ipa混淆
1.bitcode:必须打开,都是基于bitcode的中间文件进行混淆
2.关于bitcode:
http://xelz.info/blog/2018/11/24/all-you-need-to-know-about-bitcode/
3.过程
1.解析iPA、.xcarchive、.a、等各种格式
2.提取Xar: xar -d - -f input
3.解析Xml:用python的ET.fromstring(xmlfile)去解析
4.提取所有的.o文件、提取所有的clang 的编译命令和ld的链接命令参数
5.给每个.o加上混淆参数生成混淆后的.o
6.链接生成最终的混淆后的iPA
以前使用开启bitcode的.a静态库进行测试,可以获取到所有的.o文件,首先从.a文件的二进制文件中分离出需要的架构arm64架构对应的二进制文件,再使用ar命令获取它包含的所有.o即.m文件。因为必须开启bitcode,目前没有继续看这个方向。