本文已同步到 如何通过 Mapping 文件反混淆 ,提供更好的阅读体验
写在前边
做过 Android 开发的应该或多或少都知道“混淆”这个技术点,它不仅可以帮助我们增加三方逆向的难度,还可以有效减少包体积,瘦身 APK
其实这些能力都来自于 Proguard 这个程序,Proguard 能利用字典文件,在编译时将我们的类名,方法名,字段名都替换掉,最后生成一份非常反人类的编译产物。Proguard 在每次运行时都会创建一个 mapping.txt 文件,其中列出了经过混淆处理的类、方法和字段名称与原始名称的映射关系。此映射文件还包含用于将行号映射回原始源文件行号的信息
这篇文章的目的就是要解析生成的 Mapping 文件
正文
Mapping 文件的来源与用途
以下就是 Mapping 文件的生成过程
这个 Mapping 文件是由 Proguard 程序自动生成的,会存放在 output 目录下,与 release 包放在一起。需要谨记的是,Mapping 文件可能在每次 Proguard 运行后都会不同,所以发布给用户的包一定要留存好 Mapping 文件,方便后续跟踪解决问题
了解 Mapping 文件的好处
了解 Mapping 文件最直观的好处在于我们跟踪线上的经过混淆之后的 Crash 信息时,可以从 Mapping 文件逆向推出原始的堆栈信息,更快更方便的定位问题,但不只这些,我们还可以通过 Mapping 文件处理内存快照文件 Hprof 的反混淆,处理 Systrace 的文件的反混淆,还有 Nanoscope 文件的反混淆等
如何解析 Mapping 文件
注意:Android 在新版中启用了 R8 编译器,没有使用 Proguard 工具,虽然兼容 Proguard 的配置和字典等,但是编译出来的 Mapping 文件格式还是有一点不同。我们会在最后一个小节讲一下其中的不同
下面我们详细来看 Mapping 文件的格式
classline
fieldline *
methodline *
Mapping 文件的正式部分由多个 Class 块组成,每个 Class 块中包含混淆前后的类信息,字段信息,方法信息。每个 Class 块由顶格的类信息开头,后边跟着开头带有4个空格的字段信息与方法信息
每个 Class 块中详细格式如下:
类信息:
originalclassname -> obfuscatedclassname:
混淆之前的全限定类名与混淆后的全限定类名通过 ->
分隔符分割,以 :
标识当前类信息的结束,标识类内字段,方法信息的开始
备注:全限定类名,是指带有包名限定的类名,可以完全定位一个类
字段信息:
originalfieldtype originalfieldname -> obfuscatedfieldname
混淆之前的字段信息与混淆之后的字段信息同样通过 ->
分隔符分割,值得注意的是,混淆前的字段包含了字段类型和字段名称,而混淆之后只有字段名称
方法信息:<