美文网首页
iOS混淆调研-基于llvm

iOS混淆调研-基于llvm

作者: revivefsd | 来源:发表于2021-01-21 19:09 被阅读0次

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

    相关文章

      网友评论

          本文标题:iOS混淆调研-基于llvm

          本文链接:https://www.haomeiwen.com/subject/vqvdzktx.html