iOS代码混淆初探
在没有对应用的代码做过特殊处理的情况下,一般应用的代码中的类名和方法都是明文的。在逆向分析中,通过class-dump获取MachO可执行文件中的所有类、定义的方法和属性,就能很快的从名字入手猜到这个方法是做什么用的,所以类名和方法名的混淆就特别重要了。
方法一:运用宏定义的方式进行混淆
这是一种比较简单又方便的做法,我们只需要在release打包时将现有工程里面的类名和方法名替换为一些无意义的字符串就可以了。这种全局的宏定义替换一般都是写在pch预编译文件里的,在Xcode中我们可以新建pch文件,然后在BuildSettings中设置预处理文件的地址就可以了。
因为我们对每一个类进行这样的操作会显得很麻烦,Git上有一个开源项目叫ios-class-guard也是运用这种宏定义的方式,它的原理就是把使用的所有系统库符号dump下来并过滤掉,只生成用户需要混淆的符号(https://github.com/Polidea/ios-class-guard)。
- -F:需要过滤的类或协议的符号,包括类里面的方法
- -i:需要过滤特定的符号
- –arch:指定dump的架构
- -X:执行项目路径,用于混淆XIB和storyboard中的类名和方法
- –dsym:在符号文件中混淆的符号,用于还原崩溃堆栈中的符号
- -O:生成的头文件的位置
运行> ios-class-guard xxx --sdk-ios -O Header.h
生成的Header.h文件内容如下:
//Properties
//Protocols
//Classes
#ifndef ViewController
#define ViewController n7zSFscof56er
#endif //ViewController
#ifndef AppDelegate
#define AppDelegate d56Edcy7D9j
#endif //AppDelegate
//Categories
//Methods
//I-vars
把文件内容复制到PrefixHeader.pch文件中,这样整个工程中的类和方法都混淆了。
方法二:通过二进制修改进行混淆
从Mach-O文件的格式分析中可以知道。类名保存在__ TEXT, __ objc_classname中,方法名保存在 __ TEXT,__ objc_methname中。根据class-dump的原理可以知道,最后获取类名和方法名也是从这里读取的。既然如此,那就可以通过改两个section对应的类名和方法名来进行混淆。
使用MachOView打开可执行文件,找到__ TEXT, __ objc_classname,在需要混淆类名的Data列进行双击修改,修改之后对整个包进行一下重签名,那就可以了。
同样运用方法一中的ios-class-guard生成原始类名与混淆后对应的json文件,再通过解析Mach-O文件中对应的section进行替换,就可以实现静态类名和方法名。
此外,在分析这种混淆后的App的时候,dump方法名去分析就不怎么好找了,不过最终还是可以通过lldb动态调试来确认方法的作用。