当前位置: 首页 > news >正文

深度分析java 使用 proguard 如何解析混淆后的堆栈

在这里插入图片描述
经过proguard混淆过后,发生异常时堆栈也进行了混淆,那么如果获取的原始的堆栈呢?我们下面来看下

使用proguard 根据mapping文件直接解析

import proguard.obfuscate.MappingReader;
import proguard.retrace.FrameInfo;
import proguard.retrace.FramePattern;
import proguard.retrace.FrameRemapper;
import proguard.retrace.ReTrace;import java.io.File;
import java.io.IOException;public class SymbolAnalysis {public static void main(String[] args) throws IOException {final FramePattern pattern = new FramePattern(ReTrace.REGULAR_EXPRESSION, false);final FrameRemapper frameRemapper = new FrameRemapper();MappingReader mappingReader = new MappingReader(new File("proguard/target/proguard_map.txt"));mappingReader.pump(frameRemapper);String crashStack = "Caused by: java.lang.RuntimeException: test exception\n" +"        at com.example.proguard.b.b.<init>(User.java:25) ~[classes!/:0.0.1]\n" +"        at com.example.proguard.ProguardApplication.run(ProguardApplication.java:22) [classes!/:0.0.1]\n" +"        at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:804) [spring-boot-2.4.2.jar!/:2.4.2]\n" +"        ... 13 common frames omitted\n";final String[] stackList = crashStack.split("\n");for (String stack : stackList) {FrameInfo frameInfo = pattern.parse(stack);if (frameInfo == null) {System.out.println(stack);continue;}for (FrameInfo retracedFrame : frameRemapper.transform(frameInfo)) {String retraceStack = pattern.format(stack, retracedFrame);System.out.println(retraceStack);}}}
}

运行结果如下,可以看到堆栈已经还原为了之前的源代码

在这里插入图片描述

proguard 是如何解析的呢

通过魔改proguard.obfuscate.MappingReader 这个类,我们加入写打印日志,分别是下面带有箭头的地方添加日志输出

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

然后我们修改下解析方法中我们自定义的CustomizeMappingReader,如下:

在这里插入图片描述
通过运行,我们可以得到如下结果:

在这里插入图片描述
通过分析我们可以发现:

  • class : 分为两个部分,混淆之后的类的全限定名及原始类的全限定名
  • field: 分为三部分,分别是混淆之后的类的全限定名、混淆之后的字段名称、以及字段信息
  • method: 分为三部分,分别是混淆之后的类的全限定名、混淆之后的方法名称、以及方法信息

根据这个结构,我们可以猜测到如果是方法解析,首先根据混淆之后的类的全限定名找到原始类的全限定名,然后根据混淆之后的方法名称以及方法信息找到原始的方法

在这里插入图片描述

http://www.lryc.cn/news/510831.html

相关文章:

  • bash 中 ${-#*i} 是什么意思?
  • 什么是Top-p采样与Top-k采样?大模型推理时如何同时设置?解析Transformers库源代码
  • java队列--数据结构
  • 【WebSocket】tomcat内部处理websocket的过程
  • 【踩坑/Linux】Vmware中的Ubuntu虚拟机无法访问互联网
  • overleaf中的includegraphics设置图片缩放,居中显示
  • IPv6的地址类型
  • Elasticsearch:analyzer(分析器)
  • 【工作感悟】
  • 事件(event) SystemVerilog
  • 【MySQL学习笔记】关于索引
  • APIs-day3
  • 7-1求逆序对数目
  • C# 中 Webclient和Httpclient
  • cesium入门学习三
  • swagger,showdoc,apifox,Mock 服务,dubbo,ZooKeeper和dubbo的关系
  • 【自信息、信息熵、联合熵、条件熵、互信息】
  • 免费资源网站
  • C++--------继承
  • Python PyMupdf 去除PDF文档中Watermark标识水印
  • 改进爬山算法之四:概率爬山法(Probabilistic Hill Climbing,PHC)
  • 解读DeepseekV3
  • 【网络安全 | 漏洞挖掘】如何通过竞态条件发现账户接管漏洞
  • 串口通信标准RS232、RS422、RS485有什么区别和不同
  • win版ffmpeg的安装和操作
  • 力扣56. 合并区间
  • 2024基于大模型的智能运维(附实践资料合集)
  • Android Java 版本的 MSAA OpenGL ES 多重采样
  • YOLO11改进-注意力-引入自调制特征聚合模块SMFA
  • VMware虚拟机安装银河麒麟操作系统KylinOS教程(超详细)