多读书多实践,勤思考善领悟

Java逆向基础之十八.JDB动态调试

本文于1987天之前发表,文中内容可能已经过时。

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

本文主要获取两个信息

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

2.打印调用栈

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

JDB无源代码调试调用方法

启动Xdebug调试

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

QQ截图20180425074042.png

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

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

QQ截图20180425074233.png

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

1
stop in com.zelix.lh.a

QQ截图20180425074503.png

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

1
run

QQ截图20180425074536.png

输入next单步执行

1
next

QQ截图20180425074955.png

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

1
clear com.zelix.lh.a

QQ截图20180425075306.png

使用print命令调用a方法

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

QQ截图20180425075514.png

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

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

QQ截图20180425075955.png

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

QQ截图20180425080401.png

QQ截图20180425080436.png

使用quit退出调试

1
quit

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

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


参考资料

https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jdb.html