代码混淆
使用 class-dump 可以很轻松的获取程序的所有头文件,而且如果头文件没有加密 dump 出来,会暴漏程序的很多信息,因为程序的头文件都是容易读的,为了使用 class-dump 导出的头文件的可读性变差,可以对代码进行混淆
混淆的意思就是将可读的代码变成不可读的,例如:@property(copy, nonatomic) NSString *password; 混淆成 @property(copy, nonatomic) NSString *nRgLSvKPjbgkipPb; password 大家都知道是密码的意思,但是 "nRgLSvKPjbgkipPb" 这个东西是个随机字符串,大家都不知道是什么意思,这样做会更加安全一点。
具体操作步骤:
1、在项目的根目录下新建 2 个文件,分别为 confuse.sh、func.list,并修改 confuse.sh 文件的权限
2、 新建. pch 文件
注意. pch 文件的位置最好要放在 AppName 名字的文件夹下,.pch 文件的位置会在 confuse.sh 中会使用到,如果. pch 文件的位置放在其它地方那么需要修改 confuse.sh 文件中的某个变量的值
注意. pch 文件的路径需要在 Build Settings 中配置一下
3、 编写 confuse.sh
- # ! /usr/bin / env bashTABLENAME = symbolsSYMBOL_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_FILErm - f $HEAD_FILEcreateTabletouch $HEAD_FILEecho '#ifndef Demo_codeObfuscation_h#define Demo_codeObfuscation_h' >> $HEAD_FILEecho "//confuse string at `date`" >> $HEAD_FILEcat "$STRING_SYMBOL_FILE" |
- while read - ra line;
- doif[[!-z "$line"]];
- thenramdom = `ramdomString`echo $line $ramdominsertValue $line $ramdomecho "#define $line $ramdom" >> $HEAD_FILEfidoneecho "#endif" >> $HEAD_FILEsqlite3 $SYMBOL_DB_FILE.dump
confuse.sh 文件中定义了三个文件, 注意 func.list 是在项目根目录下,而 HEAD_FILE 是在项目根目录下的项目名称下的路径,也就是. pch 文件所在的路径,最好保持 codeObfuscation.h 文件的路径和. pch 文件的路径一致,如果路径一致,这个 shell 脚本不用做任何修改
- SYMBOL_DB_FILE = "symbols"STRING_SYMBOL_FILE = "func.list"HEAD_FILE = "$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"
4、 配置 confuse.sh
选中 Target—》Build Phases—> + —->New Run Script Phase
然后配置一下 confuse.sh 的路径
5、 在 func.list 中配置需要混淆哪些单词,只有配置了该单词才会混淆,可以配置多个,一行一个,可以把一些敏感的单词配置进去
6、Command + B 编译项目,如果正常的话,项目中会多出两个文件:symbols 和 codeObfuscation.h,然后将 codeObfuscation.h 文件导入的. pch 中
7、然后 Command + B 编译项目,可以在 Report navigator 中看到一下内容,可以看到脚本中为 func.list 中的每个单词生成一个随机字符串
8、 项目混淆好了,可以使用 class-dump 来测试一下
刚以开始使用 class-dump -H ClassDumpTest.app/ -o 文件输出路径 这个命名看到没有混淆成功,后来找到 ClassDumpTest.app 文件所在目录手动删掉该文件,重新编译一下,使用了这个命令: class-dump -S -s -H ClassDumpTest.app/ -o /Users/macmini/Desktop/ClassDumpTest333 结果混淆成功了,后来又试了一下第一个命令,结果也能混淆成功
该示例混淆的原理是:编译时执行 confuse.sh 脚本,为 func.list 中的每个单词生产一个宏并写入到 codeObfuscation.h 这个头文件中,然后将 func.list 中的每个单词都用对应的宏替换
经过测试,使用 class-dump 并不会导出 codeObfuscation.h 头文件
来源: http://www.92to.com/bangong/2016/12-10/14216677.html