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自动引用计数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

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