9

私のアプリの有料版では、実装が簡単で、開発者コンソールで個々の統計を使用できるため、アンロック アプリ ルートを選択していますが、主に 2 つのコード ベース (無料版用と別の有料版)。私が CVS を使用したとしても (私はそうしています)、機能のマージとバグ修正を続けるのは依然として骨の折れる作業です。ロック解除アプリは、全体的に実装がはるかに簡単です...

しかし、これには重大な欠点が伴います。セキュリティ チェックをオーバーランするのは非常に簡単です。ここで何かが欠けていない限り。

私が何をしても、そのような実装は常にif次のような単純なものになります。

if(Program.isPremiumVersion()) {
    // Remove ads...
}

メソッドは、isPremiumVersion()証明書が一致するかどうかなど、有料のロック解除アプリのインストールをチェックするすべての作業を担当するものです。はい、ロック解除アプリは LVL によって保護されています (ただし、LVL がいかに安全でないかについて言及している記事をいくつか読みましたが、それは今のポイントではありません)。しかし、最終的には、内部のコードがどれほど複雑にisPremiumVersion()なっても、常にtrueまたはfalse値が返されます。

このようなセキュリティ機能をオーバーライドするには、コードをリバース エンジニアリングして、常に を返すようにするだけtrueです。そうじゃない?Android アプリをこれから保護するにはどうすればよいでしょうか? はい、コードは ProGuard で難読化されています。それでも、十分に熟練した人にとっては難しすぎるべきではありません.

クラッカーと戦おうとしているわけではないことに注意してください。単に勝つことはできません。「完璧な解決策」に数え切れないほどの時間を浪費して、これで眠りを失うつもりはありません。少しでも安心できる方法を模索中です。少なくとも理論的には、これをクラックするのはとても簡単に思えます。私は間違っていますか?

そのような機能のセキュリティを向上させるためのアイデアはありますか?

4

2 に答える 2

7

これを回避する簡単な方法はありません。

あなたはそれをマスクしようとしなければなりません。いくつかのヒントを次に示します。

ヒント 1:ブール値を返すのは明白すぎます。値 (int など) を返してみてください。次に、比較を使用して、それが有効な既知の戻り値であるかどうかを確認します。

例: プレミアムかどうかを判別できる何かを含む文字列の md5 を取得します。各アプリに静的な最終文字列があるとします。1 つの md5 が 9 で始まり、もう 1 つが 1 で始まる場合があります。この場合、md5 を計算し、それが他の 2 つの数値の間にあることがわかっている「乱数」よりも大きいかどうかを確認します。「プレミアム」の md5 が 987 で、「無料」の md5 が 123 だとします。md5 を計算して 456 と比較できます。

ヒント 2 - さらに良い: いくつかのコードを複製し、(456 の代わりに) 毎回異なる値を使用してください! これにより、難読化されたコードのデコードがより困難になることを願っています。

これらすべてのチェックが最終的にブール値にマップされる (if(1 > 2)に評価されるif(true)) ことはわかっていますが、アプリのリバース エンジニアリングはより困難になるはずです。

ヒント 3 : 最も明白な場所で「isPremium」のチェックを実行しないでください。たとえば、アプリの起動時にチェックを実行しないでください。これは、実行する最も明白な場所です。アプリのバージョンによっては、条件付きロジックを使用する場合、特定の明白なスポットを回避するのが難しい場合がありますが、ここで最善を尽くしてください!

ヒント 4:アプリをビルドして難読化する。apk に対してリバース エンジニアリング ツールを実行します。それを読んで、それがどのように見えるかを見てください。

最後に、毎日の朝食時に Google IO のプレゼンテーションをご覧ください: Evading Pirates and Stopping Vampires using License Verification Library, In-App Billing, and App Engine

[編集 - いくつかのヒント]

ヒント 6:使用するコードを使用して、完全に有効な場所をチェックインしてみてください。これは、そこで実際に何をしているのかを偽装する可能性があります。これには、コードを呼び出してアプリのバージョンを確認することも含まれますが、意味のあることは何もしません。または、前の例で、md5 を 012 または 999 と比較して、これらの変数の実際の使用を希釈するだけです。

ヒント 7:単一の文字列に依存する代わりに、実行時に文字列を作成することを検討してください。ファイナルとスタティックもあまりにも注目を集める可能性があるため、それらを避けることは良いことかもしれません.

ヒント 8: Google チュートリアルで提供されている LVL コードを使用ないでください。修正してください。多くの!

注:これらのヒントのいずれかが実際に大きな違いを生むかどうかはわかりませんが、少なくともクラッカーの生活を少し難しくする可能性は十分にあります。

于 2012-05-10T21:54:15.297 に答える
1

すでにこれを見たことがあるかもしれませんが、ここにあなたが話していることを実装するためのいくつかのコードがあります:

http://groups.google.com/group/android-developers/browse_thread/thread/4ad3d67f735f16d7/948b4f9eee2490a3?pli=1

無料アプリとロック解除アプリの署名が同じであることを確認します。そのため、署名が異なるため、誰かが正しい名前で人工的にアプリを作成することはできません。ただし、人々が電話からapkをはぎ取って配布することは依然として可能です. これに対抗する唯一の方法は、ある種のサーバー認証を使用することですが、これにはコストと複雑さが追加されます.

于 2012-05-10T18:11:14.030 に答える