前言
客户方面提出了代码安全的要求。
起因
代码混淆加固,以提高反编译逆向难度
使用classdump对原程序进行dump,可以dump出所有源程序的函数所有信息:会把你项目中的所有方法和变量都罗列出来。易于黑客们了解程序结构方便逆向。
实现原理
只混淆重要代码,要不然会被App Store拒绝
1.提取项目中类名、协议名、方法名,使用宏定义将其替换成随机生成的字符串
2.系统库产生的方法名、关键字,不可替换,否则会报错
3.Swift混编项目:Swift中代码不可替换;同时Swift调用Objective-C的特定方法名也不可以轻易替换;
4.第三方库暴露的头文件的方法名,不可替换;
其他
改头换面
从主APP上拉的分之进行开发,我们把project名称完全换成了另一个。
API
首先base64加密API肯定不能再使用了,苹果都说了,加密特征太过明显。
将所有扫描出的API放到一个plist文件中保存在本地,然后我们建立了6个数组,每个数组中有6个单词,每次从每个数组中随机抽取一个单词。
图片
利用脚本遍历本地所有png文件,当然你可以自行添加.jpg格式遍历。根据自己的命名规则将所有图片重新命名了一波。
类前缀替换
这一步主要是更改文件名。程序扫描绝对地址下的所有文件,只要是带”XX”开头的文件都替换成”AB”这种,另外每次替换一个文件都要遍历所有文件,将所有用到这个头文件的文件内容进行更换。
注意
类前缀替换有时会有个别没有替换到,我没能定位到问题,但很少,可以手动查找替换
生成垃圾代码
我用plist专门搞了一个垃圾方法名,每四个方法生成一个带参数名的方法。暂时每个文件里只生成一个垃圾方法。当然可以多运行几次,就会生成几个垃圾方法
已实现方法
1、图片资源修改名字
2、修改工程名
3、类前缀修改,如“GD”修改为“IE”,即修改了文件名
4、混淆随机添加垃圾代码、参数
5、修改方法名前缀
6、人工修改部分方法名,人工对重要类中的方法进行打乱排序
7、(可选)本地图片超轻量级压缩,打乱hash值,新上的马甲包建议修改
开始混淆
1.项目中增加两个文件:confuse.sh&func.list
cd到你项目的路径下,然后回车
然后在终端中分别输入 touch confuse.sh
和func.list
然后回车
把我们创建的这两个文件添加到项目中去
2.confuse.sh中代码
#!/usr/bin/env bash
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"
export LC_CTYPE=C
#维护数据库方便日后作排重
createTable()
{
echo "create table $TABLENAME(src text, des text);" | sqlite3 $SYMBOL_DB_FILE
}
insertValue()
{
echo "insert into $TABLENAME values('$1' ,'$2');" | sqlite3 $SYMBOL_DB_FILE
}
query()
{
echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE
}
ramdomString()
{
openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16
}
rm -f $SYMBOL_DB_FILE
rm -f $HEAD_FILE
createTable
touch $HEAD_FILE
echo '#ifndef Demo_codeObfuscation_h
#define Demo_codeObfuscation_h' >> $HEAD_FILE
echo "//confuse string at `date`" >> $HEAD_FILE
cat "$STRING_SYMBOL_FILE" | while read -ra line; do
if [[ ! -z "$line" ]]; then
ramdom=`ramdomString`
echo $line $ramdom
insertValue $line $ramdom
echo "#define $line $ramdom" >> $HEAD_FILE
fi
done
echo "#endif" >> $HEAD_FILE
sqlite3 $SYMBOL_DB_FILE .dump
3.项目中添加一个.PCH文件
在.pch文件中添加这么一句代码#import"codeObfuscation.h
然后我们编译一下,是不是报错了?是不是这样的?
Phases中的左上角的+号,选中那个New Run Script Phase
,然后如下图所示,把你的confuse.sh
文件的地址写进去
然后返回我们的PCH文件,把我们刚才注释的那行代码打开,然后再编译一下子,是不是通过了。这个时候就证明,代码混淆的前期工作,我们已经做好了。
4.如何进行代码混淆
找到一个你想要混淆的类(.h .m)文件都可以。把你想混淆的代码复制一下,然后粘贴到我们的func.list文件中去。然后编译一下,然后把切换到这个界面
我们就可以看到,我们定义的属性或者方法名都被混淆了。
注意
1.只针对有.m.h的类进行混淆,静态库等只有.h文件的没法进行混淆
2. 对于系统库,让用户手动指定,这个是可以提取的,直接拿到系统库的头文件即可,脚本会自动扫描到所有的系统关键字,直接做排除处理。
3.对于第三方库,用户可以手动指定目录,脚本会自动扫描提取关键字,在混淆时避免这些关键字
4.含有隐藏功能或为记录的功能,包括定向到赌博或彩票网站的开关。
常规解决方式:去除隐藏功能模块代码或将需要隐藏功能的代码及定向跳转链接网址做混淆处理,适当增加逻辑复杂度。
5.pp的历史违规行为和账号的历史违规行为都有可能触发2.1大礼包。
审核流程
1.Prepare For Upload(准备上传)
2.Waiting For Review(等待审核)
3. In Review(审核)
4.Pending Developer Release(等待开发者发布)
5.Ready For Sale(准备销售)
机审和人工审核
苹果审核大体分为三部分,预审、机审和人工审核。
1.包上传后首先进入的是预审,会被扫描API等,没问题的话才会在iTC里出现 然后才可以提交至 Waiting。
2.审核前期,也就是 Waiting For Review(等待审核)阶段一般是机审
3.机审不通过则直接被拒,通过后会进入人工审核,即In Review(审核)阶段,这个阶段主要看的是App的元数据,例如标题、描述、截图等,以及检测App的功能使用情况,常遇到的ipv6也在此处检测。
延期审核
延期审核一般针对的是大量同种类的App,比如游戏(斗地主等),还有涉及敏感题材的App,比如金融、彩票、VPN等。特别是对于游戏,苹果已经摸清了此类App开发者的套路(马甲包、隐藏支付等),但由于一些开发者隐藏工作做得好,苹果又无法拿到确凿证据,所以只能故意拖延。
注意
判断是进入了机审状况还是人工审核状态,除了看时间外,还有一个方式,就是去看后台,如果有美国iP登录,应该就是人审了;如果只有App启动但没有深度访问,说明在机审呢,正在扫代码。
补充2.1被拒原因
1.1.6 –包含虚假信息,功能或误导性元数据
一般是因为标题或者icon和截图等有误导的嫌疑,或有些关键词是被苹果列入黑名单的,例如红包包、话费等,但审核条款又没有明确指出。对于上述情况的解决办法是使用保守的文案或素材。
2.3.0 – 含有不经审核也可更改App功能
如改变App功能的热更新,这种情况需要把热更新去除,或者对热更新模块代码做深度混淆处理!
2.3.1 – 含有隐藏功能或为记录的功能,包括定向到赌博或彩票网站的开关。
常规解决方式:去除隐藏功能模块代码或将需要隐藏功能的代码及定向跳转链接网址做混淆处理,适当增加逻辑复杂度。
3.1.1 –应用内购以外的支付机制来解锁App中的功能或功能。
对于第三方支付,尽可能避免使用易扫描的SDK版本,推荐使用H5版本支付。支付跳转链接相应的做屏蔽混淆处理。
4.3.0 –是另一款应用的复制品,或与另一款应用明显相似
被认为是重复App或马甲包,变更UI和名称,填充无用代码等。
A、改名字;
B、修改素材及UI色调等,例如修改icon,修改主色调;
C、修改功能界面等,可改功能可做小开关;
D、填充代码(最好50%以上)或注释块;
相同的马甲包提交至少要间隔一天以上,避免被同一个审核员看到。
升级version(版本)号、换bundle id,换开发者账号再提交审核
如果以上步骤不奏效,还可以尝试采用修改应用价格、发布地区、产品分类等方式。
不过注意,App上架后价格、发布地区是可以修改的,但产品分类不可以,对这个有要求的慎用!
5.2.1 –未由拥有并负责提供该应用程序提供的任何服务的法律实体提交。
未提供 App 上架所需的行业资质,比如:金融营业许可证、游戏版号等。这个上面讲过些常规方式。
5.3.4 – 含有货币游戏(如:体育下注、赌场游戏等),但未提供相关许可资质。
同上,提供资质,审核时最好不要勾选中国区,或使用海外账号。
苹果对开发者帐号会进行权重管理
权重越低的帐号,审核越严格;
同样的包,可能在权重高的帐号上就能过,在权重低的帐号上就是4.3;
- ①如果App没有违反上述任何一点,其实直接回复没有违反即可!当然,如果想增加过审几率也可以按照邮件中罗列的审核指南一一进行解释,说明自家 App 并不存在这些规则中的问题,尽可能描述详细。如果回复后并没有推进,可以配合加速审核或审核申诉,不过需要注意,加速审核次数不要用太多,审核申诉可能引来审核团队更严格的审核,需要谨慎。注:2.1刚出现的时,即使App有违规行为直接回复也是有可能过审的,但是目前有点用烂了,苹果那边应该是敏感了,目前过审几率极低,而且有可能被延期。
- ②如果App违反上述某点,建议认真修改后回复苹果,重点看上次或历史被拒记录,确定回复侧重点。如果回复后并没有推进,也可以配合加速审核或审核申诉,不过有延期等风险。
- ③除了这些方法,有人还用过一种方式过审,即用新账号上传,上面说过“苹果审核人员应该并没有开始审核,仅是针对App的历史违规记录或开发者账号的违规记录等发送了这封邮件。”但这种方式并不适合所有App,而且苹果可能会发现新账号的App和旧账号以及旧App的关系而产生连带处罚,要看运气。
参考:
https://www.niaogebiji.com/article-17212-1.html?from=groupmessage&isappinstalled=0