本文参考: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

Java逆向基础之JDB动态调试_javaJDB

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

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

Java逆向基础之JDB动态调试_调试_02

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

stop in com.zelix.lh.a

Java逆向基础之JDB动态调试_javaJDB_03

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

run

Java逆向基础之JDB动态调试_调试_04

输入next单步执行

next

Java逆向基础之JDB动态调试_调试_05

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

clear com.zelix.lh.a

Java逆向基础之JDB动态调试_调试_06

使用print命令调用a方法

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

Java逆向基础之JDB动态调试_调试_07

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

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

Java逆向基础之JDB动态调试_javaJDB_08

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

Java逆向基础之JDB动态调试_javaJDB_09


Java逆向基础之JDB动态调试_javaJDB_10

使用quit退出调试

quit

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

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