文章目录

* 自己创建脚本文件进行代码混淆
<https://blog.csdn.net/Bolted_snail/article/details/88099811#_3>
* iOS代码自动混淆
<https://blog.csdn.net/Bolted_snail/article/details/88099811#iOS_122>


*
最近公司扫描App漏洞,提出要给App做代码混淆加固,以提高反编译逆向难度。对于Android应用直接用360安全加固即可;但对于iOS应用,虽然360也提供了免费的加固方法,但前提是项目的
enable bitcode必须设置为YES。但我们项目中引入的很多框架包括百度地图等并不支持enable bitcode设置为YES。如果enable
bitcode设置为NO,并且是本地部署的话(企业证书),360安全加固iOS是收费的,收费标准是30万/年。其他的一些平台也是收费的。所以只能考虑自己去做了。
* 360 iOS加固指南 <http://jiagu.360.cn/manage/index.html#/global/help/161>
<>自己创建脚本文件进行代码混淆

* 混淆原理 : 代码编译阶段将符号(方法名、属性名等)替换成随机生成的字符串
* 我们需要创建四个文件如下:

其中PrefixHeader.pch宏文件中导入CodeObfuscation.h,这样项目在编译的时候就会将CodeObfuscation.h
中定义的宏及方法名替换为对应随机生成的字符串。 #ifndef PrefixHeader_pch #define PrefixHeader_pch
#import "CodeObfuscation.h" #endif /* PrefixHeader_pch */
其中confuse.sh脚本文件是最重要的,是用来在程序编译的时候将func.list中的方法名替换成随机生成的字符串,并且保存在
CodeObfuscation.h中。其脚本为:
TABLENAME=symbols SYMBOL_DB_FILE="$PROJECT_DIR/CodeObfuscation/symbols"
STRING_SYMBOL_FILE="$PROJECT_DIR/CodeObfuscation/func.list"
HEAD_FILE="$PROJECT_DIR/CodeObfuscation/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
CodeObfuscation_h #define 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
func.list文件就是用来存放要被混淆的方法和属性名的。如:

CodeObfuscation.h本身是一个空头文件,在编译过后会生成func.list添加属性和方法对应生成的随机字符串。下图是编译后
CodeObfuscation.h的内容:

示例:
#import "ViewController.h" #import "NSArray+Extension.h" @interface
ViewController () @property (nonatomic, copy) NSString *title1; @property
(nonatomic, copy) NSString *imgsrc; @end @implementation ViewController -
(void)viewDidLoad { [super viewDidLoad]; self.title1 = @""; self.imgsrc = @"";
NSLog(@"%@",[NSArray getPropertiesFromClass:[self class]]);
NSLog(@"%@",[NSArray getMethodsFromClass:[self class]]); } -
(void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of
any resources that can be recreated. } - (void) test{ } - (void) test1{ } -
(void) test2{ } - (void) test3{ } - (void) test4{ } @end
打印出运行时的属性和方法名:

结果可见,CodeObfuscation.h中的生成的随机字符串和真正打印出来的并不一致,这是因为每次运行时,CodeObfuscation.h
都会重新生成新的随机字符串,这时替换属性和方法名的是上一次生成的随机字符串。

* 注意事项:
* 属性方法名需要去重。
* 代码混淆后不能再上架appstore。
* 代码混淆不能对静态库进行混淆。
* 系统自带的属性和方法不能混淆,只能混淆自定义的方法和属性。
* 具体步骤可参考:iOS代码混淆教程 <https://www.jianshu.com/p/66bb2d45b3c2>
<>iOS代码自动混淆

* 上面的方法会有有一些问题,就是每次创建了新的属性和方法都得添加到func.list文件中,比较繁琐,不利于维护。其实我们可以让方法属性自动添加
func.list中。所以我们要从.m和.h文件中抽取属性和方法了,但是如何屏蔽系统的属性和方法名,所以我们要将自己定义的属性和方法名全部添加一个前缀。
* 在confuse.sh中添加新的脚本,修改后的脚本如下: TABLENAME=symbols SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="$PROJECT_DIR/AutoScript/func.list"
CONFUSE_FILE="$PROJECT_DIR/AutoCodeConfusion"
HEAD_FILE="$PROJECT_DIR/AutoScript/AutocodeObfuscation.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/[ ]*</</"| sed "/^[ ]*IBAction/d"|awk '{split($0,b," ");
print b[2]; }'| sort|uniq |sed "/^$/d"|sed -n "/^hj_/p" >$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
AutocodeObfuscation_h #define AutocodeObfuscation_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

添加了收集方法的脚本后,我们不需要再手动的去添加方法到func.list中了。程序编译后会自动将hj_开头的方法添加到func.list中。

* 参考文档:
iOS代码混淆教程 <https://www.jianshu.com/p/66bb2d45b3c2>
iOS代码混淆----自动 <https://www.jianshu.com/p/0d42e5c6361c>
* 相关demo:iOS代码混淆(手动和自动)
<https://download.csdn.net/download/bolted_snail/10992575>

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信