2010-12-14 16 views
2

後に奇妙な結果が、それは私がJD逆コンパイラを使用する場合、それはこのようなセグメントを示していることをいくつかのクラスが含まれていますのJava:私は奇妙なjarファイルを持って逆コンパイル

public final void a(ak aa) { 
    this.jdField_a_of_type_Ak = aa; 
} 

public final void a(cn ccn) { 
    this.jdField_a_of_type_Cn = ccn; 
} 

public final cN a() { 
    return this.jdField_a_of_type_CN; 
} 

public final void a() { 
    super.b(); 
} 

public final boolean a() { 
    return this.jdField_a_of_type_Boolean; 
} 

私は疑問を理由/コンパイラ/難読化することができます製品は、クラスのバイトコード、私はメソッドの署名を意味します。 obfuscatorがこれを行うことができることを誰かが知っていましたか?

+0

あなたは5つの方法を示しました。どの方法の署名が気になりますか? –

+2

オーバーロードされた返品の種類について質問していますか? –

+0

最後に3つの 'return'型がメソッドのシグネチャに含まれていないので、これらのメソッドは重複しています。 – secmask

答えて

6

as @Joachim Sauer correctly points out:JVM仕様では、バイトコード内のメソッドオーバーロードの制約がJavaプログラムよりも少なくなっています。 JVM Specification (Section 4.6, Methods)から

1つのクラスファイルではありません2つの方法が同じ名前と記述を有することができる(§4.3.3)。

とメソッドの記述は、戻り値の型は、(4.3.3 Method Descriptors

MethodDescriptor:
        (ParameterDescriptor*) ReturnDescriptor

、あなたの質問に記載された方法はすべて明確な記述子を持っているが、彼らは大丈夫です:

public final void a(ak aa)  ->  (Lsomepkg1/ak;)V 
public final void a(cn ccn) ->  (Lsomepkg2/ccn;)V 
public final cN a()   -> ()Lsomepkg3/cN; 
public final void a()   -> ()V 
public final boolean a()  -> ()Z 

これは、難読化ツールによって巧みに悪用されています。有効なバイトコードプログラムには、 "直接対応する" Javaプログラムが存在しません。例えばProGuardはこれを行います。ここでは、そのマニュアルからの抜粋です:難読化しながら、

-overloadaggressively

は、積極的なオーバーロードを適用するように指定します。引数と戻り値の型が(引数だけでなく)異なる場合、複数のフィールドとメソッドは同じ名前のを取得できます

たとえば、jsrバイトコード命令を使用するか、Java言語の予約語である変数識別子を使用する類似の手法があります。 Hereは、いくつかのテクニックを掲載したWebページです。


明白なフォローアップの質問に答えるには:JVMは、コールサイトでどのメソッドを呼び出すかをどのように知っていますか?

invoke-instructionsでは、呼び出される完全なメソッドシグネチャ(メソッドの戻り値の型を含む)への参照を指定する必要があります。

1

... obfuscatorはそのようなメソッド名/シグネチャを生成します。 obfuscatorはこの目的のために働くべきです。

6

Javaバイトコードは、Javaソースコードで無効な構文をサポートしています。難読化者は、バイトコードを変更してこれらの構造を使用することでその事実を利用します(まだ難読化されていないバイトコードと同じ結果を与えます)。

+0

あなたはこれを行うJava obfuscatorソフトウェアに名前を付けることができますか? – secmask

+0

@secmask、ProGuardはこれを行います。私の答えを見てください。 – aioobe

1

クラスはデバッグ情報なしでコンパイルされています(少なくともローカル変数情報はありません)。後でわかりにくくなります。

基本的な難読化戦略の1つは、(ほぼ)すべてのパッケージ、クラス、メソッド名を新しい、無意味な名前で置き換えて、逆コンパイルされたコードを理解できないようにすることです。

追加の戦略は、文字列を難読化し、Javaコードに逆コンパイルできないバイトコード構造を追加することです。

難読化されたクラスファイルと同等のJavaソースを作成することはできますが、大変な労力を要します。

関連する問題