如何使用具有字节代码的eclipse调试外部jar?

时间:2014-08-29 19:19:07

标签: java eclipse debugging jar malware

我遇到了一个恶意电子邮件的jar,并没有观察到任何回调,并决定深入研究它。首先我尝试使用jd-gui,但我得到的只是下面的这种结构。

Name of Jar.jar
(default package) 
  Main.class 
META_INF
plugins
  Server.class
ID - Used as part of Server.class it appears
MANIFEST.MF 40KB Resource File I believe

Main.class

public class Main extends ClassLoader
{
}

Server.class

package plugins;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Properties;

public abstract class Server
{
 public static Properties config;
 public Socket socket;
 public ObjectOutputStream out;
 public ObjectInputStream in;

 public abstract void onLine();

 public abstract void offLine();

 public abstract String getId();

}

做了一些研究我遇到了一篇文章,详细介绍了如何设置eclipse设置来检查字节码级别的外部jar文件,特别是当它们被混淆时,这似乎就是这样。 http://www.crowdstrike.com/blog/native-java-bytecode-debugging-without-source-code/

使用字节代码Visualizer我能够看到更多的内容,但我仍然无法调试它。

通过字节代码可视化器的Main.class片段

     /* class file format version 50.0 (java 1.6) */

public class Main extends java.lang.ClassLoader {

    /* compiled from y */

    java.io.ByteArrayOutputStream iIiIiiiIii;

    private final java.util.HashMap<java.lang.String, java.lang.Class> iIiiIIIIiI;

    private final java.util.HashMap<java.lang.String, byte[]> ALLATORIxDEMOxASAASDmaDASDriASDASDDASDASDASDADQWDQWlloQWDasdasdasdsd;

    private void IIiIiIIIII(java.util.jar.JarInputStream arg0) throws java.io.IOException {
        /* L100 */
        0 getstatic 1;            /* java.lang.System.out */
        3 ldc_w 284;              /* "\u0018-\u001a+\u001c)\u001e'\u0010/" */
        6 invokestatic 260;       /* java.lang.String Main.ALLATORIxDEMOxASAASDmaDASDriASDASDDASDASDASDADQWDQWlloQWDasdasdasdsd(java.lang.String arg0) */
        9 invokevirtual 2;        /* void println(java.lang.String arg0) */
        /* L653 */
        12 getstatic 1;           /* java.lang.System.out */
        15 ldc_w 284;             /* "\u0018-\u001a+\u001c)\u001e'\u0010/" */
        18 invokestatic 260;      /* java.lang.String Main.ALLATORIxDEMOxASAASDmaDASDriASDASDDASDASDASDADQWDQWlloQWDasdasdasdsd(java.lang.String arg0) */
        21 invokevirtual 2;       /* void println(java.lang.String arg0) */

我最终得到了一个&#34;主要类型&#34;而不是能够调试它。问题。

  

选择不包含主要类型

如果有人有兴趣,我会通过电子邮件向您发送样品。我充其量只是一个Java新手,因此非常感谢任何有关如何正确调试的见解。

2 个答案:

答案 0 :(得分:0)

你可以看一下http://jd.benow.ca/ 它还提供允许调试字节代码的IDE插件

答案 1 :(得分:0)

我可能来不及回答这个问题,但是在昨晚将近 7 年后,我遇到了这个问题。

因此,如果有人遇到这种情况:对 .jar 恶意软件进行加密,并使用安装了字节码可视化工具(插件)的 Eclipse IDE 并遵循(或想要遵循)本指南:https://www.crowdstrike.com/blog/native-java-bytecode-debugging-without-source-code/,没有任何效果(如果你完全按照指南说的去做,并且像我一样拥有 Java 和 0 经验)。

问题是,在 Eclipse 中,当您导入 .jar 时没有定义 main 函数,您将它作为外部库导入,我不知道为什么(是的,甚至选择您的项目文件夹作为源路径)它没有不加载它。解决办法是这样的:

  1. 识别恶意软件的主类:您可以通过阅读 MANIFEST.MF 文件来确定,它会准确显示类的名称。

(在这个例子中,我查看了我的 MANIFEST.MF 文件,看到主类的名称是:maldad.Start)

  1. 创建一个新的调试模板(调试 -> 调试配置 -> 在 Java 应用程序中双击)

  2. 现在配置模板,输入您想要的任何名称,然后在 Main class 框中,设置您从 MANIFEST 中提取的类的名称,在本例中为 maldad.Start,单击 Apply,如果您已经有了您现在可以调试恶意软件的断点 :D

这对于有经验的 Java 开发人员来说可能太简单或太基础了,但是对于对 Java 一无所知的人来说它很有用,而且我在我所做的任何在线搜索中都没有找到这个解决方案。