在弹出的对话框中,填写远程被调试的 JVM 的 IP 地址和端口号即可。
远程 JVM 的 启动调试参数也可以从对话框中复制。
添加完成后点击保存即可。点击菜单栏-Debug 你刚才保存的配置名称,
IDEA 就会自动连接到目标 JVM 中。
成功链接,
直接点击这个箭头指向的 “ 红色按钮 ” 停止调试,
对于一个jar包,比如这个lib文件夹下的,直接右击选择箭头指向的,
即可自动反编译,
在之后,这个ons.jar就可以直接打开了,反编译的代码一般没什么问题
假设存在我们存在这个jar包的源代码,也可以直接选择箭头指向,进行加载。
2.3、单个class文件
我们知道jar包就是一堆class文件,按照一定目录结构的一个zip包,
IDEA 支持对于 Jar 包可以自动反编译并添加断点,
但是对于单个 Class 文件,却只会自动反编译,并不允许我们调 试添加断点。
~首先反编译 Class 文件,找到 Class 文件的全限定名,例如 com.unicodesec.MyClass。
~根据全限定名,创建目录,例如创建 com 目录,在 com 目录中创建 unicodesec 目录,
在 unicodesec 目录中放入我们的 Class 文件。
~回到 com 目录中,对 com 目录进行 zip 压缩,并将压缩包的后缀名改成 jar。
随后只需要将 jar 包添加到 IDEA 中,按照上面的 Jar 包调试即可。
三、反调试
3.1、场景
上面着重讲了 IDEA 的调试技巧。对于某些恶意样本而言,
我们无法调试。又或者说, 我们自己写的 Java 恶意样本,
如何不被安全研究人员很轻松的反编译并分析其中的逻辑。
3.2、IDEA调试的原理
先讲一下 IDEA 是怎么通过协议向被调试的 Java 进程下断点的。
IDEA 等 IDE 对于 Java 的调试,主要是通过行号作为下断点的条件。
如果去掉 Class 文件行号这一属性,则 无法使用 IDE 调试。只能通过 Jdb 并通过方法断点来调试。
IDEA 通过 LineNumberTable 属性,向被调试的 Java 进程发送断点指令。
那么我们只需要去掉 Class 文件的 LineNumberTable 属性,
就可以防止该 Class 文件 被调试。像这类辅助调试的信息,被称为 debug symbol。
我们在编译 java 代码的时候,
也可以指定编译器参数 -g 以去掉 class 的 debug symbol。
这样编译后的 Java Class 就无法下断点,自然就无法调试了。即使下了方法断点,
也因为没有机器码与源码行号的对应关系,也无法使用单步调试。