iOS 防止反编译

移动互联网时代,安卓应用被反编译已经不是什么新鲜事了。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自动引用计数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.本地数据加密 对NSUserDefaults,sqlite存储文件数据加密,保护帐号和关键信息 将文件进行加密...
    Swift社区阅读 3,114评论 0 6
  • APP 一般经常做的网络参数加密解密,加密方法有base64、MD5、AES、RSA、DES等加密方法、这些加密一...
    flyrees阅读 1,275评论 1 3
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,782评论 0 11
  • 刚刚说了使用宏定义的方式来隐藏头文件方法名。感觉比较low,有没有更好的方法来做呢。 创建 confuse.sh,...
    iOS谢先森阅读 682评论 1 2
  • 黑川雅之《日本的八个审美意识》从设计学角度写了八个字“素、假、并、气、间、微、秘、破”所代表的审美意识以及背后的日...
    张永胜_永往直前阅读 846评论 0 3