某括号的游戏还在进行中

书接上回

https://reajason.com/writing/rainbowbracketscracked

承蒙厚爱,论坛有 hxd 找到了我发在博客上的文章分享在了论坛,而且一直在用始皇的 agent 玩 JetBrains 全家桶,于是我加入了论坛,最近听说某括号升级了,我的脚本那是嘎嘎不行,好了升级的话那就都升级吧。(感谢始皇创建了这么好的论坛,嘎嘎喜欢:heart:

打开 jadx

我们发现在判断是不是 cracked 的时候多了一个函数(上篇文章的时候只有前面两个)

跟进去发现,把这个判断给前置了,我记得之前是在后面的(两个变量名的方式获取就是 debug,如何 debug 博客文章中说了,这儿直接给出源码)

private static boolean ۊథ() {
    try {
        Field field = Class.forName("jdk.internal.org.objectweb.asm.Type").getDeclaredField("VOID");
        field.setAccessible(true);
        return field.getInt(null) == 0;
    } catch (Exception var1) {
        return false;
    }
}

尝试破解

做法是依旧暴力哈,直接在 Class.forName 调用处,如果发现传了一个 jdk.internal.org.objectweb.asm.Type 直接抛出异常不让这个函数正常运行。

 agentBuilder.type(ElementMatchers.named("java.lang.Class"))
                .transform(((builder, typeDescription, classLoader, module, protectionDomain) ->
                        builder.visit(Advice.to(ClassForNameInterceptor.class).on(ElementMatchers.named("forName")))))
                .installOn(inst);

public static class ClassForNameInterceptor {
        @Advice.OnMethodEnter
        public static void interceptorBefore(@Advice.AllArguments Object[] args,
                                             @Advice.Origin("#m") String methodName) {
            if ("jdk.internal.org.objectweb.asm.Type".equals(args[0])) {
                throw new RuntimeException("asm 用来修改字节码的");
            }
        }
    }

打包地址:Release rainbow-brackets-2024.2.3 · JAgentSphere/bytebuddy-agent-demo · GitHub
使用方式:像挂载 ja-netfilter 一样挂载当前包,不过需要注意得放在它的上边,不能放下面

-javaagent:/Users/reajason/ReaJason/jetbra/rainbow-brackets-cracked.jar
-javaagent:/Users/reajason/ReaJason/jetbra/ja-netfilter.jar=jetbrains

欢迎学习交流 :tada:

35 个赞

感谢大佬分享

5 个赞

感谢大佬,又可以愉快的升级了

5 个赞

感谢分享,先留存有空再研究!

5 个赞

看起来很厉害,膜拜一下

5 个赞

律师函警告 :upside_down_face:

4 个赞

既然他每个版本都升级,那么我们为什么不直接爆破他每个版本的jar文件呢。

直接改boolean返回值。

13 个赞

每个版本发布的时候都会做一次混淆,类名和方法名都改了,直接基于方法名去修改返回值,每发布一个版本都需要进行维护,不太方便。

7 个赞

作为插件感觉更方便:实现一个简单的ja-netfilter插件-也许对某些插件有用,有更新

5 个赞
  1. 不会,我看了他的代码,在 Class.forName 的时候使用了堆栈判断,获取堆栈在 Agent 行为检测中是一个非常耗时的动作,而且在这种常见的方法上,我这个使用的参数判断直接一点。

  2. 轻量的话,你可能比较的是包的大小,确实 bytebuddy 相较于 asm 是比较大,但是 hook 加进去的字节码相差不大,他们的执行效率只在字节码修改上的差异,实际上还是看使用者如何编写的 hook 回调的性能,使用 butebuddy 的目的还是为了对于初学者隐藏字节码修改的细节,会让初学者比较愿意接触代码

10 个赞

感谢大佬

4 个赞

有空研究一下,感谢大佬

4 个赞

感谢大佬的分享,收藏学习

3 个赞

厉害:+1:

3 个赞

获取堆栈确实耗时, 但是为了避免误伤我认为是值得的

6 个赞

现在这种方式他每次针对ja,还是要哪个版本逆向、更新啊 :joy:

4 个赞

强的一

嗯呢,实际使用过程中,没感觉就没啥影响

Mark下,有空研究研究,谢谢大佬分享

哈哈哈,我干的,希望不要介意,先看了到你的博客,刚好当时论坛插件被括号做了激活时间限制,就把你的博客分享了 :joy:

1 个赞