2012-07-29 34 views
11

私はちょうどうんざりしていました。私はdex2jar http://code.google.com/p/dex2jar/をダウンロードし、Javaの逆コンパイラJD-GUI http://java.decompiler.free.fr/?q=jdguiAndroid Apkの逆コンパイルは簡単だと思われます。

を私は自分 APKファイル得た(密封された署名を、そしてGoogleでプレイ)、ジャーリポジトリにそれを作るためにdex2jarを使用しました。

コマンドライン(Windowsユーザーは.BAT、皆.SHを使用):

d2j-dex2jar.bat -f MyAwesomeApp.apk 

私はドラッグ&ドロップ出力をJD-GUIに、そしてすべてのクラスファイルは、元のコードが再び現れました。 私はちょっとびっくりしました。私のjava/Androidコードはこれを公開していますか?デコンパイルして簡単に再生成できるのであれば、ProGuardはどのように私のAPKを保護していますか?それはまったくわかりにくいとは思われません。

ありがとうございます。

+1

を!あなたはあなたのapkにproguardを適用していませんか?答えがいいえ、それはあなたの答えです! :) – t0mm13b

+0

私はProguardを使い、relの前にproject.propertiesファイルを編集して、私のアプリケーションを楽にしました。クラス名は私のオリジナルではありませんが、すべてのメソッド名は元のようです。私。クラス名だけが変更されているので、私のアプリを逆にするのは簡単です。編集:また、静的メソッド名が変更されているようです。しかしこれを逆転することは、ロケット科学ではほとんどありません。 –

+1

proguard.cfgを投稿できますか? [examples](http://proguard.sourceforge.net/index.html#manual/examples.html)をチェックしてください – t0mm13b

答えて

4

難読化者は、通常、クラス、メソッド、およびフィールド名を意味のない名前に変更するだけです。だから、あなたが "ScoreCalculator.computeScore(Player p、Match m)"を持っていれば、 "A.zk(F f、R r)"になります。これは、javascriptでソースの長さを減らすことを除いて、UglifyまたはClosureコンパイラがjavascriptに対して行うことと似ています。

とにかく方法が何であるかを理解することは可能ですが、それはもっと難しいことです。

また、Javaはレイトバインディング(DLLまたはSOファイルとして)を使用します。したがって、あなたのコードの外側にある呼び出し(java.util、java.langなどのパッケージのような)を難読化することはできません。また、コードが外部からの呼び出しを受け取る必要がある場合(典型的な例では、ボタンのリスナーを登録する)、そのコードを難読化することはできません。 DLLの外部でフォームと呼ばれる必要があるメソッドの名前と他のDLLを呼び出すことができるDLLについても同じことが起こります。

ただし、特定のソースコードとコンパイル済みコードの間のマッピングは、必ずしも1対1ではありません。以前のCコンパイラは、特定のソース指令に対して同じオペコードを生成するために使用されていたので、デコンパイラは非常に効果的でした。次に、Cコンパイラは、結果として得られるオペコードに多くの最適化を追加しました。これらの最適化はほとんど無効です。[1]

さまざまなプラットフォーム(さまざまなアンドロイドデバイスを含む)で動作するため、Javaはコンパイル時にJavaは実行中のデバイスのアーキテクチャとハードウェアのプロパティに基づいて、実行時に後で深刻な最適化を適用することにしました(これは「HotSpot」がほとんど[2]です)。

良いobfuscatorは、通常、バイトコードの命令を並べ替えたり、無駄なものを挿入したり、逆コンパイラがソースコードを簡単に派生させることができないようにするためのいくつかの最適化を前もって適用します。

このテクニックは、バイトコードを読むことができる人にとっては無意味です。可能であれば、Cの難読化は、人がアセンブラコードを読むことができれば無意味です。

多くのクラッキングソフトウェアが示すように、リバースエンジニアリングは、ファームウェア(iPhoneファームウェアについて考える)であっても、Cなどの遅れでも常に可能です。コードが実行されているクライアントが常に信頼できず、と。

非常にミッションクリティカルなコードがあれば、誰かが盗む可能性のある価値のあるものがあれば、サーバー側で実行するか、何らかの理由でサーバー側で検証することをおすすめします。

関連する問題