主页 > imtoken和比特派 > iOS代码混淆原理初探

iOS代码混淆原理初探

imtoken和比特派 2023-08-28 05:12:59

2021-11-14

在iOS版手游平台SDK中,除了官方的AppStore支付外,我们还集成了第三方支付(微信支付H5和支付宝支付H5版)。 如果用于企业签约,则无需处理,可直接使用。 但是如果我们需要上架AppStore,就需要屏蔽第三方支付。 我们在后台设置开关,直接在后台切换支付方式。 listing审核通过后,切换到Appstore支付; 审核通过后转第三方支付。 因为第三方支付是H5方式,机器审核不会检测到。 同时,为了防止抽查,后台还可以设置将之前支付的次数设置为AppStore支付,然后使用第三方支付,降低被抽查的风险。

但是仅仅这样做是不够的,如果你需要用这个SDK来玩多个游戏,或者多个马甲包。 为了防止相同代码被4.3或被代码标记的风险,我们需要对SDK的代码进行混淆处理,每次发布一个马甲SDK。

关于iOS代码的混淆,查阅了网上很多文章。 混淆的原则性文章都是多年前纯字符的随意替换。 按照现在的机器审核政策,已经很难通过审核了。 还有一些混淆工具usdt混淆源码,但是是按时间收费的。

那么,下面就以U8SDK下的XSDK(手游平台SDK)项目为基础,谈谈iOS中的代码混淆。

如果在开发之初,开发人员经验丰富,或者操作经验丰富,会提前注意混淆,那么混淆会很简单。 可以提前指定代码编写规则,尽可能保证类方法变量等的唯一性。 例如,所有的类都以X开头,所有的方法函数都以F开头,所有的属性都以P开头,所有的内部变量都以S开头,等等。 那么后面写混淆的时候,几行代码就可以了。

但我相信大多数项目,如 XSDK,可能是事后才想到的。 到了执行此操作的时候,我会发现按我喜欢的方式命名代码的代价。 但是不可能为了方便混淆而重写框架usdt混淆源码,程序也不愿意。

因此,我们只能花一些时间编写混淆脚本。 我们用python写混淆脚本,用python来做这个是很合适的。

首先,让我们确定混淆目标:

iOS代码混淆原理初探

列出混淆目标后,我们来设计混淆思路。

1.词汇替换

混淆或替换,用新名称替换旧名称。 以前网上很多人都是用纯随机字符来替换,但是现在的方法风险很大,很容易被苹果检测到,意图隐藏功能。

因此,我们采用双词库的形式进行混淆。 我们准备了两套词库。 一套是常用词库(词汇量约1000个); 另一个是程序常用词库(词汇量约100个)。

混淆后生成新名字时,我们根据需要从两组词库中随机拼接单词。

比如混淆类名的时候,目前有一个类名是AppStorePay。 我们首先从常用的词库中随机拼接单词,直到长度大于等于 AppStorePay 的长度。 然后使用程序同义词库中的随机词作为后缀。 这样的混淆名称可能采用 OneForTestListener 的形式。 它似乎接近于正常的类名命名。

另外,在混淆的时候,我们记录一个已经生成的新名字的列表,如果生成的新名字已经存在,则重新生成。 防止重复生成的新名称引起问题。

2、思维混乱

混淆的时候,我们可以逐行混淆,但是这样的话,误差可​​能会比较大。 我们希望在进行混淆后,一次编译通过,而不需要手动修改一些混淆失败的地方。 所以我们放弃了逐行混淆的方式。 采用更精细的混淆方法。

另外,在混淆的方式上,我们希望尽可能的符合通用的语法规则,而不是简单的适配XSDK项目。 (为了防止后续我们其他项目的混淆)

首先,我们加载代码目录下的所有代码文件,因此我们设计一个符合代码结构的层次结构:

iOS代码混淆原理初探

如图所示,我们首先设计了四个类。

XFolder 代表一个代码目录;

XClass 类代表一个类文件;

XFunction 类表示类中的一个函数;

XProperty 类表示类中的属性。

这样设计好之后,我们就可以调用XFolder中的load方法来加载XFolder对应目录下的所有class文件,以及所有Class文件中的函数和属性。

3.混淆实现

所有的代码类文件加载到内存后,现在我们需要在混淆目标中实现每个目标的混淆。 我们设计了一系列的混淆实现类来进行混淆:

iOS代码混淆原理初探

1、PCHCodeMixer:混淆XSDK.pch文件中定义的全局变量,替换源码中的所有引用

2.PropertyCodeMixer:混淆每个类中定义的属性,替换源目录下的所有引用

3.FunctionCodeMixer:混淆每个类中定义的函数,替换源码目录下的所有引用

4. FunctionCodePostMixer:混淆函数内部定义的属性,在合适的地方插入垃圾代码。

5.ClassCodeMixer:混淆类名,替换源代码目录和xcode工程文件中的所有引用

6.ResourceMixer:混淆资源,更改所有图片文件的md5,混淆所有图片名称,替换所有源码目录和xcode工程文件中的所有引用

7. GlobalNameMixer:混合目录、框架名称、Bundle名称等全局名称。同时替换所有文件和xcode工程文件中的所有引用

有了以上组件,就可以完成框架代码和资源的混淆和替换。 另外还有两个辅助混音器类,主要完成demo工程和文档内容的替换:

8. DemoMixer:替换demo工程中的引用。

9. DocMixer:替换文档中相应的引用。

还要注意的是,混淆的时候,通过正则表达式解析出对应的函数和属性,但是由于iOS的特殊性,函数中有方括号,函数的地方可以无限嵌套。 因此,在处理函数时,可以使用栈结构进行解析匹配。

另外,我们在解析函数体内容的时候,也是使用栈结构来解析的。 也就是说先解析类中的所有函数名,然后从后往前解析函数体的内容。 这样分析也方便很多。 其他地方的混淆基本上可以用正则表达式来搞定,但是在写正则表达式或者用正则匹配代替的时候,尽量细化规则,严格匹配。 替换时,根据要替换的字符串的长度,先替换长字符串,再替换短字符串。

目前XSDK代码经过混淆工具混淆后,不需要手动替换。 直接打开xcode,编译重新生成XSDK framework和bundle文件,然后替换到XSDK Demo工程中的SDK目录下,然后直接运行XSDK Demo。

如果提供给研发方,只需要将上面替换的XSDK Demo和文档提供给研发方即可。 经过混淆工具混淆后,Demo工程和文档都会被替换,无需手动替换。

分类:

技术要点:

相关文章: