Java逆向基础之导出内存中的类二

我们有时候可能会遇到暂时无法使用javaagent的情况,如服务器上的Web应用重启太耗时,这是我们可以考虑用下面的方法。

使用dumpclass,目前dumpclass在Windows上表现不佳,建议在Linux上使用

dumpclass项目地址

https://github.com/hengyunabc/dumpclass

下载地址

http://central.maven.org/maven2/io/github/hengyunabc/dumpclass/0.0.2/dumpclass-0.0.2.jar

使用dumpclass之前需要配置path

编辑~/.bashrc

sudo gedit ~/.bashrc

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

后加

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:${JAVA_HOME}/lib/tools.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/sa-jdi.jar

使环境变量生效

source ~/.bashrc

使用方法

先用jps查看运行的java进程

[email protected]:~$ jps
4965 Jps
2361 org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar
2605 AppServer

我们需要dump的进程为AppServer,进程id记下来

之后dumpAppServer进程中以Employee结尾的类

java -jar dumpclass-0.0.2.jar 2605 *Employee out --classLoaderPrefix

2605为dump的进程,*Employee表示以Employee结尾的类,out为导出的目录

第一次dump可能会遇到的问题,提示"Can't attach to the process"

cd /etc/sysctl.d

该目录下有一个名为“10-ptrace.conf”的文件,

sudo nano 10-ptrace.conf

以超级用户权限打开该文件,并将里面的一行kernel.yama.ptrace_scope = 1修改为kernel.yama.ptrace_scope = 0

保存并退出,重启系统。

(如果你纳闷为什么要这么改的话,可以好好看下那个文件里面的注释)

原文地址:http://blog.51cto.com/7317859/2106844

时间: 2024-10-12 21:54:07

Java逆向基础之导出内存中的类二的相关文章

Java逆向基础之导出内存中的类一

为什么需要这个,因为在之前的博文中提到,为了增加逆向的难度,部分软件会对部分关键方法和类进行隐藏,所以我们需要把这个类从内存中拿出来. 本文介绍使用javaagent的方法,下一篇介绍dumpclass,两种方法各有利弊. 本文需要用到第三方jar为:javassist-3.20.0-GA.jar,不过我们需要的是它的源码javassist-3.20.0-GA-sources.jar 新建名为DumpClassAgent的项目,项目结构如下 将下载到的源码复制到src目录下 DumpClassA

Java逆向基础之Byteman的扩展Helper类

上一篇文章提到我们可以在规则文件中调用自己写的扩展Helper类 看一个例子 新建目标项目和扩展Helper类项目,结构如下 其中目标项目使用上一篇博客的第二个例子的代码 扩展Helper类项目需要用到第三方jar,在C:\byteman-download-4.0.2\lib找到byteman.jar复制过来 TraceHelper.java代码如下 package com.vvvtimes; import org.jboss.byteman.rule.Rule; import org.jbos

Java逆向基础之动态生成类

为什么有这个东西,一方面时AOP框架的需要,另一方面是增加软件逆向的难度 动态生成类的技术目前大体上分为两类,一类是通过操作字节码框架如cglib/Javassist去实现,另一类就是JNI方式,调用dll/so库,内存中动态还原.这两种方式都能实现隐藏类 看一个Javassist动态生成类的例子 package com.vvvtimes; import java.lang.reflect.Modifier; import javassist.ClassPool; import javassis

Java利用POI导入导出Excel中的数据

     首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地址http://poi.apache.org/download.html,有兴趣的朋友也可以去看看其中的API.      下面分享一下在对POI进行基本操作时觉得需要注意的两点:       1.POI中针对xlsx/xls是需要create different Workbook instance

[java学习笔记]java语言基础概述之内存的划分&堆和栈

1.内存的划分 1.寄存器         cpu处理 2.本地方法区        和所在系统相关 3.方法区 4.栈内存 5.堆内存 2.栈和堆 1.栈:      存储的都是局部变量.而且变量所属的作用域一旦结束,就释放该变量.      栈中的变量生命周期都很短,更新速度会很快. 局部代码块:限定局部变量的生命周期.局部代码块一旦执行结束,里面的变量就会被释放. 2.堆      存储的是数组和对象.凡是new建立的,都会存在堆里.      特点: 每一个实体都有首地址值. 堆内存中的

java复习基础篇—-JVM内存结构(转)

主要内容如下: JVM启动流程 JVM基本结构 内存模型 编译和解释运行的概念 一.JVM启动流程: JVM启动时,是由java命令/javaw命令来启动的. 二.JVM基本结构: JVM基本结构图: <深入理解Java虚拟机(第二版)>中的描述是下面这个样子的: Java中的内存分配: Java程序在运行时,需要在内存中的分配空间.为了提高运算效率,就对数据进行了不同空间的划分,因为每一片区域都有特定的处理数据方式和内存管理方式. 具体划分为如下5个内存空间:(非常重要) 栈:存放局部变量

Java开发基础知识之学习篇——Object类

JDK中所有类的基类——java.lang.Object 1.类构造器 创建java对象的途径之一,通过new关键字调用构造器完成对象的实例化,或通过构造器对象进行相应的初始化.在JDK的objec类源码中,系统会自动添加一个无参构造器. public object(){ Object obj = new Object(); //构造一个Object类的对象 } 2.registerNatives方法 静态代码块是一个类子啊初始化过程中必定会执行的内容,所以在类加载时会执行该方法,通过该方法来注

JavaScript中的类(二)

一些基本概念 在对象上创建新属性时属性上的configurable,writeable,enumerable默认值为true,value默认undefined 用Obejct.defineProperty()创建新属性时,默认为false _year前面的下划线表示只能通过对象方法访问的属性 在不能使用Object.defineProperty的对象方法中,可以使用__defineGetter__和__defineSetter__来实现 Object.getOwnPropertyDescript

Java逆向基础之初识javaagent

首先说一下javaagent是什么 javaagent是一种能够在不影响正常编译的情况下,修改字节码. 在逆向中javaagent可以完成对类的拦截和增强. 看一个例子 在Eclipse新建如下MyAgent结构的项目 MyAgent.java文件内容 package com.vvvtimes.demo.agent; import java.lang.instrument.Instrumentation; public class MyAgent {     public static void