· 本人亲身体会,被坑的差点锤电脑,不写下来,浑身难受。
· 首先,如何混淆,不用多说,请Surf the Internet !
当代码被混淆后,用户发生了bug,被某些监控机制所监控到,留给程序员的,只有log。被混淆的log一般长这样:
07-23 18:53:37.453 4041 4041 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
07-23 18:53:37.453 4041 4041 E AndroidRuntime: at com.example.franklin.a.d(TestBug.java)
07-23 18:53:37.453 4041 4041 E AndroidRuntime: at com.example.franklin.a.c(TestBug.java)
07-23 18:53:37.453 4041 4041 E AndroidRuntime: at com.example.franklin.a.b(TestBug.java)
07-23 18:53:37.453 4041 4041 E AndroidRuntime: at com.example.franklin.a.a(TestBug.java)
肯定,这种a、b、c什么的,是没法知道代码位置的,需要我们去还原。具体做法:
1. 修改log格式。得改成这样婶儿的:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at com.example.franklin.a.d(TestBug.java)
at com.example.franklin.a.c(TestBug.java)
at com.example.franklin.a.b(TestBug.java)
at com.example.franklin.a.a(TestBug.java)
除了第一行和最后一行,其他行都必须是 at 开头哦,ProguardGui蠢得要死,不然识别不了。
2. 拿到报错版本对应的mapping.txt文件。注意:一定要是对应报错版本的mapping
每个版本编译的时候,只要设置没错,都会生成一个mapping文件,这个玩意就是源代码和混淆代码的映射关系。默认位置:app\build\outputs\mapping\hanjuBbc\release\mapping.txt (在没有被其他程序员改动位置的情况下哦!)
3. 启动工具ProguardGui。该工具JAVA SDK中有集成的。 位置:sdk\android-sdk\tools\proguard\bin(Windows系统哈),双击运行proguardgui.bat文件,会自动启动工具。
4. 使用工具还原。工具我就不截图了 ,凭想象说一下。左边的一列按钮中点击最后一个叫ReTrace的按钮,此时界面中有两个地方空白,依次填入mapping文件路径和改了格式的混淆log,最后点击右下角按钮Retrace。就好啦!
得到还原出的log如下:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at com.example.franklin.TestBug.testFour(TestBug.java)
at com.example.franklin.TestBug.testThree(TestBug.java)
at com.example.franklin.TestBug.testTwo(TestBug.java)
at com.example.franklin.TestBug.testOne(TestBug.java)
看到这里,或许已经有人能解决问题了,但是我相信,仍然有人没有还原出来。本人就是其中之一。
原因: 我司的前任Android开发人员,给代码加了高级混淆。即使用一系列不规范的字符或者中文,将a、b、c、d等进行进一步的混淆,导致编译器无法还原。(坑爹啊)
请在proguard-rules.pro文件中,搜索obfuscationdictionary关键字,该关键字就是添加了一个不规则字符的txt。 在经过商议之后,我司决定将高级混淆去除,这样后续被混淆的log就能轻松还原啦!
网友评论