61

proguard を使用して Android コードを難読化し、逆コンパイルしました。詮索好きな目から隠したい文字列がたくさんあります。私が自分のコードを逆コンパイルしたとき、文字列はそこにあり、誰もが見たり変更したりできました。文字列の 1 つは私のライセンス サーバーへの URL であり、事実上、偽のサーバーを指すように URL を変更する可能性があります (サーバー コードを一般に公開するため)。この種の情報を隠す最善の方法は何ですか?

また、R クラスの文字列はすべて乱数であることに気付きましたが、逆コンパイルされたコードでは R クラスが見つかりません。それはどこにある?

私が見る敵の例new SimpleCursorAdapter(localActivity, 2130903058, localCursor, arrayOfString, arrayOfInt);

2130903058 はレイアウト ファイルですが、何を参照していますか? 何らかのアドレスを指していない限り、数字は何の意味もありません。

4

7 に答える 7

34

安全ではなく不明瞭に満足していると仮定すると、使用できるメカニズムはたくさんありますが、proguard のような難読化ツールは役に立ちません。

これを実現するには、自分で文字列のエンコードまたは暗号化を行う必要があります。使用するアプローチは、防御しようとしているものによって異なります。明らかな検査から隠そうとしている場合は、エンコードで十分な場合があります (android を参照)。 .util.Base64、http: //developer.android.com/reference/android/util/Base64.html )。エンコーディングは安全ではなく、サイトへの明白な参照を削除するだけであることに注意してください。

さらに何かを防御しようとしている場合は、実際に文字列を暗号化することに移行できます。これを行うには、javax.crypto.Cipher、http: //www.androidsnippets.org/snippets/ を介して AES などの対称暗号を使用します。 39/index.htmlは適切な使用例を提供します。繰り返しますが、これはハッカーにとってより面倒であり、安全です.jar のどこかにキーを保存する必要があるため、暗号化されたセキュリティが無効になります.

これを明確にするために、基本的な手順は次のようになります。

  1. 既知のキーを使用して暗号化文字列を手動で作成します。
  2. この文字列の復号化されたバージョンを使用するようにコードを変換します。例:

前:

public class Foo {
    private String mySecret = "http://example.com";

    ...
}

なる:

public class Foo {
    private String encrypted = "<manually created encrypted string>";
    private String key = "<key used for encryption";
    private String mySecret = MyDecryptUtil.decrypt(encrypted, key);

    ...
}

これらすべてに代わる (良い) 方法は、Google が提供するライセンス サーバーhttp://android-developers.blogspot.com/2010/07/licensing-service-for-android.htmlなどのサード パーティの drm ソリューションの使用を検討することです。これは、自分でロールするものよりも安全かもしれませんが、上で説明したものと非常によく似た制限があります。

于 2010-12-13T09:32:57.033 に答える
26

こんにちは、みんな。

  1. secret非表示にしたいテキストにしましょう

  2. debug/release.keystore のキーハッシュを見つけます。k1この鍵としましょう。

(ツール keytool+openssl: を使用keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 )

  1. ツール(Androidコードの外部)を使用して暗号化secretしますk1

    encrypted = encode (secret, k1)

(例: https://jwt.io、Java の場合: https://github.com/jwtk/jjwt )。

  1. あなたのAndroid Javaコードに書き留めてくださいencryptedencryptedのデコードされたバージョン(これは元の)が必要な場合は、secret書き込みます

original = decode(encrypted, get_my_keyhash_programmatically() )

それで全部です。これsecretは、元のコードが Java ソース コードに表示されておらず、k1デコードもされていないためです。また、ハッカーが復号化されたシークレットを出力したい場合は、コードを変更して再コンパイルしなければならず、.apk に自分のものではない独自のキーストアで署名する必要があるため、正しい元の .apk を取得できません secret。(「唯一の」ポイントはk1、元の.apkから把握できるかどうかです)。

注: get_my_keyhash_programmatically():

try {
    PackageInfo info = getPackageManager().getPackageInfo(
            "el nombre de su paquete por ejemplo com.tarea.u8",
            PackageManager.GET_SIGNATURES);
    for (Signature signature : info.signatures) {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
    }
} catch (PackageManager.NameNotFoundException e) {

} catch (NoSuchAlgorithmException e) {

}
于 2016-02-23T11:48:45.590 に答える
9

私がしたことは、グローバル ユーティリティ クラスに静的文字列の長いリストを作成することでした。文字列の長いリストのどこかに、パスキーを複数のチャンクに入れました。

私のコードでは、実際のパスキーが何であるかを簡単に確認できますが、難読化ツールが機能するようになると、すべての静的要素に A、B、C などの名前が付けられ、それ以上簡単に見つけることができなくなります。

于 2011-03-08T03:35:53.357 に答える
1

「Just another Perl hacker」でググってください。これらは、難読化されたコードで文字列を出力するプログラムです。ネット上には Perl 以外の言語の例もたくさんあります。

ウィキペディアのエントリ

于 2010-12-13T10:18:43.893 に答える
-1

DexGuardを使用して文字列を暗号化できます。おそらく手動で行うよりも効果的で、ソース コードに負担をかけることもありません。

于 2016-02-20T00:28:45.830 に答える