美文网首页
iOS 代码混淆

iOS 代码混淆

作者: z4ywzrq | 来源:发表于2019-01-08 19:45 被阅读10次

    简介

    class-dump 可以很方便的导出程序头文件,考虑到App安全问题,防止我们核心的代码被别看到,需要对我们的代码进行混淆。

    class-dump介绍

    • class-dump可以将 Mach-O 文件中的 OC 运行时的声明信息导出,即编写 OC 代码时的.h文件。class-dump是对"otool -ov"信息的翻译.以一种我们熟悉的易读的方式呈现。

    Mach-O(Mach Object File Format)是 macOS 上的可执行文件格式,类似于 Linux 和大部分 UNIX 的原生格式

    • otool工具
      otool(object file displaying tool):目标文件的展示工具。可以用来发现应用中使用到了那些系统库,调用了那些系统方法。使用了库中那些对象及属性,它是Xcode自带的常用工具。
    • class-dump安装和使用
      1、下载 class-dump http://stevenygard.com/projects/class-dump/
      2、将 class-dump 执行文件拖入到 /usr/local/bin 目录下
      3、导出 .h 文件,用终端输入命令class-dump -H [.app文件的路径] -o [输出文件夹路径]
    class-dump -H .../xxx.app -o .../file
    class-dump -H /System/Library/Frameworks/AppKit.framework -o .../file
    

    Objective-C 代码混淆

    我们希望在开发时一直保留清晰可读的程序代码,方便自己。同时,希望编译出来的二进制包含乱七八糟的混淆后的程序代码,防止他人看到。可以在Build Phrase 中设定在编译之前进行方法名的字符串替换。

    1、创建混淆脚本 confuse.sh
    目的是为了把敏感方法名集中写在一个名叫func.list的文件中,逐一 #define 成随机字符,追加写入.h。

    #!/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
    
    

    2、配置 Build Phase
    在工程Build Phase中添加执行脚本操作,执行confuse.sh脚本

    3、创建函数名列表func.list,写入待混淆的函数名,并将文件放置于与confuse.sh脚本同级如:
    -(void)sample;
    -(void)seg1:(NSString *)string seg2:(NSUInteger)num;
    这样写:
    sample
    seg1
    seg2

    4、build 项目,混淆脚本会在编译前运行,进行字符随机替换,并且每次build的随机字符不同
    如有报错:


    需要切换到工程目录下,输入命令行 chmod 755 confuse.sh 给我们的脚本本间授权
    编译项目成功后,在工程目录下面脚本生成了 codeObfuscation.h 文件
    把混淆头文件 codeObfuscation.h 加入 Prefix.pch 中。

    5、编译查看结果


    codeObfuscation.h class-dump 导出的头文件

    Reference

    https://www.desgard.com/iosre-1/
    https://blog.csdn.net/yiyaaixuexi/article/details/29201699
    https://www.jianshu.com/p/0d42e5c6361c

    相关文章

      网友评论

          本文标题:iOS 代码混淆

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