深入解析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文件名,不是特别麻烦也顺手改掉;包名、启动页、图标应该都是基本的东西不会被忽略。

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

相关推荐
DogDaoDao7 小时前
Android 硬件编码器参数完全指南:MediaCodec 深度解析
android·音视频·视频编解码·h264·硬编码·视频直播·mediacodec
二哈赛车手8 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
为何创造硅基生物8 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
JohnnyDeng948 小时前
Android 自定义 View:Canvas 绘图与事件分发深度解析
android
吃好睡好便好8 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
栗子~~8 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
星寂樱易李8 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
YDS8299 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
仰泳之鹅9 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆9 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript