2

奇妙なjarファイルがあります.JD Decompilerを使用すると、次のようなセグメントが表示されるクラスが含まれています。

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

なぜ/コンパイラ/難読化ツールがそのようなクラスバイトコードを生成できるのか疑問に思っています。つまり、メソッドシグネチャです。難読化ツールがこれを実行できることを知っている人はいますか?

4

4 に答える 4

6

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

于 2010-12-14T08:28:03.467 に答える
5

@Joachim Sauerが正しく指摘しているように、JVM仕様は、JLSがJavaプログラムに対して行うよりも、バイトコードでのメソッドのオーバーロードに対する制約が少ないです。

JVM 仕様 (セクション 4.6、メソッド)から:

1 つのクラス ファイル内の 2 つのメソッドが同じ名前と記述子を持つことはできません(§4.3.3)。

メソッド記述子には戻り値の型が含まれます: ( 4.3.3 メソッド記述子)

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 言語の予約語である変数識別子を使用したりする他の同様の手法があります。これは、いくつかのテクニックをリストした Web ページです。


明らかなフォローアップの質問に答えるには: JVM は呼び出しサイトで呼び出すメソッドをどのように認識しますか?

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

于 2010-12-14T08:38:37.493 に答える
1

...難読化ツールは、このようなメソッド名/シグネチャを生成します。それがその仕事だからです。この目的のためには、任意の難読化ツールが機能するはずです。

于 2010-12-14T08:25:09.847 に答える
1

クラスはデバッグ情報なしでコンパイルされ (少なくともローカル変数情報が欠落しています)、後で難読化されています。

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

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

難読化されたクラス ファイルに相当する Java ソースを作成することはできますが、多大な努力が必要です。

于 2010-12-14T08:32:17.027 に答える