能力值:
( LV2,RANK:10 )
2 楼
谢谢分享
能力值:
( LV4,RANK:50 )
3 楼
很酷
能力值:
( LV2,RANK:10 )
4 楼
需要优化的地方,classname判断是burp/开头的,这个还可以改成总参数loader,loader不是null,以burp.开头,这样会少很多判断,burp包下的类并不都是它自己loader加载的。再就是那个定位特征值,有的类特别大,查找起来费时,而且你是所有burp的类都检查,尽量缩小一下范围。还有就是尽量少去写字节码,做到最小侵入性,不易出错更稳定,你的des和base完全可以放到自己的java方法中,编译好,用一个字节码指令去调用就行。
能力值:
( LV3,RANK:20 )
5 楼
看loader看到的时候是jdk的,单独getname也是null,所以我没用loader作为判断,编译好后的class文件有java版本限制,所以我没这么做
最后于 2022-11-12 02:26
被ny0c编辑
,原因:
能力值:
( LV3,RANK:20 )
6 楼
发现换了哈希匹配算法之后...才提升0.1-0.3秒,感觉不是很必要换掉匹配算法,但是提升一点也是提升,还是放出来了,另loader那里的classLoader.getClass().getName()才可以拿到burp开头的,也试了下,确实是得加上classloader判断,匹配次数从1734降低到70,总体启动时间从7-8秒降低到2-3秒.
能力值:
( LV2,RANK:10 )
7 楼
不用那么复杂,可以抓住类特别大的特点,通过类的字节数组这个参数大于多少就行过滤,不必再去查询特征,计算hash啥的。
能力值:
( LV3,RANK:20 )
8 楼
guduzhe
不用那么复杂,可以抓住类特别大的特点,通过类的字节数组这个参数大于多少就行过滤,不必再去查询特征,计算hash啥的。
这个有考虑过,不过怕老版本不兼容所以就放弃这个方式过滤了.并且现在新版burp要求java11后,相比jdk8时代,代码执行上优化了许多,之前我那个findbyarray在jdk8上就很慢,jdk11后就快了许多
能力值:
( LV2,RANK:10 )
9 楼
感谢大佬分享
能力值:
( LV2,RANK:10 )
10 楼
谢谢楼主分享
能力值:
( LV12,RANK:230 )
11 楼
感谢分享
能力值:
( LV2,RANK:10 )
12 楼
已引用您的思路,并修改成基于ja-netfilter的插件。 https://github.com/googleweb/loader/releases/tag/1.0.4
能力值:
( 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();
能力值:
( LV2,RANK:10 )
14 楼
mb_zjwuturb
GUI既然重写了,那给你个新的注册思路. agent启动自动检测注册表并写入license到注册表.就不用GUI了.
license相关注册表需要写入两个key
var burpProduct ...
gui是自定义的用户名的,写到代码里不方便其他人修改了
能力值:
( LV4,RANK:40 )
15 楼
请教一下 当前版本的Burp 通过ClassFileTransformer导出的有的类是有问题的,如果想复原这些有什么办法没?我看源码是直接忽略掉那些asm不能解析的异常类来着了。这些异常的类我导出来看了一下他的部分元素还有,jdk 1.6写的,但是后面的根本就看不到了,都是一些乱码,以及大小也不对感觉是加密截断掉了。
==== update =====
似乎是干扰或者废弃的类,我直接return new byte[0] 丝毫不影响程序运行,好奇怪怎么会有这么多这样的奇怪的类,晚些我用btrace再定位一下看看为啥会有这种没有用的类。
最后于 2022-12-4 16:33
被CRoot编辑
,原因: 增加结果
能力值:
( LV2,RANK:10 )
16 楼
CRoot
请教一下 当前版本的Burp 通过ClassFileTransformer导出的有的类是有问题的,如果想复原这些有什么办法没?我看源码是直接忽略掉那些asm不能解析 ...
return byte[0]和return null的效果是一样的吧,都是不修改吧。你也是厉害,直接看16进制数据,不是乱码才怪。
能力值:
( 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编辑
,原因: 补充
能力值:
( LV3,RANK:20 )
18 楼
CRoot
guduzhe
return byte[0]和return null的效果是一样的吧,都是不修改吧。你也是厉害,直接看16进制数据,不是乱码才怪。 ...
你可以试试cfr,或者Bytecode-Viewer,都是开源的,后者可以看asm
能力值:
( 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编辑
,原因: 补充
能力值:
( LV2,RANK:15 )
20 楼
谢谢楼上诸位大佬的分享。
能力值:
( LV2,RANK:10 )
21 楼
多谢分享
能力值:
( LV2,RANK:10 )
22 楼
v2022.12.5也適用,謝謝分享
能力值:
( 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编辑
,原因: