前言

在分析一个 jar 包时发现他把关键类采用了运行时使用 classloader 的方式加载了。懒得分析算法了,可以使用 jdk 自带的工具 dump 出需要的class.

正文

从运行的java进程里dump出运行中的类的class文件的方法,所知道的有两种

  • 用agent attatch 到进程,然后利用 Instrumentation和 ClassFileTransformer就可以获取 到类的字节码了。

  • 使用 sd-jdi.jar里的工具

本文介绍的就是使用 sd-jdi.jar 来dump. sd-jdi.jar里自带的的 sun.jvm.hotspot.tools.jcore.ClassDump 可以把类的class内容dump到文件里。

ClassDump 里可以设置两个 System properties

  • sun.jvm.hotspot.tools.jcore.filter Filter的类名
  • sun.jvm.hotspot.tools.jcore.outputDir 输出的目录

示例

首先写一个 filter


import sun.jvm.hotspot.tools.jcore.ClassFilter;
import sun.jvm.hotspot.oops.InstanceKlass;
import sun.jvm.hotspot.tools.jcore.ClassDump;
public class MyFilter implements ClassFilter {
@Override
public boolean canInclude(InstanceKlass kls) {
String klassName = kls.getName().asString();
return klassName.startsWith("com/fr/license/selector/");
}
}

代码很显而易见了, 作用是 dump 所有 以 com/fr/license/selector/ 开头的 类的· 字节码。

然后编译成class文件

要使用这个首先需要把 sa-jdi.jar 加到 javaclasspath 里。

进入 刚刚写的 filter 类的class文件的目录下。执行


java -Dsun.jvm.hotspot.tools.jcore.filter=MyFilter -Dsun.jvm.hotspot.tools.jcore.outputDir=d:\dump sun.jvm.hotspot.tools.jcore.ClassDump 5308

MyFilter 改为你自己的类名, 5308 为目标 java进程的 pid(可以使用 jps 查看)。然后就会在 d:\dump 产生相应的 class 文件。

问题解决

  • 如果直接点击应用的 exe, 来启动应用,使用 jps 获取到的 pid, 可能没有办法附加, 所以我们要找到启动的命令, 比如 bat脚本里面。

  • 一般大型应用会自带 jre, 我们要使用上面的技术,替换 jre,为我们的,才能正常dump, 否则会出现版本不匹配。

  • windows下还需把 sawindbg.dll 放到 jre/bin/ 和java.exe 同目录下。否则可能会遇到 加载不了这个 dll 的问题。

最后

搞java应用第一步还是找到启动的命令,便于后面的分析。一般别使用 exe启动应用

使用sa-jdi.jar dump 内存中的class的更多相关文章

  1. 【逆向&渗透实战】Dump内存中的Dex_我是如何脱壳某公司加固过的Apk并利用其API渗透对方数据库

    /作者:Kali_MG1937 QQ:3496925334 CNBLOG博客号:ALDYS4/ 某天午睡,朦朦胧胧梦到给学校提供建站模板的公司有个注射点 梦醒后,我凭借着零散的记忆日进了对面的数据库, ...

  2. IDA在内存中dump出android的Dex文件

    转载自http://drops.wooyun.org/tips/6840 在现在的移动安全环境中,程序加壳已经成为家常便饭了,如果不会脱壳简直没法在破解界混的节奏.ZJDroid作为一种万能脱壳器是非 ...

  3. IDA远程调试 在内存中dump Dex文件

    1. 首先使用调试JNI_OnLoad函数的方法,先将apk以调试状态挂起,使用IDA附加上去. 2. 然后在libdvm.so中的dvmDexFileOpenPartial函数上下一个断点 3. 然 ...

  4. Linux中使用gdb dump内存

    在应急响应中,我们往往会有dump出某一块内存下来进行分析的必要.今天要讲的是利用gdb命令dump出sshd进程的内存. 按照 Linux 系统的设计哲学,内核只提供dump内存的机制,用户想要du ...

  5. IDA动态调试技术及Dump内存

    IDA动态调试技术及Dump内存 来源 https://blog.csdn.net/u010019468/article/details/78491815 最近研究SO文件调试和dump内存时,为了完 ...

  6. EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载

    之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库.老版本的EF主要是通过Ob ...

  7. java动态编译类文件并加载到内存中

    如果你想在动态编译并加载了class后,能够用hibernate的数据访问接口以面向对象的方式来操作该class类,请参考这篇博文-http://www.cnblogs.com/anai/p/4270 ...

  8. 在JVM发生FGC前后dump内存

    原文  http://itindex.net/detail/46666-jvm-fgc-dump 一.需求 有时候web应用经常会发生FGC,我们想知道FGC把那些对象给回收了,思路很简单就是看看FG ...

  9. 使用程序获取整型数据和浮点型数据在内存中的表示---gyy整理

    使用程序获取整型数据和浮点型数据在内存中的表示. C++中整型(int).短整型(short int).单精度浮点数(float).双精度浮点数(double)在内存中所占字节数不同,因此取值范围也不 ...

随机推荐

  1. C语言-apache mod(模块开发)-采用apxs开发实战(centos7.2 linux篇)

    C语言-apache mod(模块开发)-采用apxs开发实战(centos7.2 linux篇) 名词解释:apxs apxs is a tool for building and installi ...

  2. (转)python字符串函数

    原文:https://www.cnblogs.com/emanlee/p/3616755.html https://blog.csdn.net/luoyhang003/article/details/ ...

  3. ViewPage最全解析

    简单说明: ViewPager是android扩展包v4包中的类,直接继承了ViewGroup类,和LinearLayout等布局一样,都是一个容器,需要在里面添加我们想要显示的内容. 一.在xml中 ...

  4. Java之IO(七)ObjectInputStream和ObjectOutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7003536.html 1.前言 本章介绍Java字节流中重要的成员,对象流ObjectInputStream和O ...

  5. 【优化】JSON.stringify()使用优化

    JSON.stringify 有性能的问题,移动端尤其明显.下面我们来看看如何优化. 原始写法: function store(key, val) { localStorage.setItem(key ...

  6. android瓦片地图技术研究

    最近根据公司项目需求,需要制作场馆的室内图并且实现根据rfid信号的自动定位功能,研究了好久找到了一个目前为止还算好用的瓦片地图工具——TileView. github连接:https://githu ...

  7. Python -- 图片处理

    使用PIL库 转换图片格式(jpg  -->  png) from PIL import Image Image.open('E:/art.jpg').save('E:/art.png')

  8. [C语言]声明解析器cdecl修改版

    一.写在前面 K&R曾经在书中承认,"C语言声明的语法有时会带来严重的问题.".由于历史原因(BCPL语言只有唯一一个类型——二进制字),C语言声明的语法在各种合理的组合下 ...

  9. js / jquery 获取和设置 FCK Editor 的值

    开发中遇到 通过 $("#content").val(); 或者 document.getElementById("content"); 并不能获取到 id 为 ...

  10. 微信小程序之特殊效果及功能

    一.下拉刷新效果 假设页面为index文件,那么代码如下: index.json: { "enablePullDownRefresh": true } index.js: //下拉 ...