2

サードパーティに送信する予定の DLL があり、特定の USB デバイスが接続されている場合にのみ実行するように制限して保護したいと考えています。setupapi を使用してデバイスのシリアル番号を取得しています (SetupDiGetDeviceInstanceId() を呼び出して)。

誰かが DLL を逆アセンブルした場合に備えて、検証を追跡しにくくしたいと考えています。たとえば、SetupDiGetDeviceInstanceId への単純な呼び出しは追跡可能であり、誰かが USB からの適切なシリアルなしで私の DLL を使用したい場合、彼はアセンブリ コードで私の strcmp を簡単に探してif(strcmp(...) == 0)if(strcmp(...) == 1).

私のコードをリバースエンジニアリングから保護するための良い(そしてできれば「簡単な」)アプローチは何でしょうか? それを処理する別の API (setupapi 以外) を使用できますか?

前もって感謝します!

4

3 に答える 3

2

そのようなソフトウェアを制限することは、通常、後で来て噛まれます。「誰にでもできる」方法でそれを実装する方法を見つける作業は過小評価されることが多く、最終的に正規の顧客を悩ませて、意図せずに製品を無効にする可能性もあります. 代わりに、適切なサポートを提供し、頻繁に更新することをお勧めします。どんな保護も回避できるので、私はそれにあまり時間をかけません。

于 2010-07-18T10:44:17.460 に答える
1

シリアル番号を読み取って既知の適切な値と比較することは明らかにできません。これを見つけて削除するのは簡単です。

物事をもう少し難しくするには、シリアル番号の暗号化ハッシュ (例: SHA-256) を正しいシリアル番号の暗号化ハッシュに使用します。ハッシュのコードがインラインで生成されていることを確認してください。これにより、シリアル番号の読み取りとハッシュ値の比較に基づくジャンプの実行の間にかなり大きな混乱が生じます。これは断固たる攻撃者を止めることはできませんが、デバッガーでコードをちらりと見るだけで、リバース エンジニアリングに多くの時間を費やすことを望まないほとんどの人を止めることができます。

さらに難しくしたい場合は、正しいシリアル番号をキーとして、コードの一部を暗号化して保存してください。実行時にシリアル番号を読み取り、それを使用してコードを復号化します。それが間違っている場合、結果は悪いコードになり、そのまま実行するか (すぐにクラッシュして焼き付くことがわかっている)、何らかのチェックサムを実行して結果を検証し、もう少し適切に失敗する (つまり、表示する) ことができます。コードが正しく復号化されなかった場合は、エラー メッセージが表示されて終了します)。

于 2010-07-19T14:27:41.460 に答える
0

私の意見では、それはあなたにとっては簡単ではなく、サードパーティにとっては難しいことではありません。IDチェックは簡単に見つかり、無効になります。私はあなたのDLLの計算を理解するのが難しいいくつかの本質的なものを外部デバイスに移そうとします。

于 2010-07-18T10:38:39.453 に答える