iOS之代码混淆

作者: 一个啥子都不会滴程序媛 | 来源:发表于2018-04-12 22:00 被阅读39次

    之前听过代码混淆的概念,但公司不要求这个,所以当时也没有在意,现在有时间就简单看了一下(其实还是纠结于那个公司问的那个问题)。。。真的只是简单的看了一下,虽然看不懂。。。
    由于class-dump可以导出程序的头文件,对于APP的安全考虑,我们需要混淆自己的代码。
    混淆代码有多种方式:
    字符串加密、符号混淆、别名、C重写、脚本处理 等等....
    防止class-dump导出可读信息的有效方法是易读字符替换,接下来我们就来看一下吧。

    这是念茜女神写的一个脚本,以下代码来自念茜女神的博客

    // 数据库名
    TABLENAME=symbols
    SYMBOL_DB_FILE="symbols"
    // 存放混淆方法、属性的list的路径
    STRING_SYMBOL_FILE="$PROJECT_DIR/项目名/func.list"
    CONFUSE_FILE="$PROJECT_DIR/项目名"
    // 存放混淆方法、属性的.h的路径
    HEAD_FILE="$PROJECT_DIR/项目名/codeObfuscation.h"
    // 剩下的代码看不懂啦。。。
    export LC_CTYPE=C
    

    以下代码是来自另一位大大的博客,那位大大实现了自动混淆(方法名字不能一个一个的添加到func.list中,所以只能从.m和.h文件中抽取了,但是如何屏蔽系统的方法名,暂行的策略是:将自己定义的方法名全部添加一个前缀例如:sss_),但只是混淆了方法名,我加上了属性名的混淆(因为看不懂Linux命令,只是一个简单的小问题弄了好久)

    # 取以.m或.h结尾的文件以+号/-号/@property开头的行 |去掉所有+号或-号|用空格代替符号|n个空格跟着<号 替换成 <号|开头不能是IBAction|用空格split字串取第二部分|排序|去重复|删除空行|删掉以init开头的行>写进func.list
    grep -h -r -I  "^[-+@property]" $CONFUSE_FILE  --include '*.[mh]' |sed "s/[+-]//g"|sed "s/[();,: *\^\/\{]/ /g"|sed "s/[ ]*</</"| sed "/^[ ]*IBAction/d"|awk '{lens=split($0,b," "); print b[lens]; }'| sort|uniq |sed "/^$/d"|sed -n "/^sss_/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 Demo_codeObfuscation_h
    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.新建文件,将后缀改为aaa.sh 如图:


    image.png

    把上面的代码粘贴到aaa.sh中,编译一下报错啦吧


    image.png
    解决办法:切换到工程目录下,输入命令行:
    chmod 755 aaa.sh

    给我们的脚本授权
    2.我们再编译一下项目,然后在工程目录下,我们会多出一个codeObfuscation.h文件,右键add...加到项目中
    3.放到pch文件中


    image.png
    4.在Xcode-->Target--->Build Phases--->添加Run Script
    将aaa.sh拖到下图的黑框中,会自动生成路径
    image.png
    5.最后打包,用class-dump导出就可以看到效果啦
    image.png
    image.png

    相关文章

      网友评论

        本文标题:iOS之代码混淆

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