1、基础概念;
2、代码混淆;
3、代码混淆实现的方案;
1、基础概念;
1.1 源代码(也称源程序):
是指一系列人类可读的计算机语言指令。计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,通过编译器完成。
1.2 程序加固:
是为了增加应用的安全性,防止应用被破解、盗版、二次打包、注入、反编译等;常见的程序加固方案有:数据加密(字符串、网络数据、敏感数据等)、应用加壳(二进制加密)、代码混淆(类名、方法名、代码逻辑等)。
2、代码混淆;
2.1 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。目前已经存在许多种功能各异的代码混淆器。
2.2 代码混淆的缺点:
① 被混淆的代码难于理解,因此调试以及除错也变得困难起来。开发人员通常需要保留原始的未混淆的代码用于调试。
② 代码混淆并不能真正阻止反向工程,只能增大其难度。因此,对于对安全性要求很高的场合,仅仅使用代码混淆并不能保证源代码的安全。
3、代码混淆实现的方案;
3.1 源码的混淆:
- 方案一:通过宏定义混淆方法名、类名:
① 实现:
image② 注意点:
· 不能混淆系统方法
· 不能混淆init开头的等初始化方法
· 混淆属性时需要额外注意set方法
· 如果xib、storyboard中用到了混淆的内容,需要手动修正
· 可以考虑把需要混淆的符号都加上前缀,跟系统自带的符号进行区分
· 混淆过多可能会被AppStore拒绝上架,需要说明用途
· 给需要混淆的符号加上了一个特定的前缀
- 方案二:借助第三方工具ios-class-guard
① 简介:
· 它是基于class-dump的扩展
· 用class-dump扫描出可执行文件中的类名、方法名、属性名等并做替换,会更新xib和storyboard的名字等等
② 用法(需要先进入到可执行文件的目录下):
· 使用brew安装ios-class-guard : $ brew install ios-class-guard
Image· $ ios-class-guard [options] <mach-o-file>
③ 常用参数:
· --sdk-root <path>:用于指定SDK路径,如果是模拟器SDK,一般路径就是
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
· --sdk-ios:相当于指定SDK路径为真机设备SDK
· -X <path>:用于指定xib、storyboard所在目录,它会递归搜索
· -O <path>:生成的混淆头文件路径
· -m <path>:符号映射表(默认是symbols.json)
- 方案三:字符串加密。
3.2 LLVM中间代码IR的混淆(PS此方案容易产生BUG):
(PS : 其中有部分章节是从前人的文章中搬运过来整理而成,这些文章里已经对部分知识点解释的很清楚明了了,我也没有更好的表达方式,所以站在巨人的肩膀上,我只是一个整理者加了部分自己的理解。)
网友评论