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

QQ截图20180425074042.png

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

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

QQ截图20180425074233.png

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

stop in com.zelix.lh.a

QQ截图20180425074503.png

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

run

QQ截图20180425074536.png

输入next单步执行

next

QQ截图20180425074955.png

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

clear com.zelix.lh.a

QQ截图20180425075306.png

使用print命令调用a方法

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

QQ截图20180425075514.png

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

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

QQ截图20180425075955.png

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

QQ截图20180425080401.png


QQ截图20180425080436.png

使用quit退出调试

quit

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

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


猜你喜欢

转载自blog.51cto.com/7317859/2107738
今日推荐