Android混淆总结篇(二)

Ⅰ.前言

上篇文章总结混淆相关的知识点,基本的技术点都有罗列到。如果项目开发比较紧张,可以考虑套用混淆配置的模板,复制粘贴的基础上再修修补补. 上篇文章说到和朋友讨论的问题,前几天也基本探究完了,那么也得理理思路~总结总结,期望有更多的问题出现~才可以去探讨.

Ⅱ.异常收集

这篇文章主要的技术点是异常收集,项目上线前除了混淆、打包、加固、签名和发布等,还有一项是无可避免的,就是对线上的应用进行各种统计,对应用进行各种统计包括异常的收集统计、应用的渠道下载率、活跃量、留存率和页面访问路径统计等等,有很多第三方的统计SDK可供接入使用,比如友盟+、百度、诸葛IO 等第三方,精细点的话可以考虑下无埋点技术等. 只要在上线前集成了统计SDK,那么就可以在其相应的后台看到上线后各种数据的统计报表.

统计对于运营和项目维护还是很有必要的,开发人员可以看到收集到的异常,然后对异常进行分析并找到相应解决的方案,那么这里就要开始文章的主题了,下面的截图是友盟+后台收集到的异常信息,在其异常信息下面还可以收集到该异常发生的手机型号、版本和渠道。看下异常信息吧,当看到红圈圈出来的部分,是不是就迷惑了,异常信息里怎么会有abc 这样的替代符,本来异常信息可以让开发者清楚知道异常发生的地方,可以使其轻易定位到,但现在呢?难不成靠猜的方式去定位异常,那就呵呵了.怪不得朋友说异常信息定位问题非常迷惑,那么下面开始来整整这迷惑.

Ⅲ.还原混淆信息的方式

针对上面的异常信息出现abc 的替代符,主要是由于混淆打包导致的,上面abc 其实是项目的类名或变量名的代替符,那么如果apk没有经过混淆就会导致apk源码泄露或被二次打包,虽说混淆了之后的apk还是很大风险会泄露,但相对来说代码泄露的难度是增大了,所以混淆是不可缺的。那么上面的异常信息又该如何定位Bug呢?

Android SDK工具包就提供了解决的工具,sdk\tools\proguard\bin路径下名为”proguardgui.bat”和”retrace.bat”(windows和linux下,工具的后缀名不同)的两个工具,前者是通过图形化的方式去将被混淆的异常信息反编译,后者则通过命令行的方式将被混淆的异常信息反编译.那么在使用这工具前,还得有一个叫”mapping.txt”的文件,看下面截图,这是在打包apk完成后生成的一个文件,主要记录着混淆前后的信息映射关系。

每次打包apk 完成后生成的mapping.txt 都是有必要保存的,那怎么使用上面提到的 “proguardgui.bat”和”retrace.bat” 这两个工具呢?看下面截图即可,简简单单搞定proguardgui.bat ,但抱歉的是本人试了很多次,都不能将异常信息转换回去,而最无语的是搜索到的文章介绍的方法跟我操作的完全一样,这时候我就发现了经常碰到的奇葩问题,基本文章上演示截图的异常信息都是一样的,尼玛这些文章的截图既然都是抄袭的,难不成Android SDK提供的”proguardgui.bat” 图形化工具已经失效了,接着试试”retrace.bat” 工具.上面也提到了 “proguardgui.bat”和”retrace.bat” 这两个工具基本是一样的,只是使用方式不同,一个是图形化方式,一个则是命令行方式。

在retrace.bat命令行工具里反编译异常,使用的指令为

格式:retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
例如:retrace.bat -verbose d:/mapping.txt d:/wyk_stacktrace.txt

那么接着就验证下命令行形式的 “retrace.bat”,并不同于上面的proguardgui.bat 工具有面板可以粘贴报错信息,所以先把异常信息保存为txt文件,然后命令行进入Android SDK存放的路径sdk\tools\proguard\bin目录,根据上面的指令格式进行输入,结果如下:

结论:”proguardgui.bat”和”retrace.bat” 这两个工具包无法还原Apk线上被混淆的异常信息.



上面的截图就是使用”retrace.bat” 工具的反编译异常信息的结果,可以看到abc 的标识符依然存在,所以仍得不到完整的异常信息。反复试了很多次,依旧无果,还是找找有没有其他方式吧~~话说在Android SDK的sdk\tools\proguard\lib目录下有”proguardgui.jar”和”retrace.jar” 这两个jar包,上面使用到的”proguardgui.bat”和”retrace.bat” 这两个工具可能是基于这两个jar包的,思考如果直接使用这两jar包尝试反编译异常信息的话是否有解。先试试retrace.jar 这个jar包,命令行进入到jar包所在的目录,在命令行输入如下指令,输出的信息和上面的retrace.bat工具输出的一样,依然没有完整的异常信息.

格式:java -jar retrace.jar [-verbose] mapping.txt [<stacktrace_file>]
例如:java -jar retrace.jar -verbose d:/mapping.txt d:/error.txt

接着试试proguardgui.jar,命令行进入jar包所在的目录,输入 “java -jar proguardgui.jar” 启动proguard工具,看到的界面和proguardgui.bat 是一样的,应该说proguardgui.bat 启动的也是这个jar包,验证之后还是没有得到完整的异常信息.

结论:”proguardgui.jar”和”retrace.jar” 这两个jar包无法还原Apk线上被混淆的异常信息.


Ⅳ.根据mapping.txt文件验证

上面的工具可以还原被混淆的异常信息,其原理是因为mapping.txt存在其混淆前后的映射信息,那是不是可以根据被混淆的一小段异常信息在mapping.txt文件查找相应的映射关系,拷贝被混淆的异常信息在mapping.txt文件进行全文搜索,下面图1是收集在统计异常后台的信息,图2是在mapping.txt文件查找图1红圈部分的映射信息.图3也是异常信息和映射关系.

结论:通过上面异常信息混淆前后的映射关系,切记打包时将相应的apk和生成的mapping.txt进行对应保存,这将对上线之后的Bug追踪和维护起着非常重要的作用;

Ⅴ.其他还原混淆异常信息的方式

上面根据mapping.txt查找信息映射关系的方式,显然不适合线上Bug的追踪和应用的维护,因此就得另找出口,经常使用到的统计异常SDK有友盟+和Bugly,早前一直都在用友盟+的统计异常SDK,之后由于统计数据不及时和疏漏,所以之后的应用选择接入Bugly,Bugly针对异常的收集还是非常及时和准确的。

这些统计异常的SDK其实都有提供还原被混淆异常信息的功能,这样对开发者就非常友好了,该功能的位置在SDK后台的异常信息上边,只需要导入异常信息对应的应用版本的mapping文件,点击”解析”按钮就可以看到原始的异常信息。

在友盟+的统计后台亲测发现,被混淆的异常无法还原,探究了几番仍找不到原因.而在Bugly的统计后台亲测是有效的,可以看到下面被混淆的异常信息和还原之后的异常信息.

Ⅵ.总结

  • App线上异常的追踪,可以选择友盟+、百度、诸葛IO等第三方,精细点的话可以考虑下无埋点技术等;
  • 经过测试发现,Android SDK包的”proguardgui.bat” 和”retrace.bat” 这两个工具包无法还原Apk线上被混淆的异常信息;
  • Apk打包后生成的的mapping文件保存着代码混淆前后的映射关系;
  • 第三方SDK的统计后台一般都提供还原 “被混淆异常信息” 的功能;
  • 切记 打包时将apk版本和生成的mapping.txt进行对应保存.

本篇章总结的点,有不对的地方,请多多指正.

时间: 2024-08-05 07:59:20

Android混淆总结篇(二)的相关文章

Android核心服务解析篇(二)——Android源码结构分析

获得Android源码后,我们来分析源码结构.源码的全部工程分为如下三个部分. ①Core Project:核心工程部分,这是建立Android系统的基础,保存在根目录的各个文件夹中. ②External Project:扩展工程部分,可以使其他开源项目具有扩展功能,保存在external文件夹中. ③Package:包部分,提供了Android的应用程序,内容提供者,输入法和服务,保存在package文件夹中. 在获取的Android4.3源码目录中,包含了原始Android的目标机代码,主机

Speex 同时适用于 Ios 与 Android 【代码篇 二】

书接上一回. 前文提到如何利用协议编码好音频pcm数据,使其在解码的时候可以用于ios系统与Android系统. 现在是解码部分,解码部分主要是获取到.spx文件的全部字节,然后根据前文的协议,先获取到.spx的头信息,在头信息中获取到音频的相关参数,然后初始化播放器,再把每一帧解码出来进行播放. 关于协议部分,可以有很多种协议方式,可以沿用speex_header.h定义的方式也可以,我选择了最方便的一种. 以下几个参数特别说明一下,因为直接关系到解码的成败. 比特率:160 比特率为160,

android原生browser分析(二)--界面篇

我们先看一张浏览器的主界面,上面标示浏览器界面各部分对应的类,这里是以平板上的界面为例.给张图是为了给大家一个直观的感觉. BrowserActivity是整个应用的主界面,在onCreate中创建了Controller对象,Controller对象是整个应用最重要的管理类,这个后面再说. @Override public void onCreate(Bundle icicle) { mController = createController(); } Controller的创建中新建了UI类

android 电容屏(二):驱动调试之基本概念篇

关键词:android  电容屏 tp 工作队列 中断 多点触摸协议平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310(samsung exynos 4210)  作者:xubin341719(欢迎转载,请注明作者) 参考网站:http://edsionte.com/techblog/archives/1582这部分参考别人的多一点 android 电容屏(一):电容屏基本原理篇 android 电容屏(二):驱动调试之基本概念篇

Android studio 使用心得(四)—android studio 多渠道打包(二)

Android studio 使用心得(四)—android studio 多渠道打包 这篇文章讲了一种打包方式.是直接在android studio 里面可视化操作,结合配置文件.我个人觉得严格上来讲是不完全正确的操作,因为配置文件里面的签名文件根本没有用到.但是,打出来的包绝对没问题的.这篇主要是介绍直接在dos命令里面使用gradle命令打包.两行命令,简单gradle clean ,gradle build. 1,配置文件还是和之前的一样,我才贴一次代码 ? 1 2 3 4 5 6 7

【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象

前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五)Android事件分发机制(上)Touch三个重要方法的处理逻辑][下文简称(五),请先阅读完(五)再阅读本文],我们通过示例和log来分析了Android的事件分发机制.这些,我们只是看到了现象,如果要进一步了解事件分发机制,这是不够的,我们还需要透过现象看本质,去研究研究源码.本文将从源码(基

【朝花夕拾】Android自定义View篇之(八)多点触控(上)基础知识

前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/11155259.html],谢谢! 在前面的文章中,介绍了不少触摸相关的知识,但都是基于单点触控的,即一次只用一根手指.但是在实际使用App中,常常是多根手指同时操作,这就需要用到多点触控相关的知识了.多点触控是在Android2.0开始引入的,在现在使用的Android手机上都是支持多点触控的.本系列文章将对常见的多点触控相关的重点知识进行总结,并使用多点触控来实现一些常见的效果,从而达到将

Android多线程分析之二:Thread的实现

Android多线程分析之二:Thread 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前文<Android多线程分析之一:使用Thread异步下载图像>中演示了如何使用 Thread 处理异步事务.示例中这个 Java Thread 类都是位于 Framework 层的类,它自身是通过 JNI 转调 dalvik 里面的 Thread 相关方法实现的.因此要分析 Androd 中的线程,就需要分析这两层中的与线程相关的代码,这就是本文要

Android NDK开发篇(五):Java与原生代码通信(数据操作)

尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用Java的引用类型则要做对应的处理. 一.对引用数据类型的操作 尽管Java的引用类型的实如今NDK被屏蔽了,JNI还是提供了一组API,通过JNIEnv接口指针提供原生方法改动和使用Java的引用类型. 1.字符串操作 JNI把Java的字符串当作引用来处理,在NDK中使用Java的字符串,须要相