JAVA逆向&反混淆-追查Burpsuite的破解原理(转)

0x00 摘要:



本系列文章通过对BurpLoader的几个版本的逆向分析,分析Burpsuite的破解原理,分析Burpsuite认证体系存在的安全漏洞。

0x01 JD-GUI的用途与缺陷:



JD-GUI是一款从JAVA字节码中还原JAVA源代码的免费工具,一般情况下使用这款工具做JAVA逆向就足够了,但是由于其原理是从JAVA字节码中按照特定结构来还原对应的JAVA源代码,因此一旦字节码结构被打乱(比如说使用混淆器),那么JD-GUI就会失去它的作用,如图为使用JD-GUI打开Burpsuite时的显示:

显然,JD-GUI没能还原JAVA源代码出来,因为Burpsuite使用了混淆器打乱了字节码结构 所以,JD-GUI适用于‘没有使用混淆器’的JAVA字节码,而缺陷是一旦字节码结构被打乱,则无法发挥它的作用

0x02 字节码分析:



Java的字节码并不像普通的二进制代码在计算机中直接执行,它通过JVM引擎在不同的平台和计算机中运行。

JVM是一个基于栈结构的虚拟计算机,使用的是JVM操作码(及其助记符),在这一点上和普通二进制反汇编的过程非常相似。 对Java字节码进行反编译其实非常简单,JDK内置的Javap工具即可完成这项任务。

示例:对Javar.class进行反编

注意javap的-c参数是显示详细代码,否则只显示method,而按照java的老规矩Javar不要加后缀名 同时你也可以使用eclipse的插件Bytecode Visualizer来反编译字节码

注意右面的流程图,大家在上程序设计导论课时都画过吧,现在发现它的用途了吧,一眼就看出是一个if-else结构,前两句定义i变量,然后取i=2压栈常数1,比对i和1以后就都java.lang.system.out了,一个输出wooyun,一个输出lxj616。

0x03 老版本的BurpLoader分析:



随着Burpsuite的更新,BurpLoader也在跟着进行更新,我们从老版本的BurpLoader入手,简要分析一下之前老版本的burpsuite破解原理。 本处选用了1.5.01版本的BurpLoader进行分析 首先试着用JD-GUI载入BurpLoader:

成功还原了BurpLoader源代码,只可惜由于是对burpsuite的patch,所以burpsuite的混淆在burploader里仍然可读性极差,不过可以推断burploader本身没有使用混淆工具。

public static void main(String[] args)
  {
    try
    {
      int ret = JOptionPane.showOptionDialog(null, "This program can not be used for commercial purposes!", "BurpLoader by larry_lau@163.com", 0, 2, null, new String[] { "I Accept", "I Decline" }, null);
      //显示选择对话框:这程序是出于学习目的写的,作者邮箱larry_lau(at)163.com
      if (ret == 0)  //选择我同意
      {
        //以下用到的是java反射机制,不懂反射请百度
        for (int i = 0; i < clzzData.length; i++)
        {
          Class clzz = Class.forName(clzzData[i]);
          //是burpsuite的静态类(名字被混淆过了,也没必要列出了)
          Field field = clzz.getDeclaredField(fieldData[i]);
         //静态类中的变量也被混淆过了,也不必列出了
          field.setAccessible(true);
        //访问private必须先设置这个,不然会报错

          field.set(null, strData[i]);
        //把变量设置成strData(具体那一长串到底是什么暂不讨论)
        }

        Preferences prefs = Preferences.userNodeForPackage(StartBurp.class);
        //明显preferences是用来存储设置信息的
        for (int i = 0; i < keys.length; i++)
        {
          // key和val能猜出是什么吧
          String v = prefs.get(keys[i], null);
          if (!vals[i].equals(v))
          {
            prefs.put(keys[i], vals[i]);
          }
        }
        StartBurp.main(args);
      }
    }
    catch (Exception e)
    {
      JOptionPane.showMessageDialog(null, "This program can only run with burpsuite_pro_v1.5.01.jar", "BurpLoader by larry_lau@163.com",
        0);
    }
  }
}

因此,BurpLoader的原理就是伪造有效的Key来通过检测,Key的输入是通过preference来注入的,而我猜测它为了固定Key的计算方法,通过反射把一些环境变量固定成常量了

0x04 新版本的BurpLoader分析:



以下用1.6beta版的BurpLoader进行分析: 首先用JD-GUI尝试打开BurpLoader:

看来这个版本的BurpLoader对字节码使用了混淆,这条路走不通了 于是直接读字节码吧!

大家可以看到这里的字符串都是混淆过的,每一个都jsr到151去解密

这段解密代码特点非常明显,一个switch走5条路,给221传不同的解密key,这不就是Zelix KlassMaster的算法吗? 简单的异或而已,轻松写出解密机:

public class Verify {
    private static String decrypt(String str) {
        char key[] = new char[] {73,25,85,1,29};
        char arr[] = str.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            arr[i] ^= key[i % 5];
        }
        return new String(arr);
    }

    public static void main (String args[]) {
        System.out.println(decrypt("%x'sdgu4t3#x#`egj\"hs.7%m|/7;hp+l&/S t7tn\5v:j\'}_dx%"));
    }
}

里面的5个密钥就是上图bipush的传参,别忘了iconst_1的那个1 解密出来是:larry.lau.javax.swing.plaf.nimbus.NimbusLook:4

其实这里解密出字符串没有什么用处,因为我们已经拿到老版本的源代码了,不过在别的软件逆向分析中可能会非常有用

0x05 总结&POC



以下为我修改后的BurpLoader,其中的恶意代码我已经去除,并将修改前的原值输出,大家可以在添加burpsuite jar包后编译运行这段代码

package stratburp;

import burp.StartBurp;
import java.lang.reflect.Field;
import java.util.prefs.Preferences;
import javax.swing.JOptionPane; 

public class startburp
{ 

  private static final String[] clzzData = { "burp.ecc", "burp.voc", "burp.jfc",
    "burp.gtc", "burp.zi", "burp.q4c", "burp.pid", "burp.y0b" }; 

  private static final String[] fieldData = { "b", "b", "c", "c", "c", "b", "c", "c" };
  private static final String errortip = "This program can only run with burpsuite_pro_v1.5.01.jar";
  private static final String[] keys = { "license1", "uG4NTkffOhFN/on7RT1nbw==" }; 

  public static void main(String[] args)
  {
    try
    {
        for (int i = 0; i < clzzData.length; i++)
        {
          Class clzz = Class.forName(clzzData[i]);
          Field field = clzz.getDeclaredField(fieldData[i]);
          field.setAccessible(true); 

          //field.set(null, strData[i]);
          System.out.println(field.get(null));
        } 

        Preferences prefs = Preferences.userNodeForPackage(StartBurp.class);
        for (int i = 0; i < keys.length; i++)
        {
          String v = prefs.get(keys[i], null);
          System.out.println(prefs.get(keys[i], null));
        }
        StartBurp.main(args);
    }
    catch (Exception e)
    {
      JOptionPane.showMessageDialog(null, "This program can only run with burpsuite_pro_v1.5.01.jar", "Notice",0);
    }
  }
}

其效果如截图所示

其中前8行输出为之前BurpLoader恶意修改的目标原值(对我的计算机而言),同一台设备运行多少遍都是不变的,后面的key由于我之前运行过BurpLoader因此是恶意修改后的值(但是由于前8行没有修改因此不能通过Burpsuite验证),可见BurpLoader其实是使用了同一个密钥来注册所有不同计算机的,只不过修改并固定了某些参与密钥计算的环境变量而已,这大概就是Burpsuite破解的主要思路了,至于最初能用的license是怎么计算出来的,我们以后再研究

 

收藏 

分享

 

为您推荐了适合您的技术文章:

  1. WebShell系列(一)---XML
  2. web扫描爬虫优化
  3. 域渗透——Skeleton Key
  4. QQ模拟登录实现之四两拨千斤(基于V8引擎)

 

http://drops.wooyun.org/tips/2689

 

时间: 2024-08-21 09:53:18

JAVA逆向&反混淆-追查Burpsuite的破解原理(转)的相关文章

JAVA的逆向和反混淆 追查Burpsuite的破解原理详解

摘要: 近来,一款名为Burpsuite的商业版安全工具惨遭破解,网上出现了一款名为BurpLoader的恶意软件,该软件破坏了Burpsuite的认证流程,给世界和平带来了严重威胁.本系列文章通过对BurpLoader的几个版本的逆向分析,分析Burpsuite的破解原理,分析Burpsuite认证体系存在的安全漏洞. JD-GUI的用途与缺陷: JD-GUI是一款从JAVA字节码中还原JAVA源代码的免费工具,一般情况下使用这款工具做JAVA逆向就足够了,但是由于其原理是从JAVA字节码中按

.net反混淆脱壳工具de4dot的使用

de4dot是一个开源的.net反混淆脱壳工具,是用C#编写的,介绍一下它的使用方法 首先 pushd 到de4dot.exe所在文件夹,然后调用 de4dot.exe  路径+dll名称 如下图 Detected Unknown Obfuscator 说明侦测不到这个程序集是用什么方式混淆的,但是de4dot依然会把反混淆的程序集重新生成一个新的程序集. 当然,生成的程序集还是没能反混淆. Dundas作为一个给专业程序员使用的控件,当然没那么容易破解,不过这里又多了解了一种反混淆脱壳工具,也

.Net 中的名称混淆与名称反混淆

提到 .Net 的保护,首推就是混淆保护了,而名称混淆基本上是所有混淆保护工具都具有的功能.可以说不支持名称混淆的工具称不上混淆保护工具.对于混淆保护,大家有一个认识,就是 混淆是一个不可逆的过程.而加密保护是一个可逆的过程. 名称混淆真的完全不可逆吗?答案是否定的.名称混淆有一部分是可以精确还原的. .Net的名称混淆在 剖析DotNet的名称混淆保护技术 中有详细介绍.今回注意介绍名称混淆中可逆的部分,以及还原的方法. 一. 属性名称 以及 getter 和 setter 函数.少部分工具有

ProGuard 4.8发布 Java优化和混淆器

ProGuard 是一款开源的Java类,用于文件的压缩.优化.混淆,预校验.它支持检测和删除未使用的类.字段.方法和属性,优化字节码和删除未使用的指令,使用短无意义的名称重命名剩下的类.字段和方法,预校验Java 6或Java微型版的处理代码.相比与其他Java shrinkers和混淆器,ProGuard的优势是更紧凑的基于模板配置.内存效率和速度. ProGuard 4.8该版本主要修复了配置解析.优化和混淆的一系列小问题.增加了几个字符串优化的优化步骤,小的改进和配置Ant任务.与以前的

Java和Android的LRU缓存及实现原理_Android

一.概述 Android提供了LRUCache类,可以方便的使用它来实现LRU算法的缓存.Java提供了LinkedHashMap,可以用该类很方便的实现LRU算法,Java的LRULinkedHashMap就是直接继承了LinkedHashMap,进行了极少的改动后就可以实现LRU算法. 二.Java的LRU算法 Java的LRU算法的基础是LinkedHashMap,LinkedHashMap继承了HashMap,并且在HashMap的基础上进行了一定的改动,以实现LRU算法. 1.Hash

网友揭秘畅无线破解原理:内置大量WLAN账号

昨日有消息称,一款名为"畅无线"的应用利用中国移动的WiFi管理漏洞,为使用者提供免费的无线上网服务.对此,有微博 网友称,畅无线软件内置了大量的WLAN电子卡账号免费让用户使用,而非媒体所称的"破解".据了解,该应用的开发商为上海云联计算机系统有限公司(以下简称"云联"),这款软件使用户跳过运营商设置的"WLAN用户登录的验证界面",免输入用户名或密码直接使用运营商的WiFi热点,并且免除一切费用.有报道称,该软件极有可能是

Java防止反编译

问题描述 Java中发布到客户机的Jar如何做到防止反编译而保护程序.现在一般的做法:1.代码混淆:尝试下来,有的工具好一点混淆程度高,有的工具差一点效果也就打点折扣,但反射的类需要排除在外,工作量挺大2.classloader加密:没尝试3.生成本地代码:破坏了跨平台,也担心性能4.远程调用:实际业务不可远程防止,不考虑看见别人有一种方式,可以禁止打开jar,加载进来也看不到源码,不知道什么方法.有经验的朋友解答下,不胜感激. 解决方案 解决方案二:不知道,正想学习的,顶一个

哪位大哥有mapxtreme for java 4.7 或 4.8的破解.或是mapxtreme 2005 v6.7 或其它版本的破解

问题描述 mapxtreme2005的破解我是有.开发单机时可以去掉水印.可是web时不能去掉.不知道该怎么办.还有如果有java版的破解也行.最终要求开发出来的web项目不要带那个水印就行了.我的邮箱271104813@qq.com多谢了. 解决方案 解决方案二:也可以直接贴出来解决办法.解决方案三:不知,帮顶解决方案四:好像还可以回复解决方案五:如果想省软件费用的话,你可以使用预生成图片,前端展现的办法.所谓的水印要它做后台处理.liminghua_2001@hotmail.com解决方案六

前反恐首席顾问: FBI破解iPhone可求助NSA

苹果之前也曾建议这么做,FBI 会不会最后就真的找美国国安局帮忙呢? 威锋网 3 月 15 日消息 去年 12 月在加州圣贝纳迪诺发生了一起枪击恐怖事件,由于 FBI 在调查时无法解锁罪犯手机(iPhone 5c)获取数据,进而打算通过法院和美国司法部强制苹果提供协助,遭到后者拒绝后 FBI 和苹果将事情闹上了美国国会,近日又有人为苹果支招了. 美国国家安全委员会(NSC)前任首席反恐顾问 Richard Clarke 在接受 NPR 电台采访时表示,他认识的每一个专家都认为美国国安局(NSA)