工作备忘-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出可读信息的有效办法是易读字符替换,即混淆方法名和变量名等。
Run Script Build Phase来添加一个新的脚本。
在脚本文本框中粘贴下面的shell脚本代码:
2.修改Prefix.pch
打开Xcode,修改XXX-Prefix.ch ,添加混淆头文件:
3、创建codeObfuscation.h和函数名列表func.list,在func.list添加要混淆的方法名和变量名,注:不能添加系统自带的方法名、变量名和关键字等,不然会出现错误警告!!
4、开始编译,通过后可在codeObfuscation.h文件中看到宏定义替换过的混淆字符串。
ps:静态库.a和.framework均可用该方法混淆,但是将混淆文件一同打包进静态库,使用该静态库的demo项目运行时识别不了方法名(方法名已经混淆过);而如果不将混淆文件一同打包进静态库,直接放到demo项目上,运行通过,实现混淆。如何解决将混淆文件打包静态库,使用该静态库的项目正常运行尚未解决,如果有解决方法的请各位小伙伴在下面评论下。
本文参考了:http://blog.csdn.net/yiyaaixuexi/article/details/29201699#comments
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/AddRun 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
相关文章推荐
- 谷歌 Project Zero 团队宣布新政策,漏洞披露前将有完整的 90 天缓冲期
- 春节长假安全手册
- 地震避险自救常识
- 路由器安全有关的目录
- 打造个性_安全的电脑系统图文教程2第1/2页
- 路由器内的安全认证
- 加强php的安全之一
- http www安全必备知识
- SQLServer 2008中的代码安全(一) 存储过程加密与安全上下文
- C语言安全编码之数值中的sizeof操作符
- PHP安全上传图片的方法
- .Net下的签名与混淆图文分析
- C#实现线程安全的简易日志记录方法
- php 编写安全的代码时容易犯的错误小结
- JSP应用的安全问题
- asp.net安全、实用、简单的大容量存储过程分页第1/2页
- 新安装的MySQL数据库需要注意的安全知识