zoukankan      html  css  js  c++  java
  • iOS 代码安全加固--反编译和代码混淆

    一、class-dump反编译 

    1、将打包的ipa反编译下,.ipa改成.zip,并解压 

    这里写图片描述

    6、右击—显示包内容,找到如下有个白框黑底的 
    这里写图片描述

    7、将其复制到桌面xx文件夹中,在终端中输入相关命令 
    cd 进入xx文件夹

    class-dump -H  二进制文件名字

    然后在tt文件中就可以看到多出的很多.h文件

    这里写图片描述

    二、ios代码混淆

    1、在项目的Resource文件夹中新建 
    脚本文件:confuse.sh, 
    宏定义文件:codeObfuscation.h, 
    函数列表文件:func.list, 
    头文件:PrefixHeader.pch

    可脚本创建 
    cd 项目/YCFMixConfuseDemo/Resource 
    touch confuse.sh 
    touch func.list 
    touch codeObfuscation.h 
    touch PrefixHeader.pch

    此处使用的混淆方法是:将一些以ycf_xxx开头的方法替换成随机的字符,目前该方法只能针对1个的参数的方法 
    这里写图片描述

    2、在confuse.sh文件中,输入以下代码,注意路径

    TABLENAME=symbols
    SYMBOL_DB_FILE="symbols"
    STRING_SYMBOL_FILE="$PROJECT_DIR/YCFMixConfuseDemo/Resource/func.list"
    
    CONFUSE_FILE="$PROJECT_DIR/YCFMixConfuseDemo"
    
    HEAD_FILE="$PROJECT_DIR/YCFMixConfuseDemo/Resource/codeObfuscation.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 "/^ycf_/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
    #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
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    注意:需要将ycf换成你自己的函数前缀 
    这里写图片描述

    3、在项目——Target——Build Phases中 新增New Run Script Phase 
    这里写图片描述

    这里写图片描述

    4、将新建的头文件PrefixHeader.pch中导入codeObfuscation.h

    #ifndef PrefixHeader_pch
    #define PrefixHeader_pch
    
    // Include any system framework and library headers here that should be included in all compilation units.
    // You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.
    #import "codeObfuscation.h"
    #endif /* PrefixHeader_pch */

    5、将新建的PrefixHeader.pch头文件添加到Xcode中去

    在Build Settings中搜索Prefix Header,在Prefix Header中写入我们新建头文件的路径 
    这里写图片描述

    6、运行项目,但是会报如下问题 
    这里写图片描述

    /Users/xxx/Library/Developer/Xcode/DerivedData/YCFMixConfuseDemo-bampqtmksvysbbbaixdeifkkoaqd/Build/Intermediates.noindex/YCFMixConfuseDemo.build/Debug-iphonesimulator/YCFMixConfuseDemo.build/Script-1ED6530E2004577400286FE9.sh: line 2: /Users/youchunfen/Desktop/项目复件/demo/YCFMixConfuseDemo/YCFMixConfuseDemo/Resource/confuse.sh: Permission denied
    • 1

    是说confuse.sh没有权限,那么我们cd 到 Resource文件夹中,查看它的权限,发现它没有执行权限,将其修改有可执行的权限 
    cd /Users/xxx/demo/YCFMixConfuseDemo/YCFMixConfuseDemo/Resource 

    查看某个文件的权限 ls -l 文件名 
    chmod a+x 文件名 给该文件可执行权限,a是所有人

    这里写图片描述

    7、这次就可运行了,但是发现第一次的运行后,然后使用本文的第一部分的class-dump来反编译发现,并没有代码并没有混淆,再次运行后,相关以ycf_开头的函数名才被混淆

    appdelegate中原来的函数名 
    这里写图片描述 
    混淆后 
    这里写图片描述

    在ViewController中方法名混淆前 
    这里写图片描述

    混淆后 
    这里写图片描述

    参考链接

     
     
     
  • 相关阅读:
    51nod 1134 最长递增子序列
    51nod 1135 原根
    51nod 1136 欧拉函数
    51nod 1137 矩阵乘法
    51nod 1174 区间中最大的数
    51nod 1079 中国剩余定理
    51nod 1181 质数中的质数(质数筛法)
    伪共享(False Sharing)和缓存行(Cache Line)
    mybatis 批量 操作数据
    java开发中beancopy比较
  • 原文地址:https://www.cnblogs.com/Mr-zyh/p/9211926.html
Copyright © 2011-2022 走看看