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