Java逆向基础之十七.导出内存中的类
本文于2374天之前发表,文中内容可能已经过时。
为什么需要这个,因为在之前的博文中提到,为了增加逆向的难度,部分软件会对部分关键方法和类进行隐藏,所以我们需要把这个类从内存中拿出来。
介绍使用javaagent和dumpclass,两种方法各有利弊。
1. 使用javaagent
本文需要用到第三方jar为:javassist-3.20.0-GA.jar,不过我们需要的是它的源码javassist-3.20.0-GA-sources.jar
新建名为DumpClassAgent的项目,项目结构如下
将下载到的源码复制到src目录下
DumpClassAgent.java文件内容
1 | package com.vvvtimes.demo.agent; |
DumpClassTransformer.java文件内容
1 | package com.vvvtimes.demo.agent; |
MANIFEST.MF文件内容
1 | Manifest-Version: 1.0 |
打包文件成DumpClassAgent.jar
将《Java逆向基础之十四.动态生成类》中的代码导出可运行jar,命名为DynamicGenerateClass.jar
放到同一目录执行命令
1 | java -javaagent:DumpClassAgent.jar -jar DynamicGenerateClass.jar |
E盘会生成对应的class
用jd-gui反编译可以得到源码。
2. 使用dumpclass
我们有时候可能会遇到暂时无法使用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
1 | sudo gedit ~/.bashrc |
在
1 | export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib |
后加
1 | export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:${JAVA_HOME}/lib/tools.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/sa-jdi.jar |
使环境变量生效
1 | source ~/.bashrc |
使用方法
先用jps查看运行的java进程
1 | root@machine:~$ jps |
我们需要dump的进程为AppServer,进程id记下来
之后dumpAppServer进程中以Employee结尾的类
1 | java -jar dumpclass-0.0.2.jar 2605 *Employee out --classLoaderPrefix |
2605为dump的进程,*Employee表示以Employee结尾的类,out为导出的目录
第一次dump可能会遇到的问题,提示”Can’t attach to the process”
1 | cd /etc/sysctl.d |
该目录下有一个名为“10-ptrace.conf”的文件,
1 | sudo nano 10-ptrace.conf |
以超级用户权限打开该文件,并将里面的一行kernel.yama.ptrace_scope = 1修改为kernel.yama.ptrace_scope = 0
保存并退出,重启系统。
(如果你纳闷为什么要这么改的话,可以好好看下那个文件里面的注释)