zoukankan      html  css  js  c++  java
  • iOS开发/App安全/代码自动混淆笔记

    最近接触银行类项目,对app安全才有了些认识...比较尴尬,除了之前经常做的网络参数加密解密,以及防止数据重放之外,还提到了防范反编译的风险,其实Apple算比较安全的了,反编译过来也就看到.h文件....但把代码混淆还是会比较好些。

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

    说明:

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

    touch confuse.sh

    touch gbFunc.list

    二、新建GBConfuse.h

    说明:

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

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

    三、在confuse.sh中添加如下代码

    #!/usr/bin/env bash

    TABLENAME=symbols

    SYMBOL_DB_FILE="symbols"

    #func.list路径

    STRING_SYMBOL_FILE="$PROJECT_DIR/GBFunc.list"

    #项目文件路径

    CONFUSE_FILE="$PROJECT_DIR/Safedemo"

    #Confuse.h路径

    HEAD_FILE="$PROJECT_DIR/GBConfuse.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 "/^GBSAFE_/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 GBConfuse_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

    四、添加 Run Script

    五、添加 PCH 文件

    六、在ViewController中添加以"GBSAFE_"为前缀的测试方法

    七、测试

    运行报错如下:

    原因是.sh文件没有权限,所以需要去开启权限。

    在confuse.sh文件目录下,执行命令:

    chmod 755 confuse.sh

    运行成功!

    先打包一个.ipa安装包进行测试!

    先不进行代码混淆:

    把.ipa文件类型改成.zip,解压得到.app文件

    新建Hear文件夹用于保存反编译后得到的文件:

    用class-dump进行反编译

    class-dump -H 要破解的可执行文件路径 -o 破解后的头文件存放路径

    得到没有进行代码混淆的文件:

    可以看到都是项目中一些.h文件,打开可以看到完整的方法名....

    然后客户说测试公司说不安全...

    需要进行代码混淆...

    在PCH文件中,引用GBConfuse.h:

    重新打包..就可以得到混淆后的.ipa..

    下面就是混淆后的结果。

    总结:

    其实,原理应该就是在编译过程中,把需要混淆的代码生成随机字符串进行替换....

  • 相关阅读:
    【转载】兼容php5,php7的cURL文件上传示例
    解决CURL 请求本地超时
    PHP 二维数组根据某个字段排序
    JS监听输入框值变化兼容 onpropertychange、oninput
    PHP AES的加密解密-----【弃用】
    PHP 开发API接口签名验证
    Python 逐行修改txt每条记录的内容
    Python 修改电脑DNS
    带小数点时间分钟转换
    Python 判断字符串是否为数字
  • 原文地址:https://www.cnblogs.com/pioneerMax/p/8143187.html
Copyright © 2011-2022 走看看