美文网首页
iOS安全/代码混淆

iOS安全/代码混淆

作者: flyrees | 来源:发表于2017-12-20 10:17 被阅读0次

    APP 一般经常做的网络参数加密解密,加密方法有base64、MD5、AES、RSA、DES等加密方法、这些加密一般都是给数据进行加密、防止数据外漏。但是今天我要介绍的是防范反汇编风险,防止咋们APP的代码让别人反编译,不过Apple还算安全反编译过来也只能看到.h文件。不过为了安全起见我们还是将代码进行混淆,这样比较安全些。

    一、先介绍下反编译工具 class-dump 的使用
    class-dump 的安装这里就先不介绍了、可以参考网上资料。class-dump的使用很简单(默认你已经安装class-dump),现将ipa后缀改为zip:

    屏幕快照 2017-12-19 16.11.40.png 51DF8F1A-DA17-47C6-A0AD-E55ACFE29202.png 7E47CACC-2A7D-481D-B50C-B19F010746DB.png EDE1D3A5-5893-4644-988C-18AF455E70C3.png

    这里的ipa包不可以是AppStore上下载的、因为AppStore上下载的ipa包、Apple是又经过加密的、需要自己破壳,想知道怎么给AppStore下载的ipa进行破壳,看iOS应用逆向工程。
    将zip解压、得到app二进制文件,下面就使用class-dump将app进行反编译:打开Terminal:输入命令 class-dump -H app二进制文件路径 -o 反编译后.h文件的存放路径

    97087D05-DA9C-450B-8522-E361EF61C035.png

    回车后就得到了反编译的.h文件

    3AF106BD-50B9-42C5-A1BA-DE0A0F9CAFA1.png

    class-dump 功能很强大,只是在终端输入一行命令,就可以反编译app的二进制文件,得到所有.h 文件。以下就是为了防止反编译,通过分下.h文件,对咋们的app进行一些操作(外挂就是这么来的),所以要将我们.h文件中的代码进行混淆,即使反编译得到.h文件,也很难分析。

    二、将代码进行混淆

    1.在项目根目录下新建confuse.sh 和 gbFunc.list 文件

    说明:
    confuse.sh 文件在编译过程中会执行gbFunc.list 用于自动混淆代码时,存放过滤出来需要混淆的方法名

    touch confuse.sh
    touch gbFunc.list

    4FB867FF-E1C9-4C25-95C1-5476C609F618.png

    2.新建PFConfuse.h

    说明:

    GBConfuse.h 是在自动混淆代码时,将会把自动生成的字符串定义成宏,存放在此文件,也便于查看。

    D714AA6F-B08E-4E30-A40F-A4C611660CB6.png

    注意:需要把.h文件移到项目文件外,因为放项目文件中,到时被反编译过来,还是能得到GBConfuse.h里面的东西的,就能通过比对,得到方法。(后面用class-dump反编译过来就明白了...)

    940FC2F1-1058-4DDA-A011-369C827623D1.png

    3.在confuse.sh中添加如下代码、(先看下效果、代码在下面)


    E06A974A-B8EF-41EB-9563-2164A9CA26CD.png
    48E68609-8BF7-4CD0-A3FA-38AABB43C326.png
    AE50DA1D-09B8-4123-9ACB-4EDB15EDC095.png

    下面是要复制代码:

    !/usr/bin/env bash

    TABLENAME=symbols

    SYMBOL_DB_FILE="symbols"

    func.list路径

    STRING_SYMBOL_FILE="$PROJECT_DIR/GBFunc.list"

    项目文件路径

    CONFUSE_FILE="$PROJECT_DIR/SafetyTest"

    Confuse.h路径

    HEAD_FILE="$PROJECT_DIR/PFConfuse.h"

    export LC_CTYPE=C

    取以.m或.h结尾的文件以+号或-号开头的行 |去掉所有+号或-号|用空格代替符号|n个空格跟着<号 替换成 <号|开头不能是IBAction|用空格split字串取第二部分|排序|去重复|删除空行|删掉以init开头的行>写进func.list

    grep -h -r -I "^[-+]" $CONFUSE_FILE --include '.[mh]' |sed "s/[+-]//g"|sed "s/[();,: ^/{]/ /g"|sed "s/[ ]</</"| sed "/^[ ]IBAction/d"|awk '{split($0,b," "); print b[2]; }'| sort|uniq |sed "/^$/d"|sed -n "/^PFSAFE_/p" >$STRING_SYMBOL_FILE

    维护数据库方便日后作排重,以下代码来自念茜的微博

    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 PFConfuse_h

    define CodeConfuse' >> $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

    需要修改的代码在于文件路径:

    83B95390-DB79-4D48-988E-EE3809B5CA1C.png 2743BBF1-615D-4D9C-888C-26A4989F81BC.png

    4.添加 Run Script

    屏幕快照 2017-12-19 17.27.51.png 屏幕快照 2017-12-19 17.29.10.png

    5.添加 PCH 文件


    EF1595F9-8343-4C84-ABE7-C09AFB92D6E4.png 7EE419AF-E74F-4673-AA8A-FF739CD38F3E.png

    引用.h文件

    90029585-213D-49F0-BE92-AE0B6FBAFD45.png

    6.添加以 "PFSAFE_"为前缀的方法(以PFSAFE_为前缀的方法就是要混淆代码的方法)

    A4FFA574-1491-49E2-A1A6-843CB8D44B21.png

    7.进行测试

    运行报错如下:
    原因是.sh文件没有权限,所以需要去开启权限。

    39A47956-00DB-4289-A688-C8C3CDA79752.png

    解决方法:运行终端,在confuse.sh文件目录下,执行命令:

    chmod 755 confuse.sh

    CB77D889-C66C-4F81-9D0C-7A1A9F7852E6.png

    再运行项目即可成功运行

    现不进行混淆代码,打包一个.ipa包进行测试


    6D9BD6D6-1994-4FEC-B8E6-4EB9EC367A34.png 428EE5B5-10E8-4BB4-A44E-11689F986A06.png

    使用class-dump(以上步骤"一",介绍内容):看看咋们反编译后得到的文件

    613EE025-CBFD-46F0-9348-6E6FC8A15EB5.png

    再看看ViewController.h文件:


    DC73ABD0-4871-4A16-9B1D-1F99958D0938.png

    自己写的方法通过反编译完全暴露、别人就可以通过判断这些方法干什么用的,再将app注入自己写的dylib动态库,对app干点别的事情,这也是外挂的实现原理。

    再将混淆过的代码,打包一个.ipa进行测试:


    9519365B-2B18-4B46-AA94-087D9DC74F27.png 2FAD71F0-6F87-4243-B955-D7196B5EEB26.png F3D2D5D0-BED7-4FAB-BC97-AFD1EE9E8BE9.png

    同上,使用 class-dump 将 app 二进制文件进行反编译:


    AADC793D-8FCE-48CB-9E4E-7D5E00370657.png 2C8F402D-7339-4B2C-93E6-9CCAC65BC3FD.png 66059500-31E9-4ACD-9562-1A53B39B2AC2.png

    总结:通过.sh 脚本文件,将个别方法以随机生成字符串的形式,将方法混淆,以至于反编译后无法判断该方法的作用,而达到 APP 更安全。

    特别注意(以上、"二"中的2步):将 PFConfuse.h 移动到项目外,别放到项目中,因为放到项目中,到时候被反编译也可得到,那就通过对比 PFConfuse.h 中的内容,判断出方法。

    三、参考文章
    1、 iOS开发/App安全/代码自动混淆笔记
    2、 iOS自动代码混淆
    3、 念茜/Objective-C代码混淆
    3、 class-dump最新安装方法

    如对iOS应用逆向工程感兴趣,可以参考以下文章:
    1、一步一步实现iOS微信自动抢红包(非越狱)
    2、iOS 逆向 - 微信 helloWorld

    相关文章

      网友评论

          本文标题:iOS安全/代码混淆

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