iOS开发app相关iOS APP加固保护

iOS代码混淆的探索

2019-05-15  本文已影响15人  miracle洛洛

目的

应用的加固方案

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

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

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

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

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

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


    image.png
image.png

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


image.png

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


image.png image.png image.png

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

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


    image.png
image.png
  1. 将以下脚本copy到confuse.sh文件中
#!/usr/bin/env bash

TABLENAME=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
createTable

touch $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_FILE


sqlite3 $SYMBOL_DB_FILE .dump
  1. 创建pch文件,并在build Settings下的Prefix Header中填写相对路径


    image.png

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


image.png
  1. 运行脚本文件,在build Phases中添加


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


    image.png

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


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


    image.png

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

image.png image.png image.png

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


image.png

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

image.png image.png image.png

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

简单点说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


附:

安装方法:

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

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

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


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


    image.png

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


image.png

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

作者简介

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

上一篇下一篇

猜你喜欢

热点阅读