android还原代码混淆proguard日志的工具--retrace和SmartRetrace

本文主要是介绍android还原代码混淆proguard日志的工具--retrace和SmartRetrace,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍

代码混淆时android反编译的常用方法,android SDK提供了Proguard工具,路径是

ANDROID_SDK_HOME/tools/proguard

命令行在ANDROID_SDK_HOME/tools/proguard/bin下,而实际的执行代码路径为ANDROID_SDK_HOME/tools/proguard/lib

 

apk经过混淆后,在闪退时只要有mapping文件,可以通过retrace工具恢复。SDK提供的retrace命令如下:

java -jar retrace.jar [options...] mapping_file [stacktrace_file]

 

例如下面的崩溃堆栈

08-24 00:39:08.406 31542 31542 I QarthLog: [PatchStore] create disable file for com.lucky.bamboo uid is 10185
--------- beginning of crash
08-24 00:39:08.407 31542 31542 E AndroidRuntime: FATAL EXCEPTION: main
08-24 00:39:08.407 31542 31542 E AndroidRuntime: Process: com.lucky.bamboo, PID: 31542
08-24 00:39:08.407 31542 31542 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lucky.bamboo/com.lucky.bamboo.MainActivity}: java.lang.ArithmeticException: divide by zero
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3895)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4074)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:110)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.os.Looper.loop(Looper.java:219)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:8347)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: Caused by: java.lang.ArithmeticException: divide by zero
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at com.lucky.bamboo.c.a.a(SourceFile:2)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at com.lucky.bamboo.c.a.<init>(SourceFile:2)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at com.lucky.bamboo.c.a.a(SourceFile:1)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at com.lucky.bamboo.MainActivity.onCreate(SourceFile:3)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:8085)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:8073)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1320)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3868)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: ... 11 more
08-24 00:39:08.408 1750 2835 W ActivityManager: Process com.lucky.bamboo has crashed too many times: killing!
08-24 00:39:08.408 1750 2835 W ActivityTaskManager: handleAppCrashLocked Force finishing activity com.lucky.bamboo/.MainActivity

mapping文件为“mapping.txt”

方法一、retrace运行命令

retrace.bat mapping.txt error.txt

 

运行得到结果:

 

08-24 00:39:08.406 31542 31542 I QarthLog: [PatchStore] create disable file for com.lucky.bamboo uid is 10185
--------- beginning of crash
08-24 00:39:08.407 31542 31542 E AndroidRuntime: FATAL EXCEPTION: main
08-24 00:39:08.407 31542 31542 E AndroidRuntime: Process: com.lucky.bamboo, PID: 31542
08-24 00:39:08.407 31542 31542 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lucky.bamboo/com.lucky.bamboo.MainActivity}: java.lang.ArithmeticException: divide by zero
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3895)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4074)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:110)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:219)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:8347)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Method.java)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: Caused by: java.lang.ArithmeticException: divide by zero
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at com.lucky.bamboo.db.BambooDatabaseHelper.testMapping(BambooDatabaseHelper.java:26)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at com.lucky.bamboo.db.BambooDatabaseHelper.<init>(BambooDatabaseHelper.java:21)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at com.lucky.bamboo.db.BambooDatabaseHelper.obtain(BambooDatabaseHelper.java:16)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at com.lucky.bamboo.MainActivity.onCreate(MainActivity.java:15)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.Activity.performCreate(Activity.java:8085)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.Activity.performCreate(Activity.java:8073)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1320)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3868)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        ... 11 more
08-24 00:39:08.408  1750  2835 W ActivityManager: Process com.lucky.bamboo has crashed too many times: killing!
08-24 00:39:08.408  1750  2835 W ActivityTaskManager:   handleAppCrashLocked Force finishing activity com.lucky.bamboo/.MainActivity

 

方法二:SmartRetrace UI工具

在实际项目中,经常为了查看某段堆栈的原始代码要把日志放在txt文件,然后再用命令行运行,而且还要找到mapping文件,用起来非常繁琐,命令行很长,而且操作步骤很多。

鉴于retrace本身就是jar包,所以本人想到能不能把retrace的命令做成UI模式,这样子很方便操作。经过两天的努力终于完成了一个勉强可用的UI工具——SmartRetrace

如果在SmartRetrace.jar的同级目录下新建一个目录“mappings”,里面可以存放多个mapping文件,并且可以使用下拉框。

工具下载链接:https://download.csdn.net/download/SweetTool/12741147

 

方法三、android sdk的tools下的proguard工具retraceui,不过感觉不好用,还不如命令行方便。

 

 

相对来说,官方的UI工具没那么好用,主要是选择文件的效率比命令行直接输出跟慢。

这篇关于android还原代码混淆proguard日志的工具--retrace和SmartRetrace的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/761284

相关文章

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN