iOS混淆调研-基于llvm

2021-01-21  本文已影响0人  revivefsd

关于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,目前没有继续看这个方向。

上一篇下一篇

猜你喜欢

热点阅读