首页
社区
课程
招聘
[原创]有jar包无源码情况下使用IDEA远程调试jar包程序的方法
发表于: 2024-7-5 19:25 8323

[原创]有jar包无源码情况下使用IDEA远程调试jar包程序的方法

2024-7-5 19:25
8323

可以接触Java程序的运行环境,可以得到jar包,但是不能得到源码,并且程序很复杂,依赖多,配置杂,不好构建本地调试环境。在这样的场景下,如何进行远程调试?

这是一个普通的java程序,功能是打印"Hello, World!",然后循环计数。

正常启动命令:

图片描述

图片描述

图片描述

参数说明:

图片描述
图片描述
图片描述
图片描述
图片描述

图片描述
图片描述
图片描述
图片描述
执行完上述操作之后,demo.jar被加到依赖库中。
图片描述

图片描述
图片描述
图片描述

图片描述
触发了断点
图片描述
为了展示动态调试能力,这里把i设置为111111并继续运行(在i上右键选择Set Value或者快捷键F2可修改变量的值)。
图片描述
图片描述
发现i已经被动态改变
图片描述

(2024.11.11补充,IDEA 2024.2.4)

在没有符号的情况下,对业务代码函数体内的地方下断点失效。
图片描述

对系统函数的代码下断点是可以的,但系统函数断点往往断的很频繁,离关键位置有点远,不方便。
图片描述

在没有符号的情况下,对业务代码的add函数名称处下断点可以断下来,而对业务代码函数体内的地方下断点则断不下来。
图片描述

1.javac编译时添加-g:none可以去掉调试符号,或者使用加壳混淆工具基本也可以去掉调试符号。

如果只是测试,可以把编译好的demo.class替换掉demo.jar里的对应class,会发现去掉调试符号后大小会变小。

2.没有符号的情况下,不清楚如何直接断在业务代码。有个比较繁琐的方法,感觉可行,但未实践。把想要分析的class拉出来反编译成java代码(无符号的demo.class->demo.java),然后把原jar包的资源当作依赖库,把java代码再重新编译成带符号的class(demo.java->有符号的demo.class),最后把带符号的class扔到jar包里。

java -jar demo.jar
java -jar demo.jar
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 -jar demo.jar

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2024-11-12 00:06 被Jtian编辑 ,原因:
上传的附件:
收藏
免费 4
支持
分享
最新回复 (6)
雪    币: 4146
活跃值: (5835)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没混淆的直接反编译就行了,搞个混淆过的试试,这种调试也不行。
2024-7-5 19:37
0
雪    币: 2064
活跃值: (4172)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
guduzhe 没混淆的直接反编译就行了,搞个混淆过的试试,这种调试也不行。
针对的是没有对抗,但程序比较复杂,不好本地复现的场景。
2024-7-5 19:43
0
雪    币: 2820
活跃值: (264)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
jar已经在服务器运行了,没有办法添加启动参数也可以?如-agentlib:jdwp
2024-7-29 09:31
0
雪    币: 866
活跃值: (4012)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
请问大佬如何调试Charles、BurpSuite那种自带jre运行环境的软件?
2024-10-12 09:54
0
雪    币: 2064
活跃值: (4172)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
appview 请问大佬如何调试Charles、BurpSuite那种自带jre运行环境的软件?

称呼师傅即可,大佬不太合适。 通过测试,用文章中说的jdwp远程调试的方法是可以对burpsuite_pro.jar下断点调试的。 简要说明如下: 我的环境中,用"E:\program\BurpSuite\BurpSuitePro202307\jre\bin\java.exe" -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005  "--add-opens=java.desktop/javax.swing=ALL-UNNAMED" "--add-opens=java.base/java.lang=ALL-UNNAMED" "--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED" "--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED" "--add-opens=java.base/jdk.internal.org.objectweb.asm.Opcodes=ALL-UNNAMED" "-javaagent:E:/program/BurpSuite/BurpSuitePro202307/BurpLoaderKeygen.jar" "-noverify" "-jar" "E:\program\BurpSuite\BurpSuitePro202307\burpsuite_pro.jar" 执行时会报错“Could not find agent library jdwp on the library path, with error: Can't find dependent libraries”,不知道这个是否是你的困惑。其实这个问题无关紧要的,换成自己的java环境就好了。自带的java环境只是方便你使用,不是必须的。 需要注意的是,一般来说要选择好java版本,避免出现兼容性问题。虽然我测试的时候版本是不对应的,不过能跑,能下断点,就没管太多了。


截图里是随便对System.getProperty下的断点,能断下来。本来想下个抓包改包逻辑相关的断点的,这样说明问题会更深刻一些,但不太清楚具体位置,感觉有点麻烦就没折腾了。


2024-10-13 22:40
1
雪    币: 2354
活跃值: (3907)
能力值: ( LV6,RANK:81 )
在线值:
发帖
回帖
粉丝
7
我有一个写字机的排版软件,就是jar程序,之前不懂还写了jar代理打印里边的类跟变量,这个方法方便多了
2024-10-14 10:23
0
游客
登录 | 注册 方可回帖
返回
//