iOS通过shell脚本批量修改属性

2020-01-21 05:02:19王冬梅

背景

公司需要做一系列的壳版本,壳版本如果内容雷同提交到App Store会有被拒绝的风险,除了我在上一篇文章中说道的在壳版本中注入混淆的代码,防止被苹果检测到内容太过雷同而导致审核被拒绝。还有另一种可行的方法是批量修改源文件中的类名、属性、方法名称等会在二进制文件中留下符号标记的信息,绕过苹果的机器审核。
这篇文章介绍的是如何使用脚本批量修改属性名称,后续还有系列的包括使用脚本批量修改类名称、方法名称等信息的文章。

结果

下面是执行脚本替换了属性的结果图,脚本把所有需要替换的属性添加了abc后缀,当然依然是可以正常编译运行的

源码:https://www.easck.com/file_images/article/201803/2018341828001.png" />

分析

原理分析

objc代码中的类名、属性、方法、源文件路径等信息最终会被打包到二进制文件中,保存在二进制文件中的.sym符号表段中,可以使用objdump -t命令查看二进制符号信息,以下的命令把objdump -t的结果写入到文件InjectedContentKit_Example_Symbols中去。


objdump -t InjectedContentKit_Example > InjectedContentKit_Example_Symbols

文件的内容会很大,所以选择了几个代表性的内容说明:


0000000100026350 l d __TEXT,__text	__text
# 这里保存的是类源文件的路径符号信息
0000000000000000 l d *UND*	/Users/aron/PuTaoWorkSpace/project/sscatch/DevPods/InjectedContentKit/InjectedContentKit/Classes/Composer/PubSearchDataComposer.h

# 这里保存的是属性对应的var信息
0000000000000000 l d *UND*	_OBJC_IVAR_$_TextCardItem._title
0000000000000000 l d *UND*	_OBJC_IVAR_$_TextCardItem._showReact
0000000000000000 l d *UND*	_OBJC_IVAR_$_TextCardItem._topChart
0000000000000000 l d *UND*	_OBJC_IVAR_$_TextCardItem._reaction

# 这里保存的是属性信息对应的getter方法信息
00000001000264a0 l  F __TEXT,__text	-[TextCardItem title]
00000001000264c0 l  F __TEXT,__text	-[TextCardItem showReact]
00000001000264f0 l  F __TEXT,__text	-[TextCardItem topChart]
0000000100026510 l  F __TEXT,__text	-[TextCardItem setTopChart:]

# 这里保存的是属性信息对应的setter方法信息
00000001000028a0 l  F __TEXT,__text	-[SSCatchInviteScheduler setOrganizer:]
00000001000028e0 l  F __TEXT,__text	-[SSCatchInviteScheduler setInputCardBack:]
0000000100002920 l  F __TEXT,__text	-[SSCatchInviteScheduler setInputTextBack:]

# 这里保存的是类文件的文件名信息
0000000000000000 l d *UND*	PubSearchDataComposer.m
000000005a937587 l d __TEXT,__stub_helper	__stub_helper
00000001000251c0 l d __TEXT,__text	__text

从上面可以看出,二进制中保留了很多信息和源代码有很大关系,我们做个简单的猜测苹果后台机器审查二进制的时候会通过二进制中的符号进行对比,如果两个二进制(一个主版本、一个壳版本)代码中的符号重合度超过某个阈值,就会判定这是发布壳版本的行为,而这是苹果说不允许的,所以可行的方法是修改源文件中的这些信息来绕过苹果的审查机制。