iOS代码混淆安全加固
文章目录
- 自己创建脚本文件进行代码混淆
- 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
createTabletouch $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代码混淆教程
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
createTabletouch $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代码混淆教程
iOS代码混淆----自动
- 相关demo:iOS代码混淆(手动和自动)
iOS代码混淆安全加固相关推荐
- ios APP加密探究几维安全iOS 代码混淆效果参考
几维安全ios代码混淆效果参考: 什么是加密 加密是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,做一些额外的工作.大多数病毒就是基于此原理. 加密作用 加壳的程序可以有效阻止对程序 ...
- APP加密,ios代码混淆工具,虚拟化技术 适用于移动应用程序的虚拟化加密软件
概述: KiwiVM是用于移动应用程序的虚拟化加密软件. 它基于Clang编译器扩展,并且在编译项目时虚拟化指定的函数.借助自定义CPU指令的功能,一旦对代码进行加密并且从未解密,攻击者将无法恢复代码 ...
- ios代码混淆小工具
一 绪言 写在前面的话:之前做了五年ios开发,现在转了开发方向(数据科学/大数据),今天帮以前ios开发小组的同学,写了一个ios代码混淆小工具,下面介绍下. 这种方式不是最佳方案,更好的方案是c ...
- Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)
前言 最近一直在看Python,也很喜欢Python的灵活性:今天主要想说的是iOS的代码混淆,为什么想做代码混淆?为了APP的安全,为了防止别人破壳轻易破解我们代码:还有就是做 马甲包 了,我们知道 ...
- iOS代码混淆的探索
目的 为了进一步增加应用的安全性,防止我们的应用程序很容易的被攻击者分析.破解.重打包,提高攻击者逆向分析应用的难度 应用的加固方案 数据加密:静态字符串.本地存储和网络传输的加密 静态混淆:类名.方 ...
- iOS 代码混淆 垃圾代码
app风靡的时代,总有一些奇葩的需求. 为了刷量,刷排名,制作壳包,为了通过苹果爸爸审核,想到代码混淆,垃圾代码等策略. 作为一名程序员,怎么办? 爬了一些文章博客.总的来说有一下几方面: 字符串加密 ...
- 【工具】iOS代码混淆工具-iOS源码混淆
最新更新记录 V2.0.3(2022年12月11日)更新内容: 1.新增导入映射列表的逻辑: 2.优化修复其他混淆逻辑: 3.更新地址 - github 主要功能 ZFJObsLib是专业的iOS源码 ...
- iOS代码混淆原理初探
我们在手游平台SDK的iOS版本中, 除了AppStore官方支付之外还集成了第三方支付(微信支付H5和支付宝支付H5版本). 如果用于企业签,不需要做处理,直接使用即可. 但是如果需要上架AppSt ...
- python混淆ios代码_XSDK——iOS代码混淆原理
我们在XSDK的iOS版本中, 除了AppStore官方支付之外还集成了第三方支付(微信支付H5和支付宝支付H5版本). 如果用于企业签,不需要做处理,直接使用即可. 但是如果需要上架AppStore ...
最新文章
- Linux上重启服务的正确命令
- ml--分类与预测算法评价方法
- Centos安装图形化界面
- Jsp+Servlet+JavaBean经典MVC模式理解
- 天线的安装对通信效果有什么影响?
- WordPress5.7版本下载及更新内容
- 关于布隆过滤器的所有信息:利用Hash实现的索引方案
- python表格处理_python如何处理表格?
- python连接sql引用的第三方库_python连接sqlserver数据库操作
- Python数据可视化2.3 体育案例
- Evernote CEO给想做长久公司创业者的3个建议
- python写的代码怎么发给别人_用python 代码 怎么给别人发邮件的两种写法
- 立创开源|esp8266三路继电器
- 图像处理(一)图像灰度化的三种方式
- 单片机应用系统设计技术——单片机出租车计费器
- pcm5102a解码芯片音质评测_音乐更重要,iQOO Pro配备独立解码芯片,Hi-Fi音质更懂你...
- 虚拟机VM12磁盘扩容
- 量化交易学习(10)均线交叉策略
- 微信商户平台,开通企业付款到用户零钱功能
- Pantoea(泛菌属)——肠道内善恶兼备的神秘细菌
热门文章
- android camera 工作原理,Android Camera原理之openCamera模块(一)
- 计算机木材染色 配色技术的应用技术,人工林木材颜色怎么调配?木材电脑配色技术...
- 关于MOTOROLA O202C无线座机 来电响一声故障
- java每隔1分钟执行一次_启动系统定时器,每隔1分钟/指定时间执行任务 学习笔记...
- 关于Windows vivado综合卡死的问题
- IDEA入门教程----是时候舍弃Eclipse了
- 在matlab中使用spm8,[转载]在matlab中同时使用spm2,spm5,spm8
- 在线Excel框架——luckysheet
- bing词典案例分析
- Qno技术:支持网吧业务目标持续推进——FVR9000系列网吧解决方案(转)