首页
社区
课程
招聘
[原创]Burp Suite Pro 2022.11 破解
发表于: 2022-11-11 19:56 19325

[原创]Burp Suite Pro 2022.11 破解

2022-11-11 19:56
19325

感谢各路大佬的提示,在之前的基础上更新了2022.11版本的破解.

2022.11跟之前的版本相比就是多了两组签名,我之前没开窍忘了我是覆写验证函数,一直在纠结那两组签名的验证在哪,结果后来我朋友告诉我你都覆盖了,就不需要在意那两个签名了..结果还真是,就修改了解密后的数组处理,其他没什么变化,算号器也是从h3110w0r1d大佬那里拿的gui,修改了生成方式,其他一模一样.

在此特别感谢h3110w0r1d大佬的gui源码跟生成方式.

老样子,不混淆,不加密,带源码,有兴趣的可以自己围观.

修改记录:

 

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2022-11-23 13:23 被ny0c编辑 ,原因: 优化启动流程
上传的附件:
收藏
免费 17
支持
分享
最新回复 (22)
雪    币: 966
活跃值: (149)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢分享
2022-11-11 20:54
0
雪    币: 615
活跃值: (1212)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
很酷
2022-11-11 21:10
0
雪    币: 4014
活跃值: (5665)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
需要优化的地方,classname判断是burp/开头的,这个还可以改成总参数loader,loader不是null,以burp.开头,这样会少很多判断,burp包下的类并不都是它自己loader加载的。再就是那个定位特征值,有的类特别大,查找起来费时,而且你是所有burp的类都检查,尽量缩小一下范围。还有就是尽量少去写字节码,做到最小侵入性,不易出错更稳定,你的des和base完全可以放到自己的java方法中,编译好,用一个字节码指令去调用就行。
2022-11-11 21:43
1
雪    币: 698
活跃值: (2365)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5

看loader看到的时候是jdk的,单独getname也是null,所以我没用loader作为判断,编译好后的class文件有java版本限制,所以我没这么做

最后于 2022-11-12 02:26 被ny0c编辑 ,原因:
2022-11-12 02:24
1
雪    币: 698
活跃值: (2365)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
发现换了哈希匹配算法之后...才提升0.1-0.3秒,感觉不是很必要换掉匹配算法,但是提升一点也是提升,还是放出来了,另loader那里的classLoader.getClass().getName()才可以拿到burp开头的,也试了下,确实是得加上classloader判断,匹配次数从1734降低到70,总体启动时间从7-8秒降低到2-3秒.
2022-11-12 04:02
1
雪    币: 4014
活跃值: (5665)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不用那么复杂,可以抓住类特别大的特点,通过类的字节数组这个参数大于多少就行过滤,不必再去查询特征,计算hash啥的。
2022-11-12 06:28
1
雪    币: 698
活跃值: (2365)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
guduzhe 不用那么复杂,可以抓住类特别大的特点,通过类的字节数组这个参数大于多少就行过滤,不必再去查询特征,计算hash啥的。
这个有考虑过,不过怕老版本不兼容所以就放弃这个方式过滤了.并且现在新版burp要求java11后,相比jdk8时代,代码执行上优化了许多,之前我那个findbyarray在jdk8上就很慢,jdk11后就快了许多
2022-11-12 07:45
1
雪    币: 10023
活跃值: (4416)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢大佬分享
2022-11-12 10:47
0
雪    币: 2951
活跃值: (3767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢楼主分享
2022-11-12 12:46
0
雪    币: 4822
活跃值: (3822)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
11
感谢分享
2022-11-12 15:19
2
雪    币: 4014
活跃值: (5665)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
已引用您的思路,并修改成基于ja-netfilter的插件。
https://github.com/googleweb/loader/releases/tag/1.0.4
2022-11-12 19:36
1
雪    币: 5
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
GUI既然重写了,那给你个新的注册思路. agent启动自动检测注册表并写入license到注册表.就不用GUI了.
license相关注册表需要写入两个key

var burpProduct = 1; // 1==DESKTOP, 2==ENTERPRISE
var burpUser = "xxx";
var licenseId = getRandomString();

var preferences = Preferences.userRoot();
var burp = preferences.node("/burp");

// write generate license to regedit
var licenseKey = String.format("license%s", burpProduct);
var generateLicense = generateLicense(burpUser, licenseId);
burp.put(licenseKey, generateLicense);

// write generate license response to regedit
var generateRequest = generateRequest(licenseId);
var generateResponse = generateResponse(generateRequest);
var licenseResponseKey = Base64.getEncoder().encodeToString(MD4.digest(licenseId.getBytes()));
burp.put(licenseResponseKey, generateResponse);

preferences.flush();
2022-11-19 14:13
2
雪    币: 4014
活跃值: (5665)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
mb_zjwuturb GUI既然重写了,那给你个新的注册思路. agent启动自动检测注册表并写入license到注册表.就不用GUI了. license相关注册表需要写入两个key var burpProduct ...
gui是自定义的用户名的,写到代码里不方便其他人修改了
2022-11-19 16:25
0
雪    币: 3366
活跃值: (1353)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
15

请教一下 当前版本的Burp 通过ClassFileTransformer导出的有的类是有问题的,如果想复原这些有什么办法没?我看源码是直接忽略掉那些asm不能解析的异常类来着了。这些异常的类我导出来看了一下他的部分元素还有,jdk 1.6写的,但是后面的根本就看不到了,都是一些乱码,以及大小也不对感觉是加密截断掉了。

==== update =====

似乎是干扰或者废弃的类,我直接return new byte[0] 丝毫不影响程序运行,好奇怪怎么会有这么多这样的奇怪的类,晚些我用btrace再定位一下看看为啥会有这种没有用的类。

最后于 2022-12-4 16:33 被CRoot编辑 ,原因: 增加结果
2022-12-4 13:15
0
雪    币: 4014
活跃值: (5665)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
CRoot 请教一下 当前版本的Burp 通过ClassFileTransformer导出的有的类是有问题的,如果想复原这些有什么办法没?我看源码是直接忽略掉那些asm不能解析 ...
return byte[0]和return null的效果是一样的吧,都是不修改吧。你也是厉害,直接看16进制数据,不是乱码才怪。
2022-12-4 21:51
0
雪    币: 3366
活跃值: (1353)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
17
guduzhe return byte[0]和return null的效果是一样的吧,都是不修改吧。你也是厉害,直接看16进制数据,不是乱码才怪。

官方文档说的是 a well-formed class file buffer (the result of the transform), or null if no transform is performed. 我认为byte[0] 在java中是不等于null的,不过我还需论证一番。以及 为何看16进制 是因为这个class文件有问题,无法正常解析。你可以看一下class的文件结构就明白为何我说他是乱码了。

最后于 2022-12-5 09:59 被CRoot编辑 ,原因: 补充
2022-12-5 09:58
1
雪    币: 698
活跃值: (2365)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
CRoot guduzhe return byte[0]和return null的效果是一样的吧,都是不修改吧。你也是厉害,直接看16进制数据,不是乱码才怪。 ...
你可以试试cfr,或者Bytecode-Viewer,都是开源的,后者可以看asm
2022-12-6 13:11
1
雪    币: 3366
活跃值: (1353)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
19
ny0c 你可以试试cfr,或者Bytecode-Viewer,都是开源的,后者可以看asm

非常感谢,那些类我认为应该是废弃的类了,似乎不影响破解以及功能实现

        @Override
        public byte[] transform(ClassLoader classLoader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {

            if (className.startsWith("burp/") && classLoader.getClass().getName().startsWith("burp.")) {
                ClassReader classReader = new ClassReader(classfileBuffer);         <====在这里你增加try catch可以看到好多不可识别的 直接Catch Exception即可
                if (classReader.getSuperName().equals("java/lang/Object")) {
                    ClassWriter classWriter = new ClassWriter(classReader, ClassWriter.COMPUTE_FRAMES);
                    SkipValid skipValid = new SkipValid(classWriter);
                    classReader.accept(skipValid, ClassReader.EXPAND_FRAMES);

                    return classWriter.toByteArray();
                }
            }
            return classfileBuffer;
        }

变成

        @Override
        public byte[] transform(ClassLoader classLoader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {

            if (className.startsWith("burp/") && classLoader.getClass().getName().startsWith("burp.")) {
            try{
                ClassReader classReader = new ClassReader(classfileBuffer);
                if (classReader.getSuperName().equals("java/lang/Object")) {
                    ClassWriter classWriter = new ClassWriter(classReader, ClassWriter.COMPUTE_FRAMES);
                    SkipValid skipValid = new SkipValid(classWriter);
                    classReader.accept(skipValid, ClassReader.EXPAND_FRAMES);

                    return classWriter.toByteArray();
                }
            }
            }catch (Exception e){ e.printStackTrace();}
            return classfileBuffer;
        }

即可看到大量的不可解析类的出现


有时间打算研究学习尝试一下动态调试 跟一跟这些成因,个人猜测应该是历史遗留问题。等周末或者晚上卷卷看了~

最后于 2022-12-6 14:21 被CRoot编辑 ,原因: 补充
2022-12-6 14:19
1
雪    币: 1027
活跃值: (251)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
20
谢谢楼上诸位大佬的分享。
2022-12-6 18:34
0
雪    币: 144
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
多谢分享
2022-12-6 19:04
0
雪    币: 220
活跃值: (100)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
v2022.12.5也適用,謝謝分享
2022-12-22 18:22
0
雪    币: 4
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
mb_zjwuturb GUI既然重写了,那给你个新的注册思路. agent启动自动检测注册表并写入license到注册表.就不用GUI了. license相关注册表需要写入两个key var burpProduct ...

想请教一下generateRequest()函数的实现细节,request除了licenseId 另外2个字段(第0位和第3位)应该如何生成

最后于 2022-12-30 19:55 被mb_xfmbdjwv编辑 ,原因:
2022-12-28 18:11
0
游客
登录 | 注册 方可回帖
返回
//