前言
客户提出了代码安全要求。
原因
代码混淆加固,提高反编译和逆向工程难度
使用原程序转储,您可以转储所有源程序的所有函数信息:将列出项目中的所有方法和变量。 黑客很容易了解程序结构并方便进行逆向工程。
实现原理
只混淆重要代码,否则会被App Store拒绝
1、提取项目中的类名、协议名、方法名,使用宏定义替换为随机生成的字符串。 2、系统库生成的方法名和关键字不能替换,否则会报错。 3. Swift混合项目:Swift中的代码不可替换; 同时,Swift 称为 -C 的具体方法名也不能轻易替换; 4、第三方库暴露的头文件的方法名不可替换; 其他变化
与主APP分开开发,我们完全改了名字。
应用程序编程接口
首先,加密API不能再使用。 苹果曾表示加密功能过于明显。
将所有扫描到的API放到一个plist文件中并保存在本地。 然后我们创建了6个数组,每个数组有6个单词,每次从每个数组中随机选择一个单词。
图片
使用脚本遍历本地所有png文件。 当然,你可以自己添加.jpg格式的遍历。 按照我自己的命名规则重命名了所有图片。
类前缀替换
这一步主要是修改文件名。 程序扫描绝对地址下的所有文件。 只要将“XX”开头的文件替换为“AB”,每次替换一个文件时,都要遍历所有文件,替换所有使用该头文件的文件内容。
注意
类前缀替换有时无法替换某些情况。 我还没能找到问题所在,但这种情况很少见。 您可以手动查找并替换它。
生成垃圾代码
我使用plist创建了一个垃圾方法名称,并为每四个方法生成一个带有参数名称的方法。 目前每个文件中只生成一个垃圾方法。当然,你可以多运行几次,就会生成多个垃圾方法。
实施方法
1、图片资源修改名字
2、修改工程名
3、类前缀修改,如“GD”修改为“IE”,即修改了文件名
4、混淆随机添加垃圾代码、参数
5、修改方法名前缀
6、人工修改部分方法名,人工对重要类中的方法进行打乱排序
7、(可选)本地图片超轻量级压缩,打乱hash值,新上的马甲包建议修改
开始混淆1.在项目中添加两个文件:.sh&func.list
cd 到您的项目路径并按 Enter
然后在终端中分别输入touch.sh和func.list并回车
.jpg
将我们创建的两个文件添加到项目中,进入2..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文件中添加这段代码#".h,然后编译,是否报错?是这样的吗?
聚氯乙烯
在左上角的+号中,选择New Run Phase,然后写入你的.sh文件的地址,如下图所示
544.jpg
然后回到我们的PCH文件,打开我们刚才注释掉的那行代码,然后再次编译看看是否通过。 这次证明我们已经完成了代码混淆的前期工作。
4. 如何混淆代码
如果您找到想要混淆的类(.h .m)文件也没关系。 复制你想要混淆的代码,粘贴到我们的func.list文件中。然后编译并切换到这个界面
可以看到我们定义的属性或者方法名已经被混淆了。
注 1:仅对带有 .mh 的类进行混淆。 仅具有 .h 文件的静态库和其他类无法被混淆。 2. 对于系统库,用户可以手动指定。 这个可以解压出来,直接获取系统库的头文件。 就是这样,脚本会自动扫描所有系统关键字并直接排除。 3.对于第三方库,用户可以手动指定目录,脚本会自动扫描并提取关键字,避免这些关键字混淆时。 4. 含有隐藏功能或记录功能,包括指向赌博或彩票网站的开关。
常规解决方案:去掉隐藏的功能模块代码或者对需要隐藏的代码和定向跳转链接URL进行混淆,适当增加逻辑复杂度。
5.pp历史违规和账号历史违规可能会触发2.1礼包。审核流程 1.For(准备上传) 2.For(等待审核) 3.In(审核) 4.(等待开发者发布) 5. Ready For Sale(准备出售)机器审核和人工审核
苹果审核大致分为三部分,预审核、机器审核和人工审核。
1.包上传后,首先会进入预审,会扫描API等,如果没有问题就会出现在iTC中,然后就可以提交了。 2、审稿前期,即For(等待审稿)阶段一般是机器审稿。 3、机审不通过则直接驳回。 通过后,将进入人工审核,即In(审核)阶段。 这个阶段主要看App。 元数据,如标题、描述、截图等,以及检测App的功能使用情况,常见的IPv6也在这里检测。延期审核
延迟审核一般针对大量同类型应用,比如游戏(斗地主等),以及涉及敏感话题的应用,比如金融、彩票、VPN等。尤其是游戏,苹果已经想通了此类App开发者的伎俩(背心袋、隐藏支付等)。 不过,由于一些开发者隐藏工作做得很好,苹果无法获得确凿的证据,所以只能故意拖延。
注意
除了看时间之外,还有一个方法可以判断是进入机器审核状态还是人工审核状态,那就是检查后端。 如果有美国IP登录,应该是人工审核; 如果只启动了App而没有深入访问,则说明机器审核员正在扫码。
补充 2.1 拒绝原因 1.1.6 – 包含虚假信息、功能或误导性元数据
这通常是因为标题、图标、截图等存在误导性,或者某些关键词被苹果列入黑名单,比如红包、话费等,但审核条款没有明确说明。 解决上述情况的方法是使用保守的文案或材料。
2.3.0 – 包含无需审核即可更改应用程序功能的能力
比如App功能的热更新发生了变化,这种情况下就需要去掉热更新,或者必须对热更新模块代码进行深度混淆!
2.3.1 – 包含隐藏或记录的功能,包括引导您进入赌博或彩票网站的开关。
常规解决方案:去掉隐藏的功能模块代码或者对需要隐藏的代码和定向跳转链接URL进行混淆,适当增加逻辑复杂度。
3.1.1 – 应用内购买以外的支付机制,用于解锁应用中的特性或功能。
对于第三方支付,尽量避免使用易扫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;
参考: