iOS攻防 - (三)iOS应用的代码打包前混淆,不影响源代码
出于iOS应用的安全考虑,如:银行类型APP, 金融相关APP, 登录功能,支付功能等;
某些时候,我们需要对iOS应用的重要函数或名称进行混淆,因为即使是App Store下载的应用亦可以使用class-dump进行导出应用的所有头文件,这就太不安全了。为了加大程序结构的逆向或破解难度,此文讲解如何对iOS应用的源代码进行混淆处理
1.混淆的常规思路
- 花指令,花代码,在程序中加入迷惑人的代码指令
- 易读字符替换
此文讲解对易读字符替换
Objective-C/Swift的方法名、属性名或类名混淆
- 混淆的时机是在编译前
- 混淆后,不影响源代码
- 混淆生成的规则,可以是随机不重复的字符串
- 混淆后,为了方便后续排查问题,需要使用SQLite3进行记录
- 混淆脚本,需要加入 ProjectName --> Build Phases --> Run Script --> 添加你要混淆脚本文件的完整路径
- 方法selector,如 无参数函数,直接通过#define funcName
- 方法selector,如 有一个参数,直接通过#define funcName
- 方法selector,如 有多个参数,分别通过#define funcNameA、funcNameB、funcNameC
2.脚本代码如下:
#!/bin/bash
# 这是Shell脚本,如果不懂shell,自行修炼:http://www.runoob.com/linux/linux-shell.html
# 以下使用sqlite3进行增加数据,如果不了解sqlite3命令,自行修炼:http://www.runoob.com/sqlite/sqlite-tutorial.html
#数据表名
TABLENAME="CodeObfuscationOC"
#数据库名
SYMBOL_DB_FILE="CodeObfuscation.db"
#要被替换的方法列表文件
STRING_SYMBOL_FILE="$PROJECT_DIR/func.txt"
#被替换后的宏定义在此文件里
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/CodeObfuscation.h"
#维护数据库方便日后做bug排查
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
}
#生成随机16位名称
randomString()
{
openssl rand -base64 64 | tr -cd 'a-zA-Z' | head -c 16
}
#删除旧数据库文件
rm -f $SYMBOL_DB_FILE
#删除就宏定义文件
rm -f $HEAD_FILE
#创建数据表
createTable
#touch命令创建空文件,根据指定的路径
touch $HEAD_FILE
echo '#ifndef CodeObfuscation_h
#define CodeObfuscation_h' >> $HEAD_FILE
echo "//confuse string at `date`" >> $HEAD_FILE
#使用cat将方法列表文件里的内容全部读取出来,形成数组,然后逐行读取,并进行替换
cat "$STRING_SYMBOL_FILE" | while read -ra line;
do
if [[ ! -z "$line" ]]
then
random=`randomString`
echo $line $random
#将生成的随机字符串插入到表格中
insertValue $line $random
#将生成的字符串写入到宏定义文件中,变量是$HEAD_FILE
echo "#define $line $random" >> $HEAD_FILE
fi
done
echo "#endif" >> $HEAD_FILE
sqlite3 $SYMBOL_DB_FILE .dump
3.配置Build Phases
ProjectName --> Build Phases --> Run Script --> 添加你要混淆脚本文件的完整路径
4.待混淆的函数名列表文件func.txt,该文件放在与你项目源代码文件同级目录,内容如下
isVerified1
isNeedOAuth1
resetPassword1
loginWithName
isVerified
isNeedOAuth
resetPassword
以上这些函数名的源名称如下:
#import <Foundation/Foundation.h>
typedef struct _util {
BOOL (*isVerified)(void);
BOOL (*isNeedOAuth)(void);
void (*resetPassword)(NSString *password);
}ZR_Util;
@interface Util : NSObject
+ (ZR_Util *)shared;
+ (instancetype)sharedUtil;
- (BOOL)isVerified1;
- (BOOL)isNeedOAuth1;
- (void)resetPassword1:(NSString *)password;
- (NSArray *)loginWithName:(NSString *)name password:(NSString *)password token:(NSString *)token;
@end
5.编译并查看结果
CodeObfuscation.h文件内容
使用class-dump,将应用的头文件导出后,
好了,就是这么简单~~
参考:http://blog.csdn.net/yiyaaixuexi/article/details/29201699
感谢念茜作者
来源:CSDN
作者:Victor.Zhang
链接:https://blog.csdn.net/u013538542/article/details/71214246