1

呼び出し元メソッドのメソッド シグネチャを見つけようとしています。私が書いているコードが難読化され、多くのメソッドがオーバーロードされるため、これを行う必要があります。シグネチャを持つ特定のメソッドからの呼び出しを無視しようとしています 現時点では、私のコードは次のようになっています

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;
}

誰でもこれで私を助けることができますか?ありがとう

4

3 に答える 3

0

asmライブラリを使用してみてください。あなたの投稿に関連していると思います。読んで例を見つけて、投稿してください。

于 2012-06-10T13:37:19.380 に答える
0

コンパイル時のウィービングで AspectJ を使用できる場合があります。呼び出し元が displayGuiScreen メソッドの場合は、アドバイスを回避して何もしないようにすることができます。これは、クラスを呼び出すすべてのコードをコンパイルする場合にのみ機能します。難読化の前にメソッドのすべての呼び出し元に対して行う必要があるため、コンパイル時のウィービングが必要です。次のようなことができるはずです。

aspect IgnoreCallsFromDisplayGuiScreen {
    void around(): call(void MyClass.myMethod()) && withincode(void Minecraft.displayGuiScreen()) {
        return;
    }
}
于 2012-06-10T13:53:11.573 に答える
0

まず、コードが難読化されずに機能することを確認します。

次に、難読化プログラムの出力である難読化マップを見つけます。

3 番目に、マップに詳細が示されているように、難読化ツールが新しいメソッド シグネチャと一致するように文字列を更新したことを確認します。オッズは、クラス名とメソッド名が変更されただけです。

一致するものがない場合は、難読化ツールでリフレクション呼び出しのように見える文字列を書き換えるオプションを探すか、asm を使用して、更新されなかったコンパイル済みクラス内の文字列を書き換えます。

于 2012-06-10T14:00:23.987 に答える