美文网首页逆向工程
iOS 防止反编译

iOS 防止反编译

作者: 蜗牛非牛 | 来源:发表于2018-07-11 14:55 被阅读802次

    移动互联网时代,安卓应用被反编译已经不是什么新鲜事了。iOS系统安全性非常高,很少出新漏洞,但是在各位工程师的不懈努力下,iOS的漏洞也被撕扯的越来越大,被反编译的风险也随之剧增。而作为一名优秀的iOS开发工程师,怎么可以对这种风险视而不见呢。

    iOS应用安全风险

    1. 内购破解

    风险之一:越狱(插件)、存档破解(iTools工具替换文件)、第三方软件修改(八门神器等)

    2.网络安全风险

    风险之二:截获网络请求,破解通信协议并模拟客户端登录,伪造用户行为,对用户数据造成危害

    3.应用程序函数PATCH破解

    风险之三:利用FLEX 补丁软件通过派遣返回值来对应用进行patch破解

    4.源代码安全风险

    风险之四:通过使用ida等反汇编工具对ipa进行逆向汇编代码,导致核心代码逻辑泄漏与被修改,影响应用安全

    iOS应用加密防止反编译技术

    1.本地数据加密

    对NSUserDefaults,sqlite存储文件数据加密,保护帐号和关键信息

    将文件进行加密

     // 获取需要加密文件的二进制数据/Users/zq/Desktop/photo                                                                                  NSData *data = [NSData dataWithContentsOfFile:@"/Users/zq/Desktop/photo/photo1.png"];  

    // 或 base64EncodedStringWithOptions                                                                                                                  NSData *base64Data = [data base64EncodedDataWithOptions:0];    

    // 将加密后的文件存储到桌面                                                                                                                            [base64Data writeToFile:@"/Users/zq/Desktop/123" atomically:YES];

    将文件进行解密

    // 获得加密后的二进制数据                                                                                                                                    NSData *base64Data = [NSData dataWithContentsOfFile:@"/Users/zq/Desktop/123"];          NSLog(@"base64Data:%@", base64Data);

    // 解密 base64 数据                                                                                                                                              NSData *baseData = [[NSData alloc] initWithBase64EncodedData:base64Data options:0];

    // 写入桌面                                                                                  [baseDatawriteToFile:@"/Users/zq/Desktop/IMG_5551.png" atomically:YES];

    2.URL编码加密

    对程序中出现的URL进行编码加密,防止URL被静态分析

    3.网络传输数据加密

    利用 RSA 对字符串进行加密

     /** RSA加密                                                                                                                                                               *  @param originString 需要加密的数据                                                                                                                 * @param public_key 公钥                                                                                                                                     */                                                                                                                                           NSString*encWithPubKey = [RSA encryptString:originStringpublicKey:public_key];

      NSLog(@"加密===: %@\n\n", encWithPubKey);

    利用 RSA 对字符串进行解密

    /** RSA解密                                                                                                                                                              *  @param originString 需要解密的数据                                                                                                                  * @param private_key 私钥                                                                                                                                    */                                                                                                                                          NSString*decWithPrivKey = [RSA decryptString:encWithPubKey privateKey:private_key];                   

    NSLog(@"解密===: %@\n\n", decWithPrivKey);

    4.方法体,方法名高级混淆

    简单来说,就是别人通过class-dump反编译你的应用后,不会显示你自定义的方法名(系统方法名除外),增加其对你应用的理解难度。注意:这样并不能阻止别人反编译你的应用。

    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

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

    #!/usr/bin/env bash                                                                                                                       TABLENAME=symbolsSYMBOL_DB_FILE="symbols"                             STRING_SYMBOL_FILE="$PROJECT_DIR/代码混淆-18-7-10-0/func.list"CONFUSE_FILE="$PROJECT_DIR/代码混淆-18-7-10-0"                                                  HEAD_FILE="$PROJECT_DIR/代码混淆-18-7-10-0/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/[ ]*$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;

    doif [[ ! -z "$line" ]];                                                                                                                                                thenramdom=`ramdomString`echo $line $ramdominsertValue $line $ramdomecho "#define $line $ramdom" >> $HEAD_FILE

    fidoneecho "#endif" >> $HEAD_FILE

    sqlite3 $SYMBOL_DB_FILE .dump

    注意:需要将zq换成你自己的函数前缀 

    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、通过class-dump 反编译之后:Appdelegate 效果

    5.程序结构混排加密

    对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低

    下一篇:Objective-C自动引用计数

    相关文章

      网友评论

        本文标题:iOS 防止反编译

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