2

サードパーティ ベンダーからいくつかのライセンス キーを取得しました。これらのキーは、外部に漏洩しないように、私のモバイル アプリケーション ( C/C++ 言語) に対して承認されています。ベンダーは、これらのキーが暗号化されていることを確認するためにコードを確認する必要があります。分解防止に。

私が得た最初の方法は、これらのキーを暗号化し(可逆暗号化方法を使用)、使用中に復号化することですが、これは最終的な解決策ではありません。極端に言えば、コードを逆にすることで復号化できます。

ベンダーは、リバース ハッシュを使用してこれらのキーを暗号化することを推奨しています (リバース ハッシュについてはわかりません)。他に選択肢はありますか (シンプルで実装は簡単ですが、逆アセンブルはより困難です)。コード内でこれらのキーを非表示にして逆アセンブルを防止できますか?

4

3 に答える 3

3

後退を難しくすることはできますが、止めることはできません。どのような暗号化を選択しても、プログラムはライセンス チェックのためにキーを復号化するため、ハッカーはプログラムからキーを取得できます。

また、ハッカーはキーを盗む代わりに、サードパーティのライブラリを破ることができます:)

ライブラリ ベンダーに、要件を満たすためにキーを保護する方法を示すコード サンプルを依頼します。

ところで、SO の可逆ハッシュについて質問があります: Reversible hash function?

于 2012-04-24T06:19:08.817 に答える
1

次のようなコードがあると仮定しましょう。

unsigned char *bytes;
some_extremely_complicated_function_which_decrypt_key(bytes);
add_some_confusing_things();
maybe_even_split_into_several_calls(bytes);
// ...
call_function_using_their_key(bytes,data1,data2,data3);

これにより、アセンブラは次のようになります。

push [ebp+0004h]  // data3
push ecx          // data2
push [ebp+0024h]  // data1
push [eax]        // key (bytes)
call 123456h      // call to call_function_using_their_key

ほとんどの場合、インポート/再配置テーブルからアドレスを取得できcall_function_using_their_keyます(インライン、難読化、または同様の手法がほとんどない場合を除く)。

すべてにブレークポイントを自動的に追加しcall 123456h、最後のプッシュ=キー、メモリアドレスを指すキー、543216hからキーを取得します543216h

暗号化は役に立たなかった。

話の教訓:最初に、APIがデータを暗号化するのに意味があることを確認してください。そうしないと、これでうまくいくでしょう:

char *globalBytesPtr;

int main(){
    globalBytesPtr = malloc(N);
    globalBytesPtr[8] = 0x35;
    globalBytesPtr[3] = 0x14;
    globalBytesPtr[5] = 0x20;
    ...
}

これを使用すると、キーが静的ダンプに表示されないためです。最も弱い点はAPI呼び出しであり、このユニバースでアプリケーションをより安全にすることはできないため、これによってセキュリティが低下することはありません。

于 2012-04-24T06:44:45.820 に答える
1

「逆ハッシュアルゴリズム」のようなものはありません。どのハッシュ アルゴリズムも一方向になるように設計されており、データの損失を意味します。双方向の場合、暗号と呼ばれます。

ユーザーがアプリケーションを実行でき、アプリケーションがある時点でそれらのキーを使用している限り、キーが漏洩する可能性があります。これは、逆アセンブルとリバース エンジニアリング、メモリからのキーのダンプ、またはデバッガーの実行によって行うことができます。したがって、あなたができる最善のことは、何らかの方法で暗号化し、可能な限り復号化しないようにすることです.

モバイル プラットフォーム用に作成していることを考えると、キーを保護するために何らかの OS メカニズムに依存しようとする場合があります。または、これらが何らかの Web API のキーである場合は、それらのキーを格納し、プロキシとして機能するサーバーをセットアップできます。または、サードパーティ ベンダーに、キーを保護するためのベスト プラクティスや、推奨される暗号化メカニズムなどの特定の実装の詳細について実際に問い合わせてください。

于 2012-04-24T06:13:42.067 に答える