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

iOS 安全 - 代码混淆

作者: VinZZZZ | 来源:发表于2019-08-15 18:35 被阅读0次

    网上查找资料,大致基本都是用 宏定义 替换 方法名。

    这种方式主要有几个弱点:
    1). https://www.jianshu.com/p/0d42e5c6361c 的评论说,这类混淆方式苹果会审核不通过。除非回复苹果这是出于安全需要(比如银行类app)。这是最大的风险。
    2)只能把函数名替换,无法替换函数参数比如:
    - (void)hsk_start:(NSString*)a andPassword:(NSString*) b , 只有 has_start被替换了,其他的未替换。这个应该可以通过改进脚本来支持。。。。
    3)只替换方法名,比较弱,没有Control-flow obfuscation强。

    总结了几个还不错的,如下所示。

    1. Shell替换特定关键字开头的方法

    主要参考 https://www.jianshu.com/p/0d42e5c6361c

    其原理是在预编译阶段,使用shell脚本
    1) 先从.h/.m文件中抽取特定前缀的方法名,比如kkk_function1, 将其存到 func.list中;
    2) 然后对其编写随机字串,将对应的#define存到 codeObfuscation.h 文件中。由于codeObfuscation.h被放到PrefixHeader.pch中了,因此全局有效。

    对其给的confuse.sh脚本有几个改进:
    1)没发现所谓的『#维护数据库方便日后作排重』有什么用,猜测是为了防止生成的随机字串出现重复的情况。这里把这部分代码移出掉了。可以通过检查codeObfuscation.h中是否有重复的字串来避免。(自己写个检查工具就好了)
    2)fun.list使用后可以删除掉,防止出现在.app包中,泄露信息;
    3)将codeObfuscation.h拷贝一份到工程中,暂且命名为 ObfusedMapping.h, 这个头文件需要和打包的版本对应好,用于crashlog的恢复。

    修改后的脚本如下:

    #!/usr/bin/env bash
    
    STRING_SYMBOL_FILE="$PROJECT_DIR/HSKConfuse/Resource/func.list"
    
    CONFUSE_FILE="$PROJECT_DIR/HSKConfuse"
    
    HEAD_FILE="$PROJECT_DIR/HSKConfuse/Resource/codeObfuscation.h"
    
    export LC_CTYPE=C
    
    touch $STRING_SYMBOL_FILE
    
    #取以.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 "/^hsk_/p" >$STRING_SYMBOL_FILE
    
    ramdomString()
    {
    openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16
    
    }
    
    rm -f $SYMBOL_DB_FILE
    rm -f $HEAD_FILE
    
    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
    echo "#define $line $ramdom" >> $HEAD_FILE
    fi
    done
    echo "#endif" >> $HEAD_FILE
    
    #clean
    rm -f $STRING_SYMBOL_FILE
    cp $HEAD_FILE $"$PROJECT_DIR/ObfusedMapping.h"
    
    

    2. Python脚本替换方法

    主要参考 https://www.jianshu.com/p/c9073d1e06b9
    与1.的原理类似,不同的是:
    1)用python脚本实现的
    2)不是对特定前缀方法,而是对除了特定文件的所有方法都执行混淆
    3)随机字串改为了单词拼接,可能不会被苹果拒掉。(未验证)

    3. Shell替换的另一个版本

    主要参考 https://my.oschina.net/FEEDFACF/blog/1621956
    YTTInjectedContentKit
    该作者主要想用于游戏马甲包混淆。还未验证。

    Shell入门

    相关文章

      网友评论

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

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