再谈Burp破解

 广告位置,咨询qq1101364674

离线阅览:


0x01 Java反编译工具Inv看卫星
Inv看卫星
Java反编译提供了在线的反汇编方式,同时也给出几款反编译工具作为参考,罗列如下:Inv看卫星
1. ProcyonInv看卫星
https://bitbucket.org/mstrobel/procyon/wiki/Java%20DecompilerInv看卫星
2. CFRInv看卫星
http://www.benf.org/other/cfr/Inv看卫星
3. JDInv看卫星
http://jd.benow.ca/Inv看卫星
4. FernflowerInv看卫星
https://github.com/fesh0r/fernflowerInv看卫星
5. JAD(非开源)Inv看卫星
http://www.javadecompilers.com/jadInv看卫星
Inv看卫星
0x02 反编译BurpLoaderInv看卫星
Inv看卫星
在Mac为了方便,我直接使用Jd-gui来载入Burploader.jar,但是很显然的能看到已经经过了混淆了。转换成字节码打开,如下:Inv看卫星
Inv看卫星
DefaultInv看卫星
     // Original Bytecode:Inv看卫星
    //Inv看卫星
    // 0: bipush 12Inv看卫星
    // 2: anewarray Ljava/lang/String;Inv看卫星
    // 5: dupInv看卫星
    // 6: iconst_0Inv看卫星
    // 7: ldc “\u0002\u001bW\tY\u0002\”Inv看卫星
    // 9: jsr 216Inv看卫星
    // 12: aastoreInv看卫星
    // 13: dupInv看卫星
    // 14: iconst_1Inv看卫星
    // 15: ldc “2C\fBN\u0016Y\nV\u001c\u0007FER\u000f\b”Inv看卫星
    // 17: jsr 216Inv看卫星
    // 20: aastoreInv看卫星
    // 21: dupInv看卫星
    // 22: iconst_2Inv看卫星
    // 23: ldc “\u0004^\u0017A@5_\u0004C\u001a$^\u0017A”Inv看卫星
    // 25: jsr 216Inv看卫星
    // 28: aastoreInv看卫星
    // 29: dupInv看卫星
    // 30: iconst_3Inv看卫星
    // 31: ldc “*e\f\\\f\u0013X”Inv看卫星
    // 33: jsr 216Inv看卫星
    // 36: aastoreInv看卫星
    // 37: dupInv看卫星
    // 38: iconst_4Inv看卫星
    // 39: ldc “\u000bJ\f_”Inv看卫星
    // 41: jsr 216Inv看卫星
    // 44: aastoreInv看卫星
    // 45: dupInv看卫星
    // 46: iconst_5Inv看卫星
    // 47: ldc “II\u0010C\u001e”Inv看卫星
    // 49: jsr 216Inv看卫星
1Inv看卫星
2Inv看卫星
3Inv看卫星
4Inv看卫星
5Inv看卫星
6Inv看卫星
7Inv看卫星
8Inv看卫星
9Inv看卫星
10Inv看卫星
11Inv看卫星
12Inv看卫星
13Inv看卫星
14Inv看卫星
15Inv看卫星
16Inv看卫星
17Inv看卫星
18Inv看卫星
19Inv看卫星
20Inv看卫星
21Inv看卫星
22Inv看卫星
23Inv看卫星
24Inv看卫星
25Inv看卫星
26Inv看卫星
27Inv看卫星
28Inv看卫星
29Inv看卫星
30Inv看卫星
31Inv看卫星
32Inv看卫星
33Inv看卫星
     // Original Bytecode:Inv看卫星
    //Inv看卫星
    // 0: bipush 12Inv看卫星
    // 2: anewarray Ljava/lang/String;Inv看卫星
    // 5: dupInv看卫星
    // 6: iconst_0Inv看卫星
    // 7: ldc “\u0002\u001bW\tY\u0002\”Inv看卫星
    // 9: jsr 216Inv看卫星
    // 12: aastoreInv看卫星
    // 13: dupInv看卫星
    // 14: iconst_1Inv看卫星
    // 15: ldc “2C\fBN\u0016Y\nV\u001c\u0007FER\u000f\b”Inv看卫星
    // 17: jsr 216Inv看卫星
    // 20: aastoreInv看卫星
    // 21: dupInv看卫星
    // 22: iconst_2Inv看卫星
    // 23: ldc “\u0004^\u0017A@5_\u0004C\u001a$^\u0017A”Inv看卫星
    // 25: jsr 216Inv看卫星
    // 28: aastoreInv看卫星
    // 29: dupInv看卫星
    // 30: iconst_3Inv看卫星
    // 31: ldc “*e\f\\\f\u0013X”Inv看卫星
    // 33: jsr 216Inv看卫星
    // 36: aastoreInv看卫星
    // 37: dupInv看卫星
    // 38: iconst_4Inv看卫星
    // 39: ldc “\u000bJ\f_”Inv看卫星
    // 41: jsr 216Inv看卫星
    // 44: aastoreInv看卫星
    // 45: dupInv看卫星
    // 46: iconst_5Inv看卫星
    // 47: ldc “II\u0010C\u001e”Inv看卫星
    // 49: jsr 216Inv看卫星
根据乌云Drops的资料来看,混淆的算法依旧没变是Zelix KlassMaster(http://www.zelix.com/klassmaster/index.html),这个提问中同时提到了一些其他的 混淆器(http://stackoverflow.com/questions/13098606/decompiler-bytecode-and- obfuscators)。在参考链接Defcon的议题中也提到了这个混淆器的特征。我们这里用DirtyJoe(http://dirty- joe.com/)来帮反混出ZKM加密的字符串信息,使用其的Py脚本(http://dirty-joe.com/help /python_scripting.php)。Inv看卫星
打开DirtyJoe载入Burploader.class(先解压Burploader.jar),然后宣导Method的标签栏,中间有两项没有名字 的函数clinit,往下找可以找到ZKM的加密Key.然后在Constant Pool中找到加密过的常量的值,右键选择Run Python Script,载入ZKM的解密脚本,并修正Py代码中的Key值,则可以解出加密串的内容,如图所示:Inv看卫星
Inv看卫星
依次解出加密串,并尝试还原程序流程。我们来对比一下目前能下载到且没有混淆过的BurpLoader的代码(http://pan.baidu.com/share/link?shareid=442575&uk=2466540631),删减部分常量:Inv看卫星
Inv看卫星
DefaultInv看卫星
package larry.lau;Inv看卫星
Inv看卫星
import burp.StartBurp;Inv看卫星
import java.lang.reflect.Field;Inv看卫星
import java.util.prefs.Preferences;Inv看卫星
import javax.swing.JOptionPane;Inv看卫星
Inv看卫星
public class BurpLoaderInv看卫星
{Inv看卫星
  public static final String readme1 = "------------------------------------------";Inv看卫星
  public static final String readme2 = "     x    ";Inv看卫星
  public static final String readme3 = "     x     ";Inv看卫星
  public static final String readme4 = "     x  ";Inv看卫星
  public static final String readme5 = "    x ";Inv看卫星
  public static final String readme6 = "     x";Inv看卫星
  public static final String readme7 = "   larry_lau@163.com ";Inv看卫星
  public static final String readme0 = "------------------------------------------";Inv看卫星
  private static final String[] strData = {Inv看卫星
    "a", Inv看卫星
    "b", Inv看卫星
    "c", Inv看卫星
    "d", Inv看卫星
    "e", Inv看卫星
    "f", Inv看卫星
    "g", Inv看卫星
    "h" };Inv看卫星
  private static final String[] clzzData = { "burp.ecc", "burp.voc", "burp.jfc", Inv看卫星
    "burp.gtc", "burp.zi", "burp.q4c", "burp.pid", "burp.y0b" };Inv看卫星
  private static final String[] fieldData = { "b", "b", "c", "c", "c", "b", "c", "c" };Inv看卫星
  private static final String tip = "This program can not be used for commercial purposes!";Inv看卫星
  private static final String errortip = "This program can only run with burpsuite_pro_v1.5.01.jar";Inv看卫星
  private static final String[] keys = { "license1", "uG4NTkffOhFN/on7RT1nbw==" };Inv看卫星
  private static final String[] vals = {Inv看卫星
    "like base64 string", Inv看卫星
    "like base64 string" };Inv看卫星
  Inv看卫星
  public static void main(String[] args)Inv看卫星
  {Inv看卫星
    tryInv看卫星
    {Inv看卫星
      int ret = JOptionPane.showOptionDialog(null, "This program can not be used for commercial purposes!", "BurpLoader by larry_lau@163.com", Inv看卫星
        0, 2, null, new String[] { "I Accept", "I Decline" }, null);Inv看卫星
      if (ret == 0)Inv看卫星
      {Inv看卫星
        for (int i = 0; i < clzzData.length; i++)Inv看卫星
        {Inv看卫星
          Class<?> clzz = Class.forName(clzzData[i]);Inv看卫星
          Field field = clzz.getDeclaredField(fieldData[i]);Inv看卫星
          field.setAccessible(true);Inv看卫星
          Inv看卫星
          field.set(null, strData[i]);Inv看卫星
        }Inv看卫星
        Preferences prefs = Preferences.userNodeForPackage(StartBurp.class);Inv看卫星
        for (int i = 0; i < keys.length; i++)Inv看卫星
        {Inv看卫星
          String v = prefs.get(keys[i], null);Inv看卫星
          if (!vals[i].equals(v)) {Inv看卫星
            prefs.put(keys[i], vals[i]);Inv看卫星
          }Inv看卫星
        }Inv看卫星
        StartBurp.main(args);Inv看卫星
      }Inv看卫星
    }Inv看卫星
    catch (Exception e)Inv看卫星
    {Inv看卫星
      JOptionPane.showMessageDialog(null, "This program can only run with burpsuite_pro_v1.5.01.jar", "BurpLoader by larry_lau@163.com", Inv看卫星
        0);Inv看卫星
    }Inv看卫星
  }Inv看卫星
}Inv看卫星
1Inv看卫星
2Inv看卫星
3Inv看卫星
4Inv看卫星
5Inv看卫星
6Inv看卫星
7Inv看卫星
8Inv看卫星
9Inv看卫星
10Inv看卫星
11Inv看卫星
12Inv看卫星
13Inv看卫星
14Inv看卫星
15Inv看卫星
16Inv看卫星
17Inv看卫星
18Inv看卫星
19Inv看卫星
20Inv看卫星
21Inv看卫星
22Inv看卫星
23Inv看卫星
24Inv看卫星
25Inv看卫星
26Inv看卫星
27Inv看卫星
28Inv看卫星
29Inv看卫星
30Inv看卫星
31Inv看卫星
32Inv看卫星
33Inv看卫星
34Inv看卫星
35Inv看卫星
36Inv看卫星
37Inv看卫星
38Inv看卫星
39Inv看卫星
40Inv看卫星
41Inv看卫星
42Inv看卫星
43Inv看卫星
44Inv看卫星
45Inv看卫星
46Inv看卫星
47Inv看卫星
48Inv看卫星
49Inv看卫星
50Inv看卫星
51Inv看卫星
52Inv看卫星
53Inv看卫星
54Inv看卫星
55Inv看卫星
56Inv看卫星
57Inv看卫星
58Inv看卫星
59Inv看卫星
60Inv看卫星
61Inv看卫星
62Inv看卫星
63Inv看卫星
64Inv看卫星
65Inv看卫星
66Inv看卫星
67Inv看卫星
68Inv看卫星
69Inv看卫星
70Inv看卫星
package larry.lau;Inv看卫星
 Inv看卫星
import burp.StartBurp;Inv看卫星
import java.lang.reflect.Field;Inv看卫星
import java.util.prefs.Preferences;Inv看卫星
import javax.swing.JOptionPane;Inv看卫星
 Inv看卫星
public class BurpLoaderInv看卫星
{Inv看卫星
  public static final String readme1 = "------------------------------------------";Inv看卫星
  public static final String readme2 = "     x    ";Inv看卫星
  public static final String readme3 = "     x     ";Inv看卫星
  public static final String readme4 = "     x  ";Inv看卫星
  public static final String readme5 = "    x ";Inv看卫星
  public static final String readme6 = "     x";Inv看卫星
  public static final String readme7 = "   larry_lau@163.com ";Inv看卫星
  public static final String readme0 = "------------------------------------------";Inv看卫星
  private static final String[] strData = {Inv看卫星
    "a", Inv看卫星
    "b", Inv看卫星
    "c", Inv看卫星
    "d", Inv看卫星
    "e", Inv看卫星
    "f", Inv看卫星
    "g", Inv看卫星
    "h" };Inv看卫星
  private static final String[] clzzData = { "burp.ecc", "burp.voc", "burp.jfc", Inv看卫星
    "burp.gtc", "burp.zi", "burp.q4c", "burp.pid", "burp.y0b" };Inv看卫星
  private static final String[] fieldData = { "b", "b", "c", "c", "c", "b", "c", "c" };Inv看卫星
  private static final String tip = "This program can not be used for commercial purposes!";Inv看卫星
  private static final String errortip = "This program can only run with burpsuite_pro_v1.5.01.jar";Inv看卫星
  private static final String[] keys = { "license1", "uG4NTkffOhFN/on7RT1nbw==" };Inv看卫星
  private static final String[] vals = {Inv看卫星
    "like base64 string", Inv看卫星
    "like base64 string" };Inv看卫星
  Inv看卫星
  public static void main(String[] args)Inv看卫星
  {Inv看卫星
    tryInv看卫星
    {Inv看卫星
      int ret = JOptionPane.showOptionDialog(null, "This program can not be used for commercial purposes!", "BurpLoader by larry_lau@163.com", Inv看卫星
        0, 2, null, new String[] { "I Accept", "I Decline" }, null);Inv看卫星
      if (ret == 0)Inv看卫星
      {Inv看卫星
        for (int i = 0; i < clzzData.length; i++)Inv看卫星
        {Inv看卫星
          Class<?> clzz = Class.forName(clzzData[i]);Inv看卫星
          Field field = clzz.getDeclaredField(fieldData[i]);Inv看卫星
          field.setAccessible(true);Inv看卫星
          Inv看卫星
          field.set(null, strData[i]);Inv看卫星
        }Inv看卫星
        Preferences prefs = Preferences.userNodeForPackage(StartBurp.class);Inv看卫星
        for (int i = 0; i < keys.length; i++)Inv看卫星
        {Inv看卫星
          String v = prefs.get(keys[i], null);Inv看卫星
          if (!vals[i].equals(v)) {Inv看卫星
            prefs.put(keys[i], vals[i]);Inv看卫星
          }Inv看卫星
        }Inv看卫星
        StartBurp.main(args);Inv看卫星
      }Inv看卫星
    }Inv看卫星
    catch (Exception e)Inv看卫星
    {Inv看卫星
      JOptionPane.showMessageDialog(null, "This program can only run with burpsuite_pro_v1.5.01.jar", "BurpLoader by larry_lau@163.com", Inv看卫星
        0);Inv看卫星
    }Inv看卫星
  }Inv看卫星
}Inv看卫星
再来对比我们混淆过的,且解出了字符串的版本(这里是1.6.37的Burp)。Inv看卫星
Inv看卫星
0x03 BurpLoader源码分析Inv看卫星
Inv看卫星
经过对比,整理出差不多的反汇编后的代码:Inv看卫星
Inv看卫星
DefaultInv看卫星
// Inv看卫星
// Decompiled by Procyon v0.5.30Inv看卫星
// Inv看卫星
Inv看卫星
package larry.lau;Inv看卫星
Inv看卫星
import java.lang.reflect.Field;Inv看卫星
import java.io.InputStream;Inv看卫星
import java.security.CodeSource;Inv看卫星
import java.awt.HeadlessException;Inv看卫星
import java.awt.GraphicsEnvironment;Inv看卫星
import java.util.prefs.Preferences;Inv看卫星
import java.awt.Component;Inv看卫星
import javax.swing.JOptionPane;Inv看卫星
import java.security.MessageDigest;Inv看卫星
import javax.swing.UIManager;Inv看卫星
Inv看卫星
public class BurpLoaderInv看卫星
{Inv看卫星
    public static final String readme0 = "Burp Suite is an integrated platform for performing security testing of web applications. ";Inv看卫星
    public static final String readme1 = "If you like it, please try Free edition or <b>buy</b> Pro edition.";Inv看卫星
    public static final String readme2 = "This loader is Free and CAN NOT be used for Commercial purposes!";Inv看卫星
    public static final String readme3 = "If you bought it somewhere else, you should take action against the seller.";Inv看卫星
    public static final String readme4 = "No exploiting and no malware in my code. Shaby is boring!";Inv看卫星
    public static final String readme5 = "Usage:";Inv看卫星
    public static final String readme6 = "1. you need a burpsuite_pro jar file.";Inv看卫星
    public static final String readme7 = "2. add burpsuite_pro jar into classpath then run burploader";Inv看卫星
    public static final String readme8 = "<ul><li>java -jar BurpLoader.jar</li>";Inv看卫星
    public static final String readme9 = "<li>java -cp BurpLoader.jar;burpsuite_pro.jar larry.lau.BurpLoader</li>";Inv看卫星
    public static final String readme10 = "<li>java -cp BurpLoader.jar:burpsuite_pro.jar larry.lau.BurpLoader</li></ul>";Inv看卫星
    public static final String readme11 = "3. To Support headless mode, add -Djava.awt.headless=true into jvm arguments.";Inv看卫星
    public static final String readme12 = "4. Any suggestions, let me know.";Inv看卫星
    private static final String[] a; //stringdata 对应解密出密文的那一大堆Inv看卫星
    private static final String[] b = {"llc" , "frb" , "dfd" ,"zud" ,"bdf", "uxh", "a7b" , "u6b" }; //classname数组Inv看卫星
    private static final String[] c = {}; //fileddata数组Inv看卫星
    private static final String[] d = {"license1", "uG4NTkffOhFN/on7RT1nbw=="}; // keys数组Inv看卫星
    private static final String[] e = {"pQwzPmoS+nV4oph/ti7SdybjoUB9IWHt0BGBVS1kycSvYAn2zh0uJq9gCfbOHS4mrpBSDMCrw+Aw6t2wCDaKXMJoXejEZIvQifD7ev/ieLttU9OZmtQxiQvOezD/tIy96RrqBxRJQqO1M+cHUq0emgxViBsoFVklsQmr6ayz0rTcwz9sXYvE9N4LvQ7thuRKMaO49TJR+9sjImBql1kBGTOHsJCETT5Mh62lIzXUYnpKhnWi1IjmSYXhhQnHSrTJtPMnN4lc0W36TPXlqWE7KmcGSWrjNiEWMVJ8ez1jIk2J5kSD3dV3gokc2tAm3MeslXO39AhD3RCbXV4SzJNb9A==","CONSTANT_String : 6Oxo0eZXXJNgBSjf5x9U7CXRqLnEIQaqNhLHKcSKbabe//W7jgdzbDMQor2PE44WeyvBtJFh848jEZys6bvlyLN70lJi5wqkoXe+BtrTnpS3Y9+9ygkcaUleLj7/UPie18gUNblikWyctTG/IKCPKGPZSe4JuPclh3HH9FAcd4shrJmrcAhJYCTYOFO3bqxs0kIhcZKUBUJ/DG//UIFceegfGVijiBeM9K4xbR+HfxTIg49Pqa1JTNcoWqjeq1xewqd8Ovqt+J9Zrsn7XC1zy8XyK6U65vHBA6HY/h/2Li7sxatMzfGX8m8L3hiAx7eOKBBtFJj/8VnuVggQZodIPna6xhrBBIcA1YLrQ3EXxXDLlO5yVM/S+B7oFgYMgMd4"}; // values数组Inv看卫星
    public static boolean f;Inv看卫星
    public static boolean g;Inv看卫星
    private static final String[] z = { "d0287d85d288c2af116e0d60878a8a24" , "This program can only run with burpsuite_pro_v1.6.37.jar", "burp.StartBurp",  "LNimbus" , "main", "/burp", "md5", "BurpLoader by larry_lau", "larry.lau.javax.swing.plaf.nimbus.NimbusLookAndFeel",Inv看卫星
    "burpsuite_pro_v1.6.37.jar was corrupted!" , "burp." , "%02x"};Inv看卫星
    Inv看卫星
    static {} //errorInv看卫星
    Inv看卫星
    public static void main(final String[] array) {Inv看卫星
        final boolean g = BurpLoader.g;Inv看卫星
        try {Inv看卫星
            try {Inv看卫星
                final String s = BurpLoader.z[8];Inv看卫星
                Class.forName(s); //实例化一个字符串为名称的类 http://blog.csdn.net/kaiwii/article/details/7405761Inv看卫星
                UIManager.installLookAndFeel(BurpLoader.z[3], s); //Swing用来设置外观与风格的相关函数Inv看卫星
            }Inv看卫星
            catch (ClassNotFoundException ex8) {}Inv看卫星
            final Class<?> forName = Class.forName(BurpLoader.z[2]); //找不到那个外观类就实例化 burp.StartBurp 既BurpSuite的启动类Inv看卫星
            Inv看卫星
            //用md5验证了啥东西Inv看卫星
            try {Inv看卫星
                MessageDigest messageDigest = null;Inv看卫星
            Label_0086_Outer:Inv看卫星
                while (true) {Inv看卫星
                    final CodeSource codeSource = forName.getProtectionDomain().getCodeSource(); //取CodeSource,一般配合getLocation使用取Jar包中的路径Inv看卫星
                    final MessageDigest instance = MessageDigest.getInstance(BurpLoader.z[6]); //动态获取加密算法,这里是md5Inv看卫星
                    final InputStream openStream = codeSource.getLocation().openStream(); //OpenStream()打开流以读取当前生成提供程序对象的虚拟路径。Inv看卫星
                    final byte[] array2 = new byte[1024];Inv看卫星
                    int read = 0;Inv看卫星
                    while (true) {Inv看卫星
                        while (true) {Inv看卫星
                            Label_0094: {Inv看卫星
                                try {Inv看卫星
                                    if (!g) {Inv看卫星
                                        break Label_0094;Inv看卫星
                                    }Inv看卫星
                                }Inv看卫星
                                catch (ClassNotFoundException ex) {Inv看卫星
                                    throw ex;Inv看卫星
                                }Inv看卫星
                                messageDigest.update(array2, 0, read); //// // array2是输入字符串转换得到的字节数组Inv看卫星
                            }Inv看卫星
                            if ((read = openStream.read(array2)) > 0) {Inv看卫星
                                continue Label_0086_Outer;Inv看卫星
                            }Inv看卫星
                            break;Inv看卫星
                        }Inv看卫星
                        openStream.close();Inv看卫星
                        messageDigest = instance;Inv看卫星
                        if (!g) {Inv看卫星
                            break;Inv看卫星
                        }Inv看卫星
                        continue;Inv看卫星
                    }Inv看卫星
                }Inv看卫星
                StringBuffer sb = null;Inv看卫星
            Label_0178_Outer:Inv看卫星
                while (true) {Inv看卫星
                    final byte[] digest = messageDigest.digest(); //生成md5Inv看卫星
                    sb = new StringBuffer();Inv看卫星
                    int n = 0;Inv看卫星
                    while (true) {Inv看卫星
                        while (true) {Inv看卫星
                            Label_0181: {Inv看卫星
                                try {Inv看卫星
                                    if (!g) {Inv看卫星
                                        break Label_0181;Inv看卫星
                                    }Inv看卫星
                                    //sb.append(String.format(BurpLoader.z[11], digest[n] & 0xFF)); 优化Inv看卫星
                                    sb.append(String.format("%02x", digest[n] & 0xFF)) //准备输出md5?Inv看卫星
                                }Inv看卫星
                                catch (ClassNotFoundException ex2) {Inv看卫星
                                    throw ex2;Inv看卫星
                                }Inv看卫星
                                ++n;Inv看卫星
                            }Inv看卫星
                            if (n < digest.length) {Inv看卫星
                                continue Label_0178_Outer;Inv看卫星
                            }Inv看卫星
                            break;Inv看卫星
                        }Inv看卫星
                        if (!g) {Inv看卫星
                            break;Inv看卫星
                        }Inv看卫星
                        continue;Inv看卫星
                    }Inv看卫星
                }Inv看卫星
                int equals = 0;Inv看卫星
                /*Inv看卫星
                用于确认版本Inv看卫星
                ~>>> md5 burpsuite_pro_v1.6.37.jarInv看卫星
                MD5 (burpsuite_pro_v1.6.37.jar) = d0287d85d288c2af116e0d60878a8a24Inv看卫星
                */Inv看卫星
                Label_0245: {Inv看卫星
                    Label_0219: {Inv看卫星
                        int n2;Inv看卫星
                        try {Inv看卫星
                            n2 = (equals = (BurpLoader.z[0].equals(sb.toString()) ? 1 : 0)); // 比较md5的值Inv看卫星
                            if (g) {Inv看卫星
                                break Label_0245;Inv看卫星
                            }Inv看卫星
                            if (n2 == 0) {Inv看卫星
                                break Label_0219;Inv看卫星
                            }Inv看卫星
                            break Label_0219;Inv看卫星
                        }Inv看卫星
                        catch (ClassNotFoundException ex3) {Inv看卫星
                            throw ex3;Inv看卫星
                        }Inv看卫星
                        try {Inv看卫星
                            if (n2 == 0) {Inv看卫星
                                JOptionPane.showMessageDialog(null, BurpLoader.z[9], BurpLoader.z[7], 0); //弹出提示版本不符或者被修改Inv看卫星
                                System.exit(-1);Inv看卫星
                            }Inv看卫星
                        }Inv看卫星
                        catch (ClassNotFoundException ex4) {Inv看卫星
                            throw ex4;Inv看卫星
                        }Inv看卫星
                    }Inv看卫星
                    equals = 0;Inv看卫星
                }Inv看卫星
                /*Inv看卫星
                利用反射机制修改BurpSuite类相关信息,对于未混淆版本的Burploader和解密出的字符串可以重构前面的定义Inv看卫星
                */Inv看卫星
                int n3 = equals; //0Inv看卫星
                while (true) {Inv看卫星
                    Label_0316: {Inv看卫星
                        if (!g) {Inv看卫星
                            break Label_0316;Inv看卫星
                        }Inv看卫星
                        //final Field declaredField = Class.forName(BurpLoader.z[10] + BurpLoader.b[n3]).getDeclaredField(BurpLoader.c[n3]); 优化Inv看卫星
                        //通过反射机制获取类相关的属性或去修改它 http://my.oschina.net/swords/blog/117357Inv看卫星
                        //从 burp.xxx 的类中取变量,可以用jd-gui反编译去看,取对应类中的第一个Strinig变量Inv看卫星
                        final Field declaredField = Class.forName("burp.b_classarray").getDeclaredField(BurpLoader.c[n3]);Inv看卫星
                        declaredField.setAccessible(true);Inv看卫星
                        declaredField.set(null, BurpLoader.a[n3]); //插入stringdataInv看卫星
                        ++n3;Inv看卫星
                    }Inv看卫星
                    if (n3 < BurpLoader.b.length) {Inv看卫星
                        continue;Inv看卫星
                    }Inv看卫星
                    break;Inv看卫星
                }Inv看卫星
                Preferences preferences = null;Inv看卫星
            Label_0352_Outer:Inv看卫星
                while (true) {Inv看卫星
                    //保存用户偏好,Windows是注册表,Linux是Home目录下的文件Inv看卫星
                    final Preferences node = Preferences.userRoot().node(BurpLoader.z[5]); //node("/burp")Inv看卫星
                    int n4 = 0;Inv看卫星
                    while (true) {Inv看卫星
                        while (true) {Inv看卫星
                            Label_0398: {Inv看卫星
                                try {Inv看卫星
                                    if (!g) {Inv看卫星
                                        break Label_0398;Inv看卫星
                                    }Inv看卫星
                                }Inv看卫星
                                catch (ClassNotFoundException ex5) {Inv看卫星
                                    throw ex5;Inv看卫星
                                }Inv看卫星
                                //比较一些偏好设定,这里其实是key和values的比较Inv看卫星
                                /*Inv看卫星
                                String v = prefs.get(keys[i], null);Inv看卫星
                                if (!vals[i].equals(v)) {Inv看卫星
                                    prefs.put(keys[i], vals[i]);Inv看卫星
                                }Inv看卫星
                                */Inv看卫星
                                if (!BurpLoader.e[n4].equals(preferences.get(BurpLoader.d[n4], null))) {Inv看卫星
                                    node.put(BurpLoader.d[n4], BurpLoader.e[n4]);Inv看卫星
                                }Inv看卫星
                                ++n4;Inv看卫星
                            }Inv看卫星
                            if (n4 < BurpLoader.d.length) {Inv看卫星
                                continue Label_0352_Outer;Inv看卫星
                            }Inv看卫星
                            break;Inv看卫星
                        }Inv看卫星
                        preferences = node;Inv看卫星
                        if (!g) {Inv看卫星
                            break;Inv看卫星
                        }Inv看卫星
                        continue;Inv看卫星
                    }Inv看卫星
                }Inv看卫星
                preferences.flush();Inv看卫星
                //反射调用 StartBurp.main(args); Inv看卫星
                forName.getDeclaredMethod(BurpLoader.z[4], String[].class).invoke(null, array); // z4 = mainInv看卫星
            }Inv看卫星
            catch (Throwable t) {Inv看卫星
                t.printStackTrace();Inv看卫星
                int headless = GraphicsEnvironment.isHeadless() ? 1 : 0; //测试当前是否为图形环境Inv看卫星
                Label_0504: {Inv看卫星
                    int n5 = 0;Inv看卫星
                    Label_0503: {Inv看卫星
                        try {Inv看卫星
                            n5 = headless;Inv看卫星
                            if (g) {Inv看卫星
                                break Label_0504;Inv看卫星
                            }Inv看卫星
                            if (n5 != 0) {Inv看卫星
                                break Label_0503;Inv看卫星
                            }Inv看卫星
                        }Inv看卫星
                        catch (ClassNotFoundException ex6) {Inv看卫星
                            throw ex6;Inv看卫星
                        }Inv看卫星
                        try {Inv看卫星
                            GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); //取默认图形环境Inv看卫星
                        }Inv看卫星
                        catch (HeadlessException ex9) {Inv看卫星
                            headless = 1;Inv看卫星
                        }Inv看卫星
                        catch (InternalError internalError) {Inv看卫星
                            headless = 1;Inv看卫星
                        }Inv看卫星
                    }Inv看卫星
                    try {Inv看卫星
                        if (n5 != 0) {Inv看卫星
                            System.err.println(BurpLoader.z[1]);Inv看卫星
                            if (!g) {Inv看卫星
                                return;Inv看卫星
                            }Inv看卫星
                        }Inv看卫星
                    }Inv看卫星
                    catch (ClassNotFoundException ex7) {Inv看卫星
                        throw ex7;Inv看卫星
                    }Inv看卫星
                }Inv看卫星
                //JOptionPane.showMessageDialog(null, BurpLoader.z[1], BurpLoader.z[7], 0); 弹出提示框Inv看卫星
                JOptionPane.showMessageDialog(null, "This program can only run with burpsuite_pro_v1.6.37.jar", "Powered by XXX", 0);Inv看卫星
                Inv看卫星
            }Inv看卫星
        }Inv看卫星
        catch (ClassNotFoundException ex10) {Inv看卫星
            System.exit(-1);Inv看卫星
        }Inv看卫星
    }Inv看卫星
}Inv看卫星
1Inv看卫星
2Inv看卫星
3Inv看卫星
4Inv看卫星
5Inv看卫星
6Inv看卫星
7Inv看卫星
8Inv看卫星
9Inv看卫星
10Inv看卫星
11Inv看卫星
12Inv看卫星
13Inv看卫星
14Inv看卫星
15Inv看卫星
16Inv看卫星
17Inv看卫星
18Inv看卫星
19Inv看卫星
20Inv看卫星
21Inv看卫星
22Inv看卫星
23Inv看卫星
24Inv看卫星
25Inv看卫星
26Inv看卫星
27Inv看卫星
28Inv看卫星
29Inv看卫星
30Inv看卫星
31Inv看卫星
32Inv看卫星
33Inv看卫星
34Inv看卫星
35Inv看卫星
36Inv看卫星
37Inv看卫星
38Inv看卫星
39Inv看卫星
40Inv看卫星
41Inv看卫星
42Inv看卫星
43Inv看卫星
44Inv看卫星
45Inv看卫星
46Inv看卫星
47Inv看卫星
48Inv看卫星
49Inv看卫星
50Inv看卫星
51Inv看卫星
52Inv看卫星
53Inv看卫星
54Inv看卫星
55Inv看卫星
56Inv看卫星
57Inv看卫星
58Inv看卫星
59Inv看卫星
60Inv看卫星
61Inv看卫星
62Inv看卫星
63Inv看卫星
64Inv看卫星
65Inv看卫星
66Inv看卫星
67Inv看卫星
68Inv看卫星
69Inv看卫星
70Inv看卫星
71Inv看卫星
72Inv看卫星
73Inv看卫星
74Inv看卫星
75Inv看卫星
76Inv看卫星
77Inv看卫星
78Inv看卫星
79Inv看卫星
80Inv看卫星
81Inv看卫星
82Inv看卫星
83Inv看卫星
84Inv看卫星
85Inv看卫星
86Inv看卫星
87Inv看卫星
88Inv看卫星
89Inv看卫星
90Inv看卫星
91Inv看卫星
92Inv看卫星
93Inv看卫星
94Inv看卫星
95Inv看卫星
96Inv看卫星
97Inv看卫星
98Inv看卫星
99Inv看卫星
100Inv看卫星
101Inv看卫星
102Inv看卫星
103Inv看卫星
104Inv看卫星
105Inv看卫星
106Inv看卫星
107Inv看卫星
108Inv看卫星
109Inv看卫星
110Inv看卫星
111Inv看卫星
112Inv看卫星
113Inv看卫星
114Inv看卫星
115Inv看卫星
116Inv看卫星
117Inv看卫星
118Inv看卫星
119Inv看卫星
120Inv看卫星
121Inv看卫星
122Inv看卫星
123Inv看卫星
124Inv看卫星
125Inv看卫星
126Inv看卫星
127Inv看卫星
128Inv看卫星
129Inv看卫星
130Inv看卫星
131Inv看卫星
132Inv看卫星
133Inv看卫星
134Inv看卫星
135Inv看卫星
136Inv看卫星
137Inv看卫星
138Inv看卫星
139Inv看卫星
140Inv看卫星
141Inv看卫星
142Inv看卫星
143Inv看卫星
144Inv看卫星
145Inv看卫星
146Inv看卫星
147Inv看卫星
148Inv看卫星
149Inv看卫星
150Inv看卫星
151Inv看卫星
152Inv看卫星
153Inv看卫星
154Inv看卫星
155Inv看卫星
156Inv看卫星
157Inv看卫星
158Inv看卫星
159Inv看卫星
160Inv看卫星
161Inv看卫星
162Inv看卫星
163Inv看卫星
164Inv看卫星
165Inv看卫星
166Inv看卫星
167Inv看卫星
168Inv看卫星
169Inv看卫星
170Inv看卫星
171Inv看卫星
172Inv看卫星
173Inv看卫星
174Inv看卫星
175Inv看卫星
176Inv看卫星
177Inv看卫星
178Inv看卫星
179Inv看卫星
180Inv看卫星
181Inv看卫星
182Inv看卫星
183Inv看卫星
184Inv看卫星
185Inv看卫星
186Inv看卫星
187Inv看卫星
188Inv看卫星
189Inv看卫星
190Inv看卫星
191Inv看卫星
192Inv看卫星
193Inv看卫星
194Inv看卫星
195Inv看卫星
196Inv看卫星
197Inv看卫星
198Inv看卫星
199Inv看卫星
200Inv看卫星
201Inv看卫星
202Inv看卫星
203Inv看卫星
204Inv看卫星
205Inv看卫星
206Inv看卫星
207Inv看卫星
208Inv看卫星
209Inv看卫星
210Inv看卫星
211Inv看卫星
212Inv看卫星
213Inv看卫星
214Inv看卫星
215Inv看卫星
216Inv看卫星
217Inv看卫星
218Inv看卫星
219Inv看卫星
220Inv看卫星
221Inv看卫星
222Inv看卫星
223Inv看卫星
224Inv看卫星
225Inv看卫星
226Inv看卫星
227Inv看卫星
228Inv看卫星
229Inv看卫星
230Inv看卫星
231Inv看卫星
232Inv看卫星
233Inv看卫星
234Inv看卫星
235Inv看卫星
236Inv看卫星
237Inv看卫星
238Inv看卫星
239Inv看卫星
240Inv看卫星
241Inv看卫星
242Inv看卫星
243Inv看卫星
244Inv看卫星
245Inv看卫星
246Inv看卫星
247Inv看卫星
248Inv看卫星
249Inv看卫星
250Inv看卫星
251Inv看卫星
252Inv看卫星
253Inv看卫星
254Inv看卫星
255Inv看卫星
256Inv看卫星
257Inv看卫星
258Inv看卫星
259Inv看卫星
260Inv看卫星
261Inv看卫星
262Inv看卫星
263Inv看卫星
264Inv看卫星
265Inv看卫星
266Inv看卫星
267Inv看卫星
268Inv看卫星
269Inv看卫星
270Inv看卫星
271Inv看卫星
272Inv看卫星
273Inv看卫星
274Inv看卫星
// Inv看卫星
// Decompiled by Procyon v0.5.30Inv看卫星
// Inv看卫星
 Inv看卫星
package larry.lau;Inv看卫星
 Inv看卫星
import java.lang.reflect.Field;Inv看卫星
import java.io.InputStream;Inv看卫星
import java.security.CodeSource;Inv看卫星
import java.awt.HeadlessException;Inv看卫星
import java.awt.GraphicsEnvironment;Inv看卫星
import java.util.prefs.Preferences;Inv看卫星
import java.awt.Component;Inv看卫星
import javax.swing.JOptionPane;Inv看卫星
import java.security.MessageDigest;Inv看卫星
import javax.swing.UIManager;Inv看卫星
 Inv看卫星
public class BurpLoaderInv看卫星
{Inv看卫星
    public static final String readme0 = "Burp Suite is an integrated platform for performing security testing of web applications. ";Inv看卫星
    public static final String readme1 = "If you like it, please try Free edition or <b>buy</b> Pro edition.";Inv看卫星
    public static final String readme2 = "This loader is Free and CAN NOT be used for Commercial purposes!";Inv看卫星
    public static final String readme3 = "If you bought it somewhere else, you should take action against the seller.";Inv看卫星
    public static final String readme4 = "No exploiting and no malware in my code. Shaby is boring!";Inv看卫星
    public static final String readme5 = "Usage:";Inv看卫星
    public static final String readme6 = "1. you need a burpsuite_pro jar file.";Inv看卫星
    public static final String readme7 = "2. add burpsuite_pro jar into classpath then run burploader";Inv看卫星
    public static final String readme8 = "<ul><li>java -jar BurpLoader.jar</li>";Inv看卫星
    public static final String readme9 = "<li>java -cp BurpLoader.jar;burpsuite_pro.jar larry.lau.BurpLoader</li>";Inv看卫星
    public static final String readme10 = "<li>java -cp BurpLoader.jar:burpsuite_pro.jar larry.lau.BurpLoader</li></ul>";Inv看卫星
    public static final String readme11 = "3. To Support headless mode, add -Djava.awt.headless=true into jvm arguments.";Inv看卫星
    public static final String readme12 = "4. Any suggestions, let me know.";Inv看卫星
    private static final String[] a; //stringdata 对应解密出密文的那一大堆Inv看卫星
    private static final String[] b = {"llc" , "frb" , "dfd" ,"zud" ,"bdf", "uxh", "a7b" , "u6b" }; //classname数组Inv看卫星
    private static final String[] c = {}; //fileddata数组Inv看卫星
    private static final String[] d = {"license1", "uG4NTkffOhFN/on7RT1nbw=="}; // keys数组Inv看卫星
    private static final String[] e = {"pQwzPmoS+nV4oph/ti7SdybjoUB9IWHt0BGBVS1kycSvYAn2zh0uJq9gCfbOHS4mrpBSDMCrw+Aw6t2wCDaKXMJoXejEZIvQifD7ev/ieLttU9OZmtQxiQvOezD/tIy96RrqBxRJQqO1M+cHUq0emgxViBsoFVklsQmr6ayz0rTcwz9sXYvE9N4LvQ7thuRKMaO49TJR+9sjImBql1kBGTOHsJCETT5Mh62lIzXUYnpKhnWi1IjmSYXhhQnHSrTJtPMnN4lc0W36TPXlqWE7KmcGSWrjNiEWMVJ8ez1jIk2J5kSD3dV3gokc2tAm3MeslXO39AhD3RCbXV4SzJNb9A==","CONSTANT_String : 6Oxo0eZXXJNgBSjf5x9U7CXRqLnEIQaqNhLHKcSKbabe//W7jgdzbDMQor2PE44WeyvBtJFh848jEZys6bvlyLN70lJi5wqkoXe+BtrTnpS3Y9+9ygkcaUleLj7/UPie18gUNblikWyctTG/IKCPKGPZSe4JuPclh3HH9FAcd4shrJmrcAhJYCTYOFO3bqxs0kIhcZKUBUJ/DG//UIFceegfGVijiBeM9K4xbR+HfxTIg49Pqa1JTNcoWqjeq1xewqd8Ovqt+J9Zrsn7XC1zy8XyK6U65vHBA6HY/h/2Li7sxatMzfGX8m8L3hiAx7eOKBBtFJj/8VnuVggQZodIPna6xhrBBIcA1YLrQ3EXxXDLlO5yVM/S+B7oFgYMgMd4"}; // values数组Inv看卫星
    public static boolean f;Inv看卫星
    public static boolean g;Inv看卫星
    private static final String[] z = { "d0287d85d288c2af116e0d60878a8a24" , "This program can only run with burpsuite_pro_v1.6.37.jar", "burp.StartBurp",  "LNimbus" , "main", "/burp", "md5", "BurpLoader by larry_lau", "larry.lau.javax.swing.plaf.nimbus.NimbusLookAndFeel",Inv看卫星
    "burpsuite_pro_v1.6.37.jar was corrupted!" , "burp." , "%02x"};Inv看卫星
    Inv看卫星
    static {} //errorInv看卫星
    Inv看卫星
    public static void main(final String[] array) {Inv看卫星
        final boolean g = BurpLoader.g;Inv看卫星
        try {Inv看卫星
            try {Inv看卫星
                final String s = BurpLoader.z[8];Inv看卫星
                Class.forName(s); //实例化一个字符串为名称的类 http://blog.csdn.net/kaiwii/article/details/7405761Inv看卫星
                UIManager.installLookAndFeel(BurpLoader.z[3], s); //Swing用来设置外观与风格的相关函数Inv看卫星
            }Inv看卫星
            catch (ClassNotFoundException ex8) {}Inv看卫星
            final Class<?> forName = Class.forName(BurpLoader.z[2]); //找不到那个外观类就实例化 burp.StartBurp 既BurpSuite的启动类Inv看卫星
            Inv看卫星
            //用md5验证了啥东西Inv看卫星
            try {Inv看卫星
                MessageDigest messageDigest = null;Inv看卫星
            Label_0086_Outer:Inv看卫星
                while (true) {Inv看卫星
                    final CodeSource codeSource = forName.getProtectionDomain().getCodeSource(); //取CodeSource,一般配合getLocation使用取Jar包中的路径Inv看卫星
                    final MessageDigest instance = MessageDigest.getInstance(BurpLoader.z[6]); //动态获取加密算法,这里是md5Inv看卫星
                    final InputStream openStream = codeSource.getLocation().openStream(); //OpenStream()打开流以读取当前生成提供程序对象的虚拟路径。Inv看卫星
                    final byte[] array2 = new byte[1024];Inv看卫星
                    int read = 0;Inv看卫星
                    while (true) {Inv看卫星
                        while (true) {Inv看卫星
                            Label_0094: {Inv看卫星
                                try {Inv看卫星
                                    if (!g) {Inv看卫星
                                        break Label_0094;Inv看卫星
                                    }Inv看卫星
                                }Inv看卫星
                                catch (ClassNotFoundException ex) {Inv看卫星
                                    throw ex;Inv看卫星
                                }Inv看卫星
                                messageDigest.update(array2, 0, read); //// // array2是输入字符串转换得到的字节数组Inv看卫星
                            }Inv看卫星
                            if ((read = openStream.read(array2)) > 0) {Inv看卫星
                                continue Label_0086_Outer;Inv看卫星
                            }Inv看卫星
                            break;Inv看卫星
                        }Inv看卫星
                        openStream.close();Inv看卫星
                        messageDigest = instance;Inv看卫星
                        if (!g) {Inv看卫星
                            break;Inv看卫星
                        }Inv看卫星
                        continue;Inv看卫星
                    }Inv看卫星
                }Inv看卫星
                StringBuffer sb = null;Inv看卫星
            Label_0178_Outer:Inv看卫星
                while (true) {Inv看卫星
                    final byte[] digest = messageDigest.digest(); //生成md5Inv看卫星
                    sb = new StringBuffer();Inv看卫星
                    int n = 0;Inv看卫星
                    while (true) {Inv看卫星
                        while (true) {Inv看卫星
                            Label_0181: {Inv看卫星
                                try {Inv看卫星
                                    if (!g) {Inv看卫星
                                        break Label_0181;Inv看卫星
                                    }Inv看卫星
                                    //sb.append(String.format(BurpLoader.z[11], digest[n] & 0xFF)); 优化Inv看卫星
                                    sb.append(String.format("%02x", digest[n] & 0xFF)) //准备输出md5?Inv看卫星
                                }Inv看卫星
                                catch (ClassNotFoundException ex2) {Inv看卫星
                                    throw ex2;Inv看卫星
                                }Inv看卫星
                                ++n;Inv看卫星
                            }Inv看卫星
                            if (n < digest.length) {Inv看卫星
                                continue Label_0178_Outer;Inv看卫星
                            }Inv看卫星
                            break;Inv看卫星
                        }Inv看卫星
                        if (!g) {Inv看卫星
                            break;Inv看卫星
                        }Inv看卫星
                        continue;Inv看卫星
                    }Inv看卫星
                }Inv看卫星
                int equals = 0;Inv看卫星
                /*Inv看卫星
                用于确认版本Inv看卫星
                ~>>> md5 burpsuite_pro_v1.6.37.jarInv看卫星
                MD5 (burpsuite_pro_v1.6.37.jar) = d0287d85d288c2af116e0d60878a8a24Inv看卫星
                */Inv看卫星
                Label_0245: {Inv看卫星
                    Label_0219: {Inv看卫星
                        int n2;Inv看卫星
                        try {Inv看卫星
                            n2 = (equals = (BurpLoader.z[0].equals(sb.toString()) ? 1 : 0)); // 比较md5的值Inv看卫星
                            if (g) {Inv看卫星
                                break Label_0245;Inv看卫星
                            }Inv看卫星
                            if (n2 == 0) {Inv看卫星
                                break Label_0219;Inv看卫星
                            }Inv看卫星
                            break Label_0219;Inv看卫星
                        }Inv看卫星
                        catch (ClassNotFoundException ex3) {Inv看卫星
                            throw ex3;Inv看卫星
                        }Inv看卫星
                        try {Inv看卫星
                            if (n2 == 0) {Inv看卫星
                                JOptionPane.showMessageDialog(null, BurpLoader.z[9], BurpLoader.z[7], 0); //弹出提示版本不符或者被修改Inv看卫星
                                System.exit(-1);Inv看卫星
                            }Inv看卫星
                        }Inv看卫星
                        catch (ClassNotFoundException ex4) {Inv看卫星
                            throw ex4;Inv看卫星
                        }Inv看卫星
                    }Inv看卫星
                    equals = 0;Inv看卫星
                }Inv看卫星
                /*Inv看卫星
                利用反射机制修改BurpSuite类相关信息,对于未混淆版本的Burploader和解密出的字符串可以重构前面的定义Inv看卫星
                */Inv看卫星
                int n3 = equals; //0Inv看卫星
                while (true) {Inv看卫星
                    Label_0316: {Inv看卫星
                        if (!g) {Inv看卫星
                            break Label_0316;Inv看卫星
                        }Inv看卫星
                        //final Field declaredField = Class.forName(BurpLoader.z[10] + BurpLoader.b[n3]).getDeclaredField(BurpLoader.c[n3]); 优化Inv看卫星
                        //通过反射机制获取类相关的属性或去修改它 http://my.oschina.net/swords/blog/117357Inv看卫星
                        //从 burp.xxx 的类中取变量,可以用jd-gui反编译去看,取对应类中的第一个Strinig变量Inv看卫星
                        final Field declaredField = Class.forName("burp.b_classarray").getDeclaredField(BurpLoader.c[n3]);Inv看卫星
                        declaredField.setAccessible(true);Inv看卫星
                        declaredField.set(null, BurpLoader.a[n3]); //插入stringdataInv看卫星
                        ++n3;Inv看卫星
                    }Inv看卫星
                    if (n3 < BurpLoader.b.length) {Inv看卫星
                        continue;Inv看卫星
                    }Inv看卫星
                    break;Inv看卫星
                }Inv看卫星
                Preferences preferences = null;Inv看卫星
            Label_0352_Outer:Inv看卫星
                while (true) {Inv看卫星
                    //保存用户偏好,Windows是注册表,Linux是Home目录下的文件Inv看卫星
                    final Preferences node = Preferences.userRoot().node(BurpLoader.z[5]); //node("/burp")Inv看卫星
                    int n4 = 0;Inv看卫星
                    while (true) {Inv看卫星
                        while (true) {Inv看卫星
                            Label_0398: {Inv看卫星
                                try {Inv看卫星
                                    if (!g) {Inv看卫星
                                        break Label_0398;Inv看卫星
                                    }Inv看卫星
                                }Inv看卫星
                                catch (ClassNotFoundException ex5) {Inv看卫星
                                    throw ex5;Inv看卫星
                                }Inv看卫星
                                //比较一些偏好设定,这里其实是key和values的比较Inv看卫星
                                /*Inv看卫星
                                String v = prefs.get(keys[i], null);Inv看卫星
                                if (!vals[i].equals(v)) {Inv看卫星
                                    prefs.put(keys[i], vals[i]);Inv看卫星
                                }Inv看卫星
                                */Inv看卫星
                                if (!BurpLoader.e[n4].equals(preferences.get(BurpLoader.d[n4], null))) {Inv看卫星
                                    node.put(BurpLoader.d[n4], BurpLoader.e[n4]);Inv看卫星
                                }Inv看卫星
                                ++n4;Inv看卫星
                            }Inv看卫星
                            if (n4 < BurpLoader.d.length) {Inv看卫星
                                continue Label_0352_Outer;Inv看卫星
                            }Inv看卫星
                            break;Inv看卫星
                        }Inv看卫星
                        preferences = node;Inv看卫星
                        if (!g) {Inv看卫星
                            break;Inv看卫星
                        }Inv看卫星
                        continue;Inv看卫星
                    }Inv看卫星
                }Inv看卫星
                preferences.flush();Inv看卫星
                //反射调用 StartBurp.main(args); Inv看卫星
                forName.getDeclaredMethod(BurpLoader.z[4], String[].class).invoke(null, array); // z4 = mainInv看卫星
            }Inv看卫星
            catch (Throwable t) {Inv看卫星
                t.printStackTrace();Inv看卫星
                int headless = GraphicsEnvironment.isHeadless() ? 1 : 0; //测试当前是否为图形环境Inv看卫星
                Label_0504: {Inv看卫星
                    int n5 = 0;Inv看卫星
                    Label_0503: {Inv看卫星
                        try {Inv看卫星
                            n5 = headless;Inv看卫星
                            if (g) {Inv看卫星
                                break Label_0504;Inv看卫星
                            }Inv看卫星
                            if (n5 != 0) {Inv看卫星
                                break Label_0503;Inv看卫星
                            }Inv看卫星
                        }Inv看卫星
                        catch (ClassNotFoundException ex6) {Inv看卫星
                            throw ex6;Inv看卫星
                        }Inv看卫星
                        try {Inv看卫星
                            GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); //取默认图形环境Inv看卫星
                        }Inv看卫星
                        catch (HeadlessException ex9) {Inv看卫星
                            headless = 1;Inv看卫星
                        }Inv看卫星
                        catch (InternalError internalError) {Inv看卫星
                            headless = 1;Inv看卫星
                        }Inv看卫星
                    }Inv看卫星
                    try {Inv看卫星
                        if (n5 != 0) {Inv看卫星
                            System.err.println(BurpLoader.z[1]);Inv看卫星
                            if (!g) {Inv看卫星
                                return;Inv看卫星
                            }Inv看卫星
                        }Inv看卫星
                    }Inv看卫星
                    catch (ClassNotFoundException ex7) {Inv看卫星
                        throw ex7;Inv看卫星
                    }Inv看卫星
                }Inv看卫星
                //JOptionPane.showMessageDialog(null, BurpLoader.z[1], BurpLoader.z[7], 0); 弹出提示框Inv看卫星
                JOptionPane.showMessageDialog(null, "This program can only run with burpsuite_pro_v1.6.37.jar", "Powered by XXX", 0);Inv看卫星
                Inv看卫星
            }Inv看卫星
        }Inv看卫星
        catch (ClassNotFoundException ex10) {Inv看卫星
            System.exit(-1);Inv看卫星
        }Inv看卫星
    }Inv看卫星
}Inv看卫星
从以上代码可以看出,BurpLoader的新版本破解BurpSuite的方式依旧没有发生改变,还是通过反射机制修改相关Burp类的成员变量 值来固定检测环境,同时写入Key来实现的。只不过比之前的版本,多了通过md5等方式来判断要启动的Burp主体是否是对应的版本。Inv看卫星
Inv看卫星
0x04 使坏Inv看卫星
原谅用了这么一个2B的小标题,Raphael Mudge牛曾在自己的Blog上写过(http://blog.cobaltstrike.com/2013/09/05/how-to-crack- cobalt-strike-and-backdoor-it/)如何破解自己的产品并加后门。事实上在BurpLoader中加上一点dirty code也是很容易的,然后再各大论坛或者某F传播出去也是能收获一批灰阔的,显而易见的例子是 ,堪比二十世纪出头灰阔圈子中各大XX联盟和XX技术小组了。最后感谢乌云Drops带来的好文章,多学习多实 践,有机会也去感受一把逆向Burp