iOS 代码混淆安全加固流程

文章目录

 

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

自己创建脚本文件进行代码混淆

  • 混淆原理 : 代码编译阶段将符号(方法名、属性名等)替换成随机生成的字符串
  • 我们需要创建四个文件如下:
    在这里插入图片描述
    其中 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 的内容:
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 都会重新生成新的随机字符串,这时替换属性和方法名的是上一次生成的随机字符串。

  • 注意事项:
    1. 属性方法名需要去重。
    2. 代码混淆后不能再上架 appstore。
    3. 代码混淆不能对静态库进行混淆。
    4. 系统自带的属性和方法不能混淆,只能混淆自定义的方法和属性。
  • 具体步骤可参考:iOS 代码混淆教程

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 中。

源代码下载地址:https://github.com/housenkui/HSKConfuse

另送一份:iOS 脚本打包 傻瓜版,无需改变配置 github 地址

WKWebView 获取 JS 端的 console.log 日志

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值