Java逆向基础之JDB动态调试

本文参考:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jdb.html

JDB在有源代码的时候可以实现调试远程机器上的java程序,但是在逆向中源码很难分析出来,不过还是能够调试得到一部分信息的

本文主要获取两个信息

1.动态调用混淆类中的方法,因为实践过程中我们去手动补全相关代码比较难

2.打印调用栈

以下例子以调试ZKM.jar为例

JDB无源代码调试调用方法

启动Xdebug调试

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -jar ZKM.jar

JDB无源代码连接(如果是同一台电脑,需要新开一个cmd)

jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8000

在com.zelix.lh类的a方法设置断点

stop in com.zelix.lh.a

run命令,运行到断点会停下

run

输入next单步执行

next

使用clear命令清除刚才的断点

clear com.zelix.lh.a

使用print命令调用a方法

print com.zelix.lh.a("BZLJ70ifAHJAW",1881109385)

上面演示了静态类方法的调用,动态类也可以

print new java.lang.String("Hello").length()

打印调用栈where(wherei也可以,多打印PC寄存器值)

使用quit退出调试

quit

注意调用方法时,相关的类必须已经加载,方法中打的断点必须清除,否则会抛出异常。

混淆的代码一般都去除了调试信息locals查看本地变量,stop at 行断点这些基本上无法输出有效信息

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

时间: 2024-10-03 23:15:13

Java逆向基础之JDB动态调试的相关文章

Java逆向基础之ODB动态调试

说明: 1在<透视JAVA-反编译修补和逆向工程技术>提到了这个工具,这里简单介绍一些 2ODB(即Omniscient Debugger)最新版本已经迁移到github上 3ODB支持的最高JDK版本是1.6,用来分析新版本的jar包和类会报各种异常,从内心的角度来说还是不太想介绍这个工具的 OmniscientDebugger ODB的使用 下载 github方式 https://github.com/OmniscientDebugger/LewisOmniscientDebugger/r

Java逆向基础之动态生成类

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

[iOS逆向实战 之十]动态调试利器---gdb基础篇

个人原创,转帖请注明来源:cnblogs.com/jailbreaker 一.调试平台搭建 1.GNU Debugger.首先安装ios下的gdb调试器,添加源:cydia.radare.org .搜索 GNU Debugger,安装之.(有些源的GDB好像不能用,这个测试没问题) 2.openSSH.这个应该都会装,没装过的参考,http://www.cnblogs.com/jailbreaker/p/4142609.html 3.adv-cmds.添加源:apt.saurik.com(这个应

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

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

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

Java逆向基础之AspectJ的Around方法修改方法体

在逆向中,我们往往通过修改某个方法达到目的,在javaassist中有insertBefore,insertAfter,setBody,在AspectJ中也可以通过Around实现类似的功能. 看一个简单的例子 java文件Main.java //Main.java package com.vvvtimes; public class Main { public int add(int x, int y) { return x + y; } public int add(int x, int y

Java逆向基础之操作数栈

本文参考:http://www.vuln.cn/7115 本地变量和操作数栈 本地变量数组(Local Variable Array) 本地变量的数组包括方法执行所需要的所有变量,包括 this 的引用,所有方法参数和其他本地定义的变量.对于那些方法(静态方法 static method)参数是以零开始的,对于实例方法,零为 this 保留. 所有的类型都在本地变量数组中占一个槽(entry),而 long 和 double 会占两个连续的槽,因为它们有双倍宽度(64-bit 而不是 32-bi

Java逆向基础之函数

本文参考http://www.vuln.cn/7115 本文提到的函数(function)和方法(method)为同一个意思 例子1,方法名的定义 public class HalfRandom { public static double f() { return Math.random()/2; } } 编译 javac HalfRandom.java 反编译 javap -c -verbose HalfRandom.class ... major version: 52 ... #2 = 

Java逆向基础之条件跳转位运算循环

本文参考:http://www.vuln.cn/7117 条件跳转的例子,绝对值 public class abs {     public static int abs(int a)     {         if (a<0)             return -a;         return a;     } } 编译 javac abs.java 反编译 javap -c -verbose abs.class   public static int abs(int);     d