lxj616 · 2014/07/30 16:19

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 [email protected]", 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 [email protected]", 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是怎么计算出来的,我们以后再研究

JAVA逆向反混淆-追查Burpsuite的破解原理相关推荐

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

    0x00 摘要: 本系列文章通过对BurpLoader的几个版本的逆向分析,分析Burpsuite的破解原理,分析Burpsuite认证体系存在的安全漏洞. 0x01 JD-GUI的用途与缺陷: JD ...

  2. JS逆向、破解、反混淆、反浏览器指纹——JS补环境框架

    JS逆向的主要思路一般有这几种 1,利用AST反混淆,因为用的就是AST混淆的,所以理论上应该都能用AST再返回去.但是实际操作好像不容易. 2,跟值,一步一步找到加密方法和密钥.现在很多混淆方法,把 ...

  3. 安卓逆向代码反混淆 Simplify工具 JEB2反混淆神器

    [技术分享]Android程序反混淆利器--Simplify工具 https://www.anquanke.com/post/id/85388 发布时间:2017-01-23 17:21:23 问题背 ...

  4. 【JS 逆向百例】W店UA,OB反混淆,抓包替换CORS跨域错误分析

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 文章目录 声明 逆向目标 OB 混淆简介 抓包分析 混淆还原与替换 CORS 跨域错误 逆向分析 本地联调 完整代码 JavaS ...

  5. 【JavaScript 逆向】AST 技术反混淆

    前言 通过浏览器工具可以清楚的看到网站正在运行的 HTML 和 JavaScript 代码,所以对 JavaScript 代码进行混淆处理是一些网站常用的反爬措施,例如下文介绍到的字符串混淆.控制流平 ...

  6. 【项目实战】Java代码反编译工具的使用 以及 如何对Java代码进行混淆?

    一.背景 现在交付给客户的代码,虽然不是以源码的形式交付,但是还经常会需要进行反编译,如何更好的做到反编译呢?本文探讨的是如何进行反编译的方法. 二. Java代码反编译工具的使用 (1)使用jad ...

  7. 极验验证码(6.0.9)破解(二) 之 反混淆

    回顾 上篇文章主要分析了极验的请求过程,以及出现的各种参数和配置信息 我们认识到了gt和challenge,极验相关的各种js路径,极验的各种详细配置,以及滑动时生成的参数w 我们的目标是弄明白w参数 ...

  8. java逆向反汇编工具_java反编译工具(XJad)v2.2

    本帖最后由 Heart 于 2020-10-31 13:54 编辑 当时学JAVA的时候有用到,后面仔细找一找好像很多地方的链接都失效了. 可以反编译jar包 挺好用的,可惜是06年更新的2.2版本一 ...

  9. 前端清单:Vue2 响应式原理,RN 运行内置 Node,JS 巧用 Proxy 反混淆,GraphQL 优劣思辨...

    前端每周清单第 25 期:Vue2 响应式原理,RN 运行内置 Node,JS 巧用 Proxy 反混淆,GraphQL 优劣思辨,深入 React 动画 作者:王下邀月熊 编辑:徐川 前端每周清单专 ...

最新文章

  1. 信息安全 CIO最关注什么?
  2. Android退出程序(二)——利用广播机制
  3. crm使用soap创建下拉框
  4. SpringBoot中使用yml配置文件以及配置类实现文件上传下载路径的修改
  5. mybatis-plus学习记录(详细)
  6. js获取session_学习后端鉴权系列: 基于Cookie, Session认证
  7. 【c++】字符串的冒泡排序【存疑,待查】
  8. Ubuntu 16.04错误:The update information is outdated this may be caused by network...的问题解决...
  9. 获取CPUID序列号的两种办法
  10. 计算机应用项目教案,计算机应用基础2项目二--电子教案.doc
  11. linux 开源oa系统,linux版64位免费OA办公系统4.17
  12. kubeedge解决边端keadm join的时候卡住的问题
  13. 外卖cps淘客项目,一个被动引流躺着赚钱的玩法
  14. 小赛毛游C记——分支和循环语句(2)
  15. 常见的网络攻击方法与防范措施
  16. 解决dns没问题,能上qq不能上网的问题
  17. MyBatis级联查询
  18. vue-router 采坑记录
  19. css3实现磨砂效果,CSS3打造磨砂玻璃背景效果
  20. Java8 - Streams flatMap()

热门文章

  1. Uva 10004(二分图的判定)
  2. iOS开发那些事-iOS常用设计模式–委托模式案例实现
  3. Eclipse如何连接SQL Server 2005数据库
  4. POJ 1159 (DP)
  5. #1406 data too long for column '' at row 1
  6. asp.net实现无刷新,无须AJAX
  7. row_number() over(partition by order by )使用说明书
  8. flask登录验证用ajax,基于 Ajax 请求的 Flask-Login 认证
  9. php微信拍照图库js接口,ThinkPHP微信实例——JSSDK图像接口多张图片上传下载并将图片流写入本地...
  10. python查看内存地址的内容_python中如何查看指定内存地址的内容