忽略混淆代码中某个方法的调用

时间:2012-06-10 13:17:42

标签: java obfuscation stack-trace minecraft

我正在尝试查找调用方法的方法签名。我需要这样做,因为我写的代码被混淆了,很多方法都被重载了。我试图忽略来自某个具有签名的方法的调用此时我的代码看起来像这个

StackTraceElement caller = Thread.currentThread().getStackTrace()[2];
String cn = caller.getClassName();
String mn = caller.getMethodName();
if(cn == "net.minecraft.client.Minecraft" && (mn == "displayGuiScreen" || mn == "a")){ // displayGuiScreen is for non-obfuscated, a is for obfuscated. Doesn't work because 2 other methods that call it are also called a when obfuscated
    System.err.println("Skipped");
    return;
}

任何人都可以帮我吗?感谢

3 个答案:

答案 0 :(得分:0)

尝试使用asm library,我刚发现我认为与您有关,请尝试阅读并找出示例,post

答案 1 :(得分:0)

您可以将AspectJ与编译时编织结合使用。如果调用者是displayGuiScreen方法,则可以使用around advice不执行任何操作。这只有在编译调用您的类的所有代码时才有效。编译时编织是必要的,因为您必须在混淆之前和方法的所有调用者之间进行编织。你应该可以这样做:

aspect IgnoreCallsFromDisplayGuiScreen {
    void around(): call(void MyClass.myMethod()) && withincode(void Minecraft.displayGuiScreen()) {
        return;
    }
}

答案 2 :(得分:0)

首先验证您的代码是否正常工作。

其次,找到混淆映射,它是混淆程序的输出。

第三次验证您的混淆器更新了字符串以匹配新方法签名,因为它在地图中有详细说明。赔率只是班级名称和方法名称已更改。

如果您没有匹配项,请向您的混淆器查找重写看起来像反射调用的字符串的选项,或使用asm重写未编译的类中未获得更新的字符串。