您的位置:首页 > 移动开发 > IOS开发

工作备忘-ios应用安全防护oc源代码混淆,防止class-dump攻击

2015-10-22 11:43 441 查看
一般大家都认为iOS很安全,至少比安卓安全。的确,iOS底层是基于编译型的C语言,而安卓是基于解释型的Java,iOS难以反编译。但也不是说iOS就不能反编译,当然你得看得懂汇编。比如一些收费反编译软件如:ida
pro,
就可以可以轻松将二进制程序转换成源码,包括iOS和android平台常见的.so文件、.a 静态库、.o文件、framework、 App等二进制文件,而免费软件如:class-dump可以很方便的导出程序头文件,让攻击者了解了程序结构方便逆向,所以,混淆自己的代码十分必要。


混淆的常规思路

1、方法名,变量名等易读字符替换;
2、随意往程序中加入迷惑人的花代码花指令;
等等。。。
本篇博客是防止防止class dump攻击,而防止class-dump出可读信息的有效办法是易读字符替换,即混淆方法名和变量名等。

混淆的时机和方法

我们当然希望在开发时一直保留清晰可读的程序代码,方便自己。同时,更希望编译出来的二进制包含乱七八糟的混淆后的程序代码,恶心他人。因此,我们选择在Build Phrase 中添加shell脚本来设定在编译之前进行方法名和变量名的字符串替换。这样,我们利用脚本将方法名和变量名用宏#define替换字符串,把混淆结果合并在一个.h中,在工程Prefix.pch的最前面#import这个.h。不导入也可以编译、导入则实现混淆。这样,即可保证开发时保留清晰可读的程序代码,编译前是替换过的随机字符串,编译时是以这些字符串编译成二进制数据,即使真的被反编译,class-dump出来的头文件中的方法名和变量名也是那些替换的随机字符串。这样就保证了我们的数据安全。

混淆的步骤

1、选择项目TARGET,再选择Build Phrase,然后选择Editor/Add Build Phase/Add
Run Script Build Phase来添加一个新的脚本。
在脚本文本框中粘贴下面的shell脚本代码:

#!/usr/bin/env bash

TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"
export LC_CTYPE=C

#维护数据库方便日后作排重
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; do
if [[ ! -z "$line" ]]; then
ramdom=`ramdomString`
echo $line $ramdom
insertValue $line $ramdom
echo "#define $line $ramdom" >> $HEAD_FILE
fi
done
echo "#endif" >> $HEAD_FILE

sqlite3 $SYMBOL_DB_FILE .dump

2.修改Prefix.pch
打开Xcode,修改XXX-Prefix.ch ,添加混淆头文件:

<pre name="code" class="objc">#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
//添加混淆作用的头文件(这个文件名是脚本中定义的)
#import "codeObfuscation.h"
#endif


3、创建codeObfuscation.h和函数名列表func.list,在func.list添加要混淆的方法名和变量名,注:不能添加系统自带的方法名、变量名和关键字等,不然会出现错误警告!!
4、开始编译,通过后可在codeObfuscation.h文件中看到宏定义替换过的混淆字符串。
ps:静态库.a和.framework均可用该方法混淆,但是将混淆文件一同打包进静态库,使用该静态库的demo项目运行时识别不了方法名(方法名已经混淆过);而如果不将混淆文件一同打包进静态库,直接放到demo项目上,运行通过,实现混淆。如何解决将混淆文件打包静态库,使用该静态库的项目正常运行尚未解决,如果有解决方法的请各位小伙伴在下面评论下。

本文参考了:http://blog.csdn.net/yiyaaixuexi/article/details/29201699#comments
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息