そのため、apkだけでアプリケーションを変更するタスクがありました。 また、アプリケーションを逆コンパイルした人は、後でコンパイルすることがどれほど難しいかを知っています。
逆コンパイル
Androidには、次のユーティリティがあります。
- リソースの逆コンパイル用のApkTool 。
- dexをjarに変換するDex2Jar 。
- jarからソースを取得するためのJD-GUI 。
- また、 JADをお勧めします。一部の場所はJD-GUIよりも適切に逆コンパイルされています。
インターネットでの使用に関する十分な情報があります。
逆コンパイル後にアプリケーションをビルドしようとすると、エラーのためにコンパイルされない可能性が高く、サイクルと条件は特に逆コンパイルが困難です。 一部のエラーは簡単に修正できますが、多くの条件付き遷移を把握するのは容易ではありません。その数が100から数千に達すると、アプリケーションを復元するこの方法は無効になり、最初からやり直すのが速くなります。
これにより、逆コンパイルで実験を終了することができましたが、怠inessが進歩の原動力であり、新しい方法が生まれました。
クラスのオーバーライド
だから、jarはライブラリなので、なぜそれを新しいプロジェクトに接続しないのですか? libsフォルダーにドロップし、メインアクティビティから継承してコンパイルします。 すべてが機能しますが、主なことはクラス名が一致しないため、パッケージ名は異なる必要があります。そうでない場合は、少なくとも生成されたBuildConfigとRです。
このようにして、Activity、Service、BroadcastReceiver、および場合によってはマニフェストで宣言された他のクラスから継承できます。マニフェストでは、新しいクラス名も指定する必要があります。そうでない場合は使用されません。
仮想関数を再定義できるようになりましたが、特にfinalキーワードでは、これを実行して継承することもできないため、先に進みます。
クラスの置き換え
jarライブラリを解凍すると、クラスファイルが取得されます。これらはコンパイルされたクラスです。プロジェクトをビルドするとき、bin / classesフォルダーには同じクラスファイルが含まれていることに注意してください。
すべてがそれほど単純ではないため、最初にプロジェクトをコンパイルする必要があります。 ソースアプリケーションのクラスを使用するには、何らかの方法でプロジェクトにアタッチする必要がありますが、エクスポートはしないでください。 これは単純に行われます:libsフォルダーから、Eclipseはライブラリー自身をエクスポートするので、jarライブラリーをlibフォルダーに移動し、プロジェクトに接続します。EclipseではProject-> Preferences-> Java Build Path-> Libraries-> Add Jars ...そしてOrder and Exportタブライブラリをエクスポートする必要がないため、チェックボックスがインストールされていないことを確認する必要があります。すべてがクラスファイルにあります。
ここで、逆コンパイルされたアプリケーションソースからいくつかのクラスを取得し、その中のコンパイルエラーを修正し、たとえば、使用されている新しいクラスであることを示すダイアログを追加します。 次に、プロジェクトをクリーンアップします。Eclipseで[プロジェクト]-> [クリーン]を選択し、クラスファイルをbin / classesフォルダーにコピーし、プロジェクトを収集するとすべてが機能します。
プロジェクトの次のビルドでは、クリーンアップする必要がないため、この方法を使用すると非常に便利です。 逆コンパイル後のエラーの修正を容易にするために、JD-GUIとJADから取得したソースを使用しました。通常はこれで十分です。
しかし、今はリリースバージョンをまとめる時です。もちろん、難読化ツールが使用されており、クラス名と未解決の参照の一致に関する数百のエラーが発生します。 コンパイルされたクラスファイルから置き換えられたクラスを削除します。その後、エラーは発生しません。 リリースアセンブリのもう1つの不快な機能は、毎回プロジェクトをクリーンアップしてクラスファイルをコピーする必要があることです。そうしないと、どこかに消えてしまいます。
おわりに
変更可能なファイルのみがこの方法で逆コンパイルされ、コードのすべての部分が逆コンパイル-修正-コンパイルのプロセスを受けるため、すべてのソースでエラーを修正する必要がなくなり、信頼性が向上します。
元のアプリケーションのすべてのトレース、アクティビティやサービスなどのフォーカスされていないクラスの名前、およびそれらのパッケージの名前は、変更されたアプリケーションの逆コンパイル後に残り、利用可能になる可能性が非常に高くなりますが、海賊版の場合、これは保護する価値がある理由ですアプリケーション、保護方法は、コード変更に対する他の保護方法と似ています。
jarのクラスを更新する -クラスを置き換えるという考えは、jarライブラリのこの機能から生まれました。