使用ASM重新排列GOTO [JAVA]

时间:2013-08-16 18:54:50

标签: java obfuscation bytecode

我正在查看一个混淆的应用程序,该应用程序似乎有很多我要重新排列或删除的GOTO

问题是,我该怎么做呢?

for(final MethodNode mn : classNode.methods) {
            final BIF is = new BIF(mn); //BIF is my bytecode instruction finder
            AbstractInsnNode ain;
            while ((ain = is.next()) != null) {
                if (ain instanceof JumpInsnNode && ain.getOpcode() == GOTO) {
                    final JumpInsnNode jump = (JumpInsnNode) ain;
                    mn.instructions.remove(jump);
                    removed++;
                }
            }
        }

所以我尝试将它们全部删除,但它似乎不起作用,我不知道如何重新排列它们

1 个答案:

答案 0 :(得分:1)

我认为你不能轻易解决这个问题,它看起来像是一个非常激进的混淆机制。您可以尝试取消转到它,通过对goto跳转之间的块进行碎片整理来线性化代码。但是,有些goto是合法的流量控制跳转,所以你需要一种方法来检测它。这看起来像是一个真正的挑战,需要花费大量时间。但是,也许挑战足以推动前进:)