行业动态
iOS开发中代码混淆过审的方法名和特殊需求
2021-03-22

由于IOS系统的封闭性,与Android相比,IOS开发期间的代码混淆可能不是必需的。但是,仍然存在某些安全性要求(可以通过类转储反编译来公开类的方法名称)和特殊要求(例如,对背心包进行混淆)!

此脚本是从kaich / codeobscure借来的。在使用原始作者的脚本的过程中,发现了一些错误和缺点,例如对正则表达式的判断不正确,生成了太多无用的替换宏,以及在手动故障排除上花费了太多时间...

因为我对python不太熟悉,所以我在原始作者的基础上做了一些完美的更改。

优化内容:以下大部分内容来自kaich / codeobscure的实现原理

实际上,该插件的实现非常简单,将方法名称提取到用户编写的文件中,然后使用宏定义将其替换为任何随机字符串。但是,通过这种方式需要注意一些点:

系统库生成的方法名称不能被替换;系统使用的关键字无法替换;否则,将报告错误; Swift混合项目,无法替换Swift中的代码;同时,Swift调用Objective-C。特定的方法名称不能轻易替换;第三方库公开的头文件的方法名称不能替换;

根据上述规则(可能有遗漏),该脚本使用一种相对简单的方法来避免:

仅扫描.h和.m文件,仅扫描方法名称。 (对于属性名称,我尝试了扫描,但是由于属性的访问方法多种多样,因此不建议混淆,否则会导致额外的工作量);对于系统库,让用户手动指定它,可以将其提取并直接带到系统中。库的头文件已足够,脚本将自动扫描所有系统关键字并直接排除它们。 (以IOS 11 SDK为例,大约有60,000个系统关键字);对于Swift代码,可以将其直接从扫描目录中排除;对于第三方库,用户可以手动指定目录ios开发代码混淆,脚本将自动扫描并提取关键字,以避免在混淆时避免使用这些关键字。

根据上述原理,基本上可以避免大多数情况下的混淆错误;当然,由于各个项目的复杂性,一些复杂的混淆错误是无法避免的,因此需要对代码进行手动调整。

如何使用此仓库进行克隆;您需要安装python3运行环境,可以使用brew安装该环境,因此在此不再赘述。您首先需要确定以下各项:

注意:建议使用绝对路径作为目录,因为相对路径容易出现问题。

确认以上各项后,在仓库的根目录中找到Confuse.py文件,并使用以下命令行模板运行它:

python3 Confuse.py \
-i 你需要混淆的代码的目录,可以是多个目录,以`,`分隔 \
-s 当前项目编译环境的SDK库头文件目录,可以是多个目录,以`,`分隔 \
-e 你不需要混淆的代码的目录,Swift代码目录,可以是多个目录,以`,`分隔 \
-c 你需要提取关键字做排除混淆的目录,可以是多个目录,以`,`分隔 \
-k 可选,用于存放需要过滤的key(增加内容)
-o 输出文件目录

注意:每个参数的含义如下:

运行后ios开发代码混淆,将在您指定的输出目录中生成Confuse.h文件。内容一般如下:

#ifndef NEED_CONFUSE_h
#define NEED_CONFUSE_h
// 生成时间: 2018-04-03 17:20:51
#define Function1 linotypistStonecrop
#define function1 exactingnessMimologist
#define function2 sheepmanSupersublimated
#define functionWithTitle kensititeCratinean
#define subTitle icelandicUntell
#endif

此文件包含一堆宏定义。需要替换的方法名称被替换为一些随机字符串。因为宏定义是全局替换,所以我们只需要将文件导入到我们的项目中,就可以将其引入PCH文件中。


393701618