目的

  • 为了进一步增加应用的安全性,防止我们的应用程序很容易的被攻击者分析、破解、重打包,提高攻击者逆向分析应用的难度

应用的加固方案

  • 数据加密:静态字符串、本地存储和网络传输的加密
  • 静态混淆:类名、方法名、属性的混淆
  • 动态保护:反调试、注入检测、hook检测、越狱检测、签名检测等
  • 代码混淆:将代码分快、扁平化、增加干扰代码,以提高分析者的分析难度

下面结合具体应用场景说明下各个加固方案

  • 数据加密:在我们的应用中已经有了,对数据进行加密之后,实质上我们已经给攻击者提高了逆向分析的难度了,但是攻击者依然可能通过动态调试或者编写IDA脚本的方式来还原算法。

  • 静态混淆:程序中的类名和方法名,在逆向分析中只要通过class-dump获取程序中的所有类、定义的方法和属性,就能很快从名字中猜到某个方法的作用是什么,所以,我们就需要做混淆了。

    tips:
    1. 类名和方法名混淆有很多坑,一个类是通过文件、网络或者字符串动态获取的,如果被混淆了就会出错,相同名称但不同功能的参数进行混淆,也会造成错误,还有其他很多坑需要踩踩才知道了

    2. 目前AppStore对应用代码混淆的审核比较严格,一旦做了混淆,有可能会导致延迟审核或者直接驳回,具体可参考混淆上架风险参考1 和 混淆上架风险参考2

    有可能就很不幸就收到这样的审核反馈

    3. 那怎么办呢?别慌,我们可以对少量涉及核心业务的重要参数的生成做点混淆,然后试探试探

那么具体的静态混淆我们如何去做呢?
接下来就要get新技能啦~

我这里演示的是对方法名和属性的混淆,实质上就是就是字符串替换,最后抛出来的都是宏,可以跑脚本自动生成混淆后的乱七八糟的字符,我这里的脚本是网上搜的,当然有能力的可以自己写哟。

类名的混淆做法是相同的,参考链接,但是否需要对类名混淆可以依据实际的项目需求,当然这坑也是比较多的,踩踩才知道了,关于其他可能存在的问题还需要更多的摸索

  1. 首先创建一个demo工程,我的工程名是LFHelpers
    假设我现在需要对UIbutton+LFCategories文件中的imageDirectionWithButtonImageType方法做混淆,还有viewcontroller中的titles属性做混淆

调用的时候现在是这个样子的~

在开始混淆之前我们先来看看我class-dump出来的demo头文件(嘛?不懂怎么dump?别急,翻到文档最后就能知道啦~)

好嘛,完美的暴露了我的方法名和属性呀
那我们就开始混淆吧~

  1. 打开控制台,在工程文件夹中创建confuse.sh , func.list这两个文件,并拖到项目工程中

  2. 将以下脚本copy到confuse.sh文件中

#!/usr/bin/env bashTABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"
export LC_CTYPE=C#维护数据库方便日后作排重
createTable()
{
echo "create table $TABLENAME(src text, des text);" | sqlite3 $SYMBOL_DB_FILE
}insertValue()
{
echo "insert into $TABLENAME values('$1' ,'$2');" | sqlite3 $SYMBOL_DB_FILE
}query()
{
echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE
}ramdomString()
{
openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16
}rm -f $SYMBOL_DB_FILE
rm -f $HEAD_FILE
createTabletouch $HEAD_FILE
echo '#ifndef Demo_codeObfuscation_h
#define Demo_codeObfuscation_h' >> $HEAD_FILE
echo "//confuse string at `date`" >> $HEAD_FILE
cat "$STRING_SYMBOL_FILE" | while read -ra line; do
if [[ ! -z "$line" ]]; then
ramdom=`ramdomString`
echo $line $ramdom
insertValue $line $ramdom
echo "#define $line $ramdom" >> $HEAD_FILE
fi
done
echo "#endif" >> $HEAD_FILEsqlite3 $SYMBOL_DB_FILE .dump
  1. 创建pch文件,并在build Settings下的Prefix Header中填写相对路径

    这时候你在pch文件中导入codeObfuscation.h编译肯定是会报错的啦,codeObfuscation.h是在脚本中定义的,所你先将#import "codeObfuscation.h"注释掉吧,别急着编译~

  2. 运行脚本文件,在build Phases中添加

  3. 再打开控制台,打开项目目录,赋予confuse.sh权限


然后在func.list中写上需要混淆的方法名和属性

  1. 此时打开pch中的#improt “codeObfuscation.h” 的注释,command+b编译一下项目,查看build信息,编译成功啦,对应的混淆字符串也生成啦

我们现在来看看变成什么样子了~


点进去可以看到具体的宏定义


既然成功了,我们再看看现在再class-dump下会是什么样子的吧


没错,都变成了猜不出来的乱七八糟的字符了~
当然,从appstore中下载的app都是需要砸壳的,至于砸壳可以使用譬如pp助手这些三方的软件,弄出来.app后缀的包我们就可以使用class-dump对他进行分析了

  • 动态保护: 其实就是为了对项目进行动态保护,包括一些反反调试、注入检测、反注入、hook检测、完整性校验等功能 ,通俗的说就是防守,因此要学会防守,就要先会攻击吧
    我们也可以加入些风控类的SDK,可以用于分析评估风险

  • 代码混淆:属于汇编层的,在编译期做的混淆,前面的都是在编译之前做的静态字符串的混淆
    代码混淆也就是基于llvm定制代码混淆器
    llvm:

    • 可以理解为一个完整的编译架构,也就是一个编译器。它将源代码(.c或者.cpp或者.m等文件代码)生成与机器无关的中间代码,称之为IR。然后对产生的IR进行优化,生成对应的机器汇编语言。
    • llvm具有强大的可扩展性,可以通过自定制前端或者后端来使之支持编译你的语言,对应的就是将源码转为中间IR代码,或者中间IR代码转为指定的机器代码,即只需要实现指定的前端或者后端即可。
    • 对于LLVM来说,其前端是clang,在编译源码文件的时候使用的编译工具也是clang。而生成中间IR代码后需要对IR代码进行一些操作,例如添加一些代码混淆功能。LLVM的做法是通过编写Pass(其实就是对应的一个个类,每个类实现不同的功能)来实现混淆的功能。所以实现混淆,其实就是编写功能性的Pass。

简单点说llvm的功能就是通过代码混淆来增加一些无用的代码,增加一些乱七八糟的流程的,没有加混淆的时候,逆向破解时走的就像条直路,加上混淆之后,走的就是条弯路。做这些就是为了给攻击者增加静态分析的难度

感兴趣的可以搜搜如何基于llvm自定制代码混淆器,因为难度有点大,所以就有了三方的开源框架~

ollvm:基于llvm开发的一套开源的代码混淆工具,目前是基于llvm-4.0的。
下载地址
目前只要能调通即可直接使用
调试过程会比较复杂点,需要慢慢填坑,网上的资料比较少,这篇可以参考参考

  • 最后补充个关于 静态库混淆的

按理说可以不需要再对静态库进行混淆了,静态库已经是比较的安全了

但是可以了解下大概的思路:
由于编译器混淆是基于中间代码bitcode进行的,因此需要编译生成带bitcode的静态库,就可以直接提取其中的bitcode就行混淆了

具体做法:
在build Settings的Other C Flags中增加-fembed-bitcode参数,然后生成静态库,并将其拖入MachOView查看二进制文件
然后使用命令将MachOView中section里面生成的bitcode代码提取出来,使用带有混淆功能的clang将其重新编译成目标文件(这就要基于上面一条ollvm混淆工具进行啦),生成的xxx.o就是混淆后的object文件,然后将xxx.o重新打包成xxx.a(可使用命令行),最后将混淆后的静态库集成到app中,也是可以正常使用的,只是该静态库没有了bitcode,因为主工程中也不能开启bitcode


附:

  • class-dump:是一个用于从可执行文件中获取类、方法和属性信息的工具,其代码是开源的,分析过程中,通过该工具生成的头文件就可以快速找到想要的方法或属性。
    github地址
    安装包地址

安装方法:

  1. 打开安装压缩包后,将class-dump复制到/usr/local/bin/class-dump 下

  2. 打开命令行执行命令:sudo chmod 777 /usr/local/bin/class-dump 赋予其执行权限

  3. 可以输入class-dump查看用法

  4. 提取头文件的方法
    class-dump -H 需要导出的框架路径 -o 导出的头文件存放路径
    例如:

注意,必须是对可执行文件进行提取哦, xcode运行工程可以在products下的.app包中获取

如果是appstore下载的,就要先砸壳,获取到.app后缀的包再进行提取

  • 另外,由于做代码混淆是比较复杂与繁琐的,并且还面临着苹果公司的严酷审核,也有很多公司选择用三方的加固工具
    除了ollvm,以下列举其他集中常用的三方

    • 爱加密
    • 网易iOS加固
    • 360iOS加固
    • 数字遁甲iOS加固
    • 顶象iOS加固
      关于这些三方加固方案验证比较的结果,可以参考以下这些文档
      参考文档1
      参考文档2
      参考文档3

作者简介

就职于甜橙金融 ( 翼支付 ) 信息技术部,负责iOS客户端开发

iOS代码混淆的探索相关推荐

  1. ios APP加密探究几维安全iOS 代码混淆效果参考

    几维安全ios代码混淆效果参考: 什么是加密 加密是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,做一些额外的工作.大多数病毒就是基于此原理. 加密作用 加壳的程序可以有效阻止对程序 ...

  2. APP加密,ios代码混淆工具,虚拟化技术 适用于移动应用程序的虚拟化加密软件

    概述: KiwiVM是用于移动应用程序的虚拟化加密软件. 它基于Clang编译器扩展,并且在编译项目时虚拟化指定的函数.借助自定义CPU指令的功能,一旦对代码进行加密并且从未解密,攻击者将无法恢复代码 ...

  3. ios代码混淆小工具

    一  绪言 写在前面的话:之前做了五年ios开发,现在转了开发方向(数据科学/大数据),今天帮以前ios开发小组的同学,写了一个ios代码混淆小工具,下面介绍下. 这种方式不是最佳方案,更好的方案是c ...

  4. iOS代码混淆安全加固

    文章目录 自己创建脚本文件进行代码混淆 iOS代码自动混淆 最近公司扫描App漏洞,提出要给App做代码混淆加固,以提高反编译逆向难度.对于Android应用直接用360安全加固即可:但对于iOS应用 ...

  5. Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)

    前言 最近一直在看Python,也很喜欢Python的灵活性:今天主要想说的是iOS的代码混淆,为什么想做代码混淆?为了APP的安全,为了防止别人破壳轻易破解我们代码:还有就是做 马甲包 了,我们知道 ...

  6. 【工具】iOS代码混淆工具-iOS源码混淆

    最新更新记录 V2.0.3(2022年12月11日)更新内容: 1.新增导入映射列表的逻辑: 2.优化修复其他混淆逻辑: 3.更新地址 - github 主要功能 ZFJObsLib是专业的iOS源码 ...

  7. iOS代码混淆原理初探

    我们在手游平台SDK的iOS版本中, 除了AppStore官方支付之外还集成了第三方支付(微信支付H5和支付宝支付H5版本). 如果用于企业签,不需要做处理,直接使用即可. 但是如果需要上架AppSt ...

  8. python混淆ios代码_XSDK——iOS代码混淆原理

    我们在XSDK的iOS版本中, 除了AppStore官方支付之外还集成了第三方支付(微信支付H5和支付宝支付H5版本). 如果用于企业签,不需要做处理,直接使用即可. 但是如果需要上架AppStore ...

  9. iOS 代码混淆 垃圾代码

    app风靡的时代,总有一些奇葩的需求. 为了刷量,刷排名,制作壳包,为了通过苹果爸爸审核,想到代码混淆,垃圾代码等策略. 作为一名程序员,怎么办? 爬了一些文章博客.总的来说有一下几方面: 字符串加密 ...

最新文章

  1. 软件需求分析文档模版
  2. jbpm4.4+ssh配置
  3. LeetCode 68. 文本左右对齐(字符串逻辑题)
  4. 【Servlet】Servlet的多线程并发情况
  5. 团体程序设计天梯赛-练习集L1-023. 输出GPLT
  6. logback为日志配置颜色
  7. jquery图表统计插件-highcharts详解
  8. one loop per thread
  9. Linux安装Zabbix
  10. JavaScript 视频、图片转成Base64格式
  11. Frobenius标准型与Jordan标准型总结
  12. python处理adb截屏_《自拍教程38》Python_adb一键截屏
  13. awk命令详解(二)
  14. 怎么通过微信开发者工具打开一个项目
  15. powerbuilder 实验室信息协同管理系统开源项目
  16. java webclient使用_spring5 webclient使用指南详解
  17. 图形编辑器:工具管理和切换
  18. Xamarin For VS 3.9.236 破解
  19. [JSP] 利用application来写一个网页计数器
  20. 三坐标测圆的直径怎么测_三坐标测量机测针的选择和校准

热门文章

  1. AP发现AC过程——CAPWAP协议详解
  2. 币圈神话的成就者,谷歌团队首发PlusFo
  3. 基于深度学习的语音识别研究-CTC理论推导(四)
  4. 在Qt Creator中的pro文件添加lib库
  5. 【存储知识】NAS存储
  6. Https 网站 访问 Http资源
  7. go语言基于time.After通道超时设计和通道关闭close
  8. 未来的计算机320学作文,320字的作文四年级
  9. 人生第一笔试加面试 SAP胜略
  10. 【小白爬POJ2431】3.6 探险车加油问 Expedition