移动互联网时代,安卓应用被反编译已经不是什么新鲜事了。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.程序结构混排加密
对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低
网友评论