专栏名称: 京东成都研究院
京东商城成都研究院信息平台
目录
相关文章推荐
51好读  ›  专栏  ›  京东成都研究院

Java逆向过程分享--破解Burpsuite

京东成都研究院  · 公众号  · 成都  · 2018-04-16 17:48

正文



“破解Burpsuite”这个名字取得有点大,实际逆向结果并没有完全突破Burpsuite的license限制(具体原因下文说明),但实在想不到合适的名字,姑且用这个。

写本文的目的主要有两个:

1、分享和记录crack的一些思路和技巧

2、抛砖引玉,希望能跟更多人交流

注意:期望通过本文获得有关逆向和破解的黑科技的人,可能要让你们失望了。破解的过程实际是不断的假设-验证、不断试错的过程,充斥一次又一次的失望与挫败,相当乏味。

——前言


一、相关知识


逆向过程中会涉及到JVM字节码、类加载机制、Debug技术原理等相关知识,具体参见下表:

二、现状及问题


Burpsuite 这款渗透测试软件每年不定期会有一个破解版本放出,但是该破解版本放出的时间不确定,并且破解版的license只有1年的有效期。license到期后的提示如下:

如果修改系统时间,可以绕过license expired的检测,但是一旦恢复系统时间,运行中的Burpsuite会给出license expired的提示,并且在十多分钟后自动关闭,如下图:

由于本人有段时间做渗透测试对Burpsuite的依赖比较大,就想尝试反编译一下源代码,看看能不能去掉这个时间限制,或者直接从根本上crack掉。现在看来当初的想法很幼稚T_T

下面进入正题。


三、环境和版本


目前网上流传的破解版,几乎都是通过BurpLoader这个破解器来启动Burpsuite。下面的反编译过程基于BurpLoader展开。这里列出版本主要是下文会涉及到一些反编译的代码,因为代码被混淆过,各个版本的类名都不一样。


四、BurpLoader如何做到的?


我们先从BurpLoader入手,看看人家是如何破解的。由于没有源码,在Eclipse中通过JAD打开 larry.lau.BurpLoader.class( 这个破解器只有一个类)。打开后发现破解器本身居然被混淆过!

Jad反编译的结果并不理想,大部分代码都是混乱的,并且字符串也被编码。见截图:

从直觉上看类文件在混淆的时候被打乱了逻辑,字符串也被编码过。目前已知的收费或开源混淆工具中,同时具有这两种功能的只有Zelix KlassMaster,见下图:

(随着后续反编译的深入,还会发现讹用代码的插入)

那么现在问题有两个:

1、如何解码字符串?

这里截图了混淆字符串的字节码片段加以说明:

从上图中可以看到编码后的字符串常量(7: ldc)经过jsr指令跳转到偏移量为234处的switch指令,然后根据每条case分支与不同的整数(例如,bipush  65)进行异或,最后解码后的该字符串实际的内容。在了解字符串混淆编码的过程后,可以写一个简单的解码工具来逆向,但实际还有更简单的办法。因为是在static块中完成的解码操作,可以等类加载后通过反射获取实际的字符串内容。

这里有两个点可以注意下:jsr这个指令在1.7以后的JVM是看不到的(我也是只在KlassMaster混淆过的代码中才看到过这个指令)。jsr 这个指令只适用于1.6及以下的虚拟机,其作用是与ret指令一起完成finally block的跳转和返回,具体细节参见Compiling finally

2、如何修复BurpLoader类的正常逻辑?

这里没有捷径,只能肉眼反编译。反编译的完整代码看这里:BurpLoader.java

为了控制篇幅,这里不对反编译的过程展开,具体过程请跳转到这里查看反编译BurpLoader字节码(待补充)。

成功反编译后我们来看下BurpLoader到底都做了些什么。

1、设置UI外观:

2、计算Burpsuite jar包的md5值是否与预期一致,否则弹出提出,终止程序:

3、通过反射将Burpsuite中burp路径下对应的几个类的某个变量赋值,为固定key的计算做准备:

这里有点需要注意下:因为混淆后本地变量表被擦除,local_12这个变量名是我随便取的。实际上这个变量是混淆工具加入的,目的是为了打乱程序逻辑。因为这段字节码无法还原成正常的代码,非要反编译的话只能通过label的方式来跳转,就像你现在看到的这样。实际这个变量恒为false。真正的分支是else中执行同样的逻辑。

4、设置程序的preference,即通常所说的首选项,这是Swing编程中常见的代码逻辑:

(正如你们看到的,这里又出现了local_12)








请到「今天看啥」查看全文