iOS代码混淆

这是iOS代码混淆教程

iOS代码混淆

一. 苹果审核机制原理

  1. 预审核扫描api,及plist文件字符缺失等;此处分两步,第一步为上传时苹果Application Loador等应用对于适配icon等的检查,第二步为上传后苹果的功能性检查,例如配置了Push功能但有缺失或者未打开功能,则会邮件提示等等;

  2. 机审此处扫描支付SDK等,及马甲情况,机器扫描主要看代码块,可参考百度蜘蛛抓取网站模块原理;如遇部分无法过机审情况可尝试加速绕过机审(不是100%成功);

  3. 人工审核此处主要检测功能或者App体验测试,例如用测试账号登录App体验功能,或其他是否明显bug等,ipv6也在此处检测;

二. 混淆过审的核心

1.ipa包特征:包括有代码相似性,资源相似性;代码相似性解决办法:

  • 已有代码的混淆(改类名、改函数名、改文件名、改工程名)
  • 添加一些无用的代码

资源相似性解决办法:

  • 资源改名
  • 适当添加一些无用的资源

2.开发者帐号:

  • 马甲包尽量不要关联到同一个开发者帐号

3.元数据配置相似性:

  • 针对收费产品,可以修改应用程序价格,打造与原产品不同的价格级别;

  • 修改应用程序发布地区,打造与原产品不同的售卖地区或分不同地区运营;

  • 修改产品分类,打造与原产品不同的产品侧重属性分类;

三. 代码混淆

使用工具 https://github.com/klaus01/KLGenerateSpamCode

详细使用教程🔽🔽🔽


KLGenerateSpamCode 垃圾代码生成器

本工具用于应对苹果对重复应用的审核(Guideline 4.3 Design Spam),避免苹果机审检测概率。

主要功能

  1. 修改工程名
  2. 修改类名前缀
  3. 扫描工程中的代码,生成同等数量的 Category 文件,文件中及是同等方法数量的垃圾代码。
  4. 修改 xxx.xcassets 文件夹中的 png 资源文件名。
  5. 删除代码中的所有注释和空行。

使用

使用源码

  1. 下载源码。
  2. 用 Xcode 打开工程并配置参数。如图配置参数
  3. 运行

参数说明

  • (必填) 源码文件夹绝对路径(如:/Users/kelei/Documents/work/git/projectName/source
  • -modifyProjectName [原名称]>[新名称] 修改工程名。程序会修改原名称-Swift.hPodfile原名称-Bridging-Header.h源码文件夹绝对路径原名称.xcodeproj原名称.xcworkspace的名称和内容。Podfile被修改后需要手动pod install
  • -modifyClassNamePrefix [工程文件 xcodeproj 绝对路径] [原前缀]>[新前缀] 修改源代码类名前缀。程序会扫描源码文件夹绝对路径下的 .h .swift 文件,修改文件名,修改使用该类名的代码,修改工程文件中的文件名。文件名有原前缀的会修改成新前缀,如:原前缀ViewController变成新前缀ViewController;没有原前缀的会增加新前缀,如:ViewController变成新前缀ViewController
  • -spamCodeOut [垃圾代码文件输出目录] [垃圾代码方法增加的参数名] 生成垃圾代码。程序会扫描源码文件夹绝对路径下的 .m .swift 文件中的类和方法,并生成categoryextension文件,文件中的方法是在代码原方法的基础上增加垃圾代码方法增加的参数名参数。如:-spamCodeOut /dir AppLog,会将- (void)setupKeys {}生成为+ (BOOL)setupKeysAppLog:(NSInteger)AppLog { return AppLog % 20 == 0; },会将- (void)foo:(NSString *)str {}生成为+ (BOOL)fooAppLog:(NSInteger)AppLog { return AppLog % 23 == 0; }
  • -ignoreDirNames [忽略文件夹名称字符串] 忽略这些文件夹,对-modifyClassNamePrefix-spamCodeOut-deleteComments参数有效。目前只会忽略源码文件夹绝对路径下一级的这些目录。如:/p/s -ignoreDirNames categorys,那么/p/s/categorys会被忽略,但/p/s/viewControllers/categorys不会忽略。
  • -handleXcassets 修改xxx.xcassets文件夹中的 png 资源文件名,同时也Contents.json文件中的关联名称,不会影响代码中使用图片。
  • -deleteComments 删除工程目录下 .h .m .swift 文件中的注释和空行。

另外修改图片 hash 值的方法

使用 ImageMagick 对 png 图片做轻量压缩,及不损失图片质量,又可改变图片文件 hash 值。方法:

  1. 安装 ImageMagick,brew install imagemagick
  2. 压缩工程目录下所有 png 文件,find . -iname "*.png" -exec echo {} \; -exec convert {} {} \;

使用经验

就我 2017-11 月的提交情况来看,只需要做如下修改就可以上马甲包了。

  1. 修改工程名
  2. 修改类名前缀
  3. 修改图片文件 Hash 值
  4. 修改 .xcassets 中的图片文件名
  5. 用别的电脑打包

已知问题

  • 生成的垃圾代码文件可能是 .m 文件中实现的私有类,编译垃圾代码可能会报错,删除该垃圾代码 .h .m 文件及可。

原文地址