重构java字节码

时间:2013-12-25 17:01:22

标签: java java-bytecode-asm bytecode-manipulation

我试图用一个混淆的jar替换我自己的某个类文件。原始类文件具有名为“new”和“null”的方法,因此快速反编译+编译不起作用。 我尝试编译并使用jbe添加名为“new”的新方法,将所有内容转发到“new_symbol”函数(new_symbol是原始“new”函数的反编译版本)。 这没用。 (“代码段在类文件中的长度错误”)

有没有人知道在类文件中折射方法名称的方法?如果那是不可能的,那么可靠地创建那些“代理功能”的方法呢? 从谷歌我了解到,大约有1000多个不同的后端库,但只有jbe作为字节码编辑的前端?

修改 让我试着说明一下。 假设有一个带有类的jar文件,该类提供了一个函数,可以将您提供给它的所有内容记录到数据库中。 我想用自己的类替换该类文件,它不仅应该将所有内容记录到数据库中,还应该将它获取的任何数据打印到命令行。

问题是,该类文件被混淆,并且混淆器为其提供了公共方法名称,如“new”或“null”。如果您尝试:

public class replacement{
public void new (string data){
...
}
}

编译一下,就会出现编译错误。

我的想法是创造这个:

public class replacement{
public void newsymbol (string data){
...
}
}

使用字节码编辑器创建一个名为“new”的函数,该函数使用相同的参数调用“newsymbol”。 (但是我得到“代码段错误长度”以及其他错误沿着这条路线走。

因此,我的问题可以更好地理解为“给我一种方法来拦截对类文件的调用,该类文件的公共方法被命名为”new“”null“”weird_unicode_symbols“”....

2 个答案:

答案 0 :(得分:1)

如果您使用`围绕标识符,则Scala允许您在名称中使用标识符。

class f{
    def `new`():Int = {
        return 3
    }
}

jd-gui输出

import scala.reflect.ScalaSignature;

@ScalaSignature(bytes=/* snip */)
public class f
{
    public int jdMethod_new()
    {
        return 3;
    }
}

我假设jdMethod_加前缀以使标识符有效。使用十六进制编辑器查看类文件时没有jdMethod_

但是,当您需要使用公共字段时,这确实存在缺陷; scalac从不生成公共字段,它总是将它们设为私有并创建访问器。

答案 1 :(得分:0)

所以,对我来说最好的解决方案是使用十六进制编辑器(如user60561所建议的那样)。

显然,每个函数和字段的名称只在类文件中保存一次,因此如果使用具有相同字节数的名称,则可以使用hexedit来获得胜利。 对我来说,它取而代之的是用“abc”替换“new”和用双字符序列替换每个奇怪的unicode字符。

感谢所有建议。