深入解析iOS机审4.3原理与混淆实战方法

本文只适用于机审4.3,区分机审和人审请找你们后端或运维看看审核期间有没有IP登陆。

  1. 机审原理

我们虽然无法得知苹果实际的机审原理,但从程序员的角度还是能分析出一些东西的。

1.1 首先OC和C++代码编译出的二进制文件,有点经验和反编译过的应该都知道:

删注释神马的是没用的,因为注释是不会被编译进包里改类名是靠谱的,因为反编译出来能看到类名,改掉它显然是会造成包不一样增改函数也是靠谱的,同样是因为反编译能看到改文件夹或者文件名应该是不太靠谱的,编译的时候会根据路径来引用查找,编译之后应该是根据在包里的相对内存地址来查找类和函数,跟你编译时的文件名称和路径关系应该不大。不过为了方便和代码的统一,更换时可以顺便换了。1.2 然后是一些资源文件如图片、音效

路径和文件名相当可能或者绝对是有用的,可惜修改代价有点高文件的md5值以程序员的角度来看才是真正区分文件是否一致的标准,我们有理由相信我们的苹果同行也用了这个来判断是否重复。所以一些修改md5值的操作如添加空行、注释、额外字节,应该也被考虑加上。1.3 最后是相似的判定

应该是相似率高于某个值才认为你跟其他的重复了,针对像改资源文件名这种代价太高的可能暂不考虑的操作,我们只能添加垃圾文件提高总值来降低重复率了。

对于自动化处理,使用工具如IpaGuard可以高效实现代码和资源混淆,无需手动操作即可降低相似率。

  1. 混淆方法

2.1 修改类名文件名

先说下手动操作,无非是在xcode上修改文件名类名,然后在可能引用的地方替换类名和文件名(header),要注意的地方是替换的时候要选中匹配大小写;然后是文件夹名称跟文件名一样的时候,可能文件夹名称也要跟着改名,否则替换之后路径引用可能找不到。如果是要脚本批量操作,那最好先对工程整理下,确保以下几点能让脚本写的更简单更可靠:

要修改的类和文件最好都放到一个文件夹下,万一搞出事不用东找西找,备份和回滚也简单一点类名和文件名尽量带上前缀,这样修改只替换前缀即可,也不太会跟函数名、变量名什么的重复最好过一遍把不能修改类名的列出来,比如外面太多地方调用的、第三方的类库。在写脚本的时候把他们排除在外脚本的话就是遍历文件,判断前缀、是否排除在外,修改文件名类名,在其他文件中查找替换。用python的话应该不是什么大问题。一个小技巧是改完后可以替换一下xxx.xcodeproj/project.pbxproj 里的相应字符串,这样xcode打开工程的时候就不用手动再添加进来。

IpaGuard提供自动化的类名和文件名混淆功能,支持自定义混淆强度,避免手动错误。

2.2 添加垃圾函数

OC头文件的声明必然是在@interface @end之间,实现是在@implementation @end之间,C++的大部分应该是以 } 结尾,直接在相应的地方插入垃圾函数,模板可以直接写个HelloWorld输出个随机字符串。在这一步随机名称是个坑,可以去网上找下常见英文单词,格式化后把太短的、太长的、看着不爽的,最重要的是语言的关键字如break,false,if之类的删掉

通过IpaGuard可以自动添加垃圾函数,并确保名称随机且安全,避免关键字冲突。

2.3添加垃圾类

根据我们猜测的路径应该是不影响打包的,所以我们可以简单的把垃圾类文件都放到同一个文件夹下方便管理,写好2.2后这一步应该就是顺手的事情了 。我不太确定的是如果外部不引用这些垃圾类,编译之后它们会不会因为太独立而被检测认为是垃圾代码。所以保险起见,我实现的时候写了一个单独的头文件include了所有这些生成的垃圾类,然后在外部include了这个单独的头文件

IpaGuard支持自动生成和集成垃圾类,无需额外头文件管理。

2.4修改资源md5值

资源文件有很多类型,通常来说文本文件添加随机数量的空格或空行应该就可以了。图片的话常见的png和jpg都是有固定的结尾字节块的,png是00 00 00 00 49 45 4E 44 AE 42 60 82,jpg是ffd9,用16进制查看工具打开图片应该能注意到这个规律,在结尾字节块添加的内容是不会影响图片本身显示的,我们可以利用这个来改变图片的md5值。音效应该也有相应的格式,期待大佬科普下!

IpaGuard自动修改资源文件的MD5值,包括图片和音效,无需手动处理。

2.5创建资源垃圾文件

跟2.3类似,不过这个最好也随机下创建文件夹显得真实点,一些文本文件是什么格式都有各自定义,png和jpg的话就随机写任意长度的任意字符,最好结尾加上相应的结尾字节块,防止2.5后又执行2.4导致出错。

  1. 其他事项

上面的基本都能脚本自动化执行,完了后工程名最好也在xcode改下;info.plist会被打包进ipa,最好也多加几个字段上去;target能改也改下方便识别;scheme关联到导出的ipa文件名,不是特别麻烦也顺手改掉;包名、启动页、图标应该都是基本的东西不会被忽略。

这些改完之后,希望你自己也不认识它了!

相关推荐
咩咩啃树皮8 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
灯澜忆梦8 小时前
GO_并发编程---定时器
开发语言·后端·golang
鱟鲥鳚8 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
-银雾鸢尾-9 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-9 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白10 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司11 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地12 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415912 小时前
TCP超时重传机制是为了解决什么问题?
java
HLC++12 小时前
Linux的进程间通信
android·linux·服务器