代码混淆&反编译

作者: 走着走着就会敲代码了 | 来源:发表于2018-07-17 18:06 被阅读12次

    花了小半天的时间整了下代码混淆以及反编译...看了那么多帖子很多都是讲的模糊两可,基本都是要在自己去琢磨琢磨。默默的自己补一篇文章吧,新手少走点弯路哈。
    代码混淆主要就是不让自己暴露在.h文件中的代码让别人随便看,增加点安全性。当然,还可以遮羞,嘿嘿~代码风格写的不好防止被看到。

    1、安装class-dump

    安装的就不讲了,推荐一篇帖子写的很赞的哈,class-dump在本文中主要是用来反编译。

    2、创建文件

    随意位置创建一个文件夹,反正最后是需要将整个文件夹添加到工程进去的。
    终端命令:

    cd 文件夹路径
    touch confuse.sh    //用于存放脚本
    touch func.list     //用于存放需要混淆的变量或者函数
    

    将文件夹添加到工程,并新建.h文件: codeObfuscation.h用于存放混淆前后的代码(宏定义) 以及pch文件:PrefixHeader.pch
    注意:有的人喜欢把codeObfuscation.hPrefixHeader.pch一次性用终端创建了,但是对应的头需要另外自己写个人嫌麻烦,还是比较喜欢直接在工程里面直接创建哈。
    配置PrefixHeader.pch文件:
    导入#import "codeObfuscation.h",以及设置pch文件的prefixHeader文件路径

    pch文件路径配置.png

    3、confuse.sh脚本

    TABLENAME=symbols
    SYMBOL_DB_FILE="symbols"
    #修改成相应的文件路径
    STRING_SYMBOL_FILE="$PROJECT_DIR/Ninety/Confuse/func.list"
    #修改成相应的文件路径
    CONFUSE_FILE="$PROJECT_DIR/Ninety"
    HEAD_FILE="$PROJECT_DIR/Ninety/Confuse/codeObfuscation.h"
    export LC_CTYPE=C
    #取以.m或.h结尾的文件以+号或-号开头的行 |去掉所有+号或-号|用空格代替符号|n个空格跟着<号 替换成 <号|开头不能是IBAction|用空格split字串取第二部分|排序|去重复|删除空行|删掉以init开头的行>写进func.list
    #注意:需要将zyg换成你自己的函数前缀
    #注意:如果需要自动混淆的请加上对应的前缀,如果只是混淆部分的又没有前缀,请注释此部分代码,否则只会混淆带有前缀的函数
    # 也就是所谓的自动混淆了,如果不需要就请注释掉,如果是自动混淆就没法混淆变量,只能混淆函数
    #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 "/^zyg_/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 codeObfuscation_h
    #define 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
    

    请注意看脚本的内容,里面的路径例如func.listcodeObfuscation.h的路径需要修改成相应自己工程的文件路径
    以及脚本里面,修改codeObfuscation.h的代码,也需要修改成相应的文件名

    脚本中注意部分#grep请细看那边的解释,有详细注明所谓的自动混淆、以及混淆变量

    注意:如果没有修改成相应的文件路径或者文件名的话 在编译的时候会报错:***/no such file or dictory之类的错误,反正就是找不到func.listcodeObfuscation.h文件

    5、配置confuse.h路径

    配置路径就看图吧,如果没有配置项目没法编译直接报错哈。


    confuse.h路径.png

    当然这边也需要授权,下文会讲到。

    6、配置需要混淆的函数或者变量

    func.list将需要混淆的函数或者变量放进去,如图:


    混淆的函数或者变量.png

    7、confuse.sh文件授权

    完成以上操作后,发现编译或者运行后,报错(贴个网络图,别介意懒得再运行自己的工程):


    未授权错误.png

    confuse.sh没有权限,那就给他授权哈,打开终端,进入confuse.sh文件夹:

    cd 存放confuse.sh的文件夹路径
    ls -l confuse.sh    //可以先查看下confuse.sh的权限
    chmod a+x confuse.sh    // 给权限,a是指所有人
    //chmod 755 confuse.sh 用此命令给权限也是可行的
    

    运行成功后的混淆

    看图,不说话。


    运行成功图.png

    当然也可以查看codeObfuscation.h文件,每次运行混淆后的方法名都不一样

    codeObfuscation.h.png

    8、calss-dump反编译

    将需要反编译的ipa文件解压(归档),获取到Payload文件夹,显示包内容找到项目名的文件,如图:


    反编译的文件.png

    打开终端:

    class-dump -H /Users/zhouyonggui/Desktop/Ninety\ 2018-07-17\ 17-07-43/Payload/Ninety.app/Ninety  -o /Users/zhouyonggui/Desktop/Confuse 
    

    注意-H需要大写 对应的后面是需要反编译的文件路径;-o需要小写哈,后面跟着反编译后需要存放的文件路径

    总结

    总的就讲这些吧,demo暂时没有后面会上次,因为我直接把代码混淆直接做到项目上,现在懒...就没弄demo了哈哈。如果在做代码混淆的时候有问题可以留言,互相学习哈。
    顺便附上参考的连接,都写的很不错哈,也很类似只是有些没有说明:
    iOS 代码混淆基本处理
    iOS安全攻防(二十三):Objective-C代码混淆
    iOS代码混淆----自动
    iOS代码混淆
    iOS class-dump反编译和代码混淆
    class-dump最新安装方法

    相关文章

      网友评论

        本文标题:代码混淆&反编译

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