8

私の質問は非常に簡単です。あなたは「アクセス許可」または「アクセス拒否」を出力する実行可能ファイルであり、悪者はあなたのアルゴリズムを理解しようとするか、内部にパッチを当てて、常に「アクセス許可」と言わせようとします。

この紹介の後、あなたは私が何をしているのか非常に不思議に思うかもしれません. 彼はDiablo3がリリースされたらクラックするつもりですか? 私はあなたの心配を和らげることができます、私はそれらのクラッカーの一人ではありません. 私の目標はクラックです。

Crackmes は、たとえば www.crackmes.de で見つけることができます。Crackme は、(ほとんどの場合) シリアルを検証し、シリアルに応じて「アクセス許可」または「アクセス拒否」を出力する小さなアルゴリズムを含む小さな実行可能ファイルです。目標は、この実行可能出力を常に「アクセス許可」にすることです。使用が許可されている方法は、作成者によって制限されている場合があります-パッチを適用したり、逆アセンブルしたりしないでください-または、バイナリ、objdump、および16進エディターで実行できるすべてのものを含みます。クラックメをクラックすることは間違いなく楽しみの 1 つですが、プログラマーとして、どうすれば難しいクラックメを作成できるのか疑問に思っています。

基本的には、crackme は 2 つの主要な部分で構成されていると思います。特定のシリアル検証と、その周辺のコードです。

アセンブリを使用するだけでシリアル検証を追跡しにくくすることは非常に可能です。たとえば、シリアルを受け入れるために特定の状態になる必要があるシミュレートされたマイクロプロセッサの入力としてシリアルを取得するという考えがあります。一方、安くなって、この部分を保護するための暗号的に強力な方法についてもっと学ぶかもしれません. したがって、攻撃者が実行可能ファイルにパッチを当てようとするのを難しくすることは、それほど難しいことではありません。

ただし、より困難な部分は、バイナリを保護することです。どういうわけか元に戻すことができない、完全に安全なシリアル検証を想定してみましょう(もちろん、元に戻すことができることはわかっています. 攻撃者がバイナリのジャンプをオーバーライドしてバイナリに何かを受け入れさせないようにするにはどうすればよいでしょうか?

このトピックについて少し調べてみましたが、バイナリ セキュリティ、バイナリの自己検証などに関するほとんどの結果は、侵害されたバイナリを使用してオペレーティング システムへの攻撃を防止しようとする記事に行き着きます。特定のバイナリに署名し、それらの署名をカーネルで検証します。

私の現在の考えは次のとおりです。

  • バイナリ内の明示的な場所をジャンプであることを確認します。
  • バイナリのチェックサム部分を調べ、実行時に計算されたチェックサムをそれらと比較します。
  • コード内の関数に対して肯定的および否定的な実行時チェックを行います。シリアル検証に副作用があります。:)

潜在的な攻撃者をより長く苛立たせる方法をもっと考えることができますか? (もちろん、プログラム自体にプログラムの正しいチェックサムを埋め込むことができてチェックサムジェネレーターを壊すことができない限り、いつか彼を永遠に遠ざけることはできません.hehe)

4

6 に答える 6

6

あなたは「アンチリバーシングテクニック」に入っています。そして、それは基本的に芸術です。さらに悪いことに、初心者を踏みつけたとしても、olly および IDA Pro 用の「アンチアンチリバーシング プラグイン」があり、ダウンロードして多くの対策を回避できます。

対策には、トラップ デバッガー API によるデバッガー検出、または「シングル ステップ」の検出が含まれます。デバッガーのブレークインを検出した後も機能し続けますが、プログラムのずっと後のランダムな時間に動作を開始するコードを挿入できます。それは本当に猫とネズミのゲームであり、クラッカーはかなりの優位性を持っています.

チェックアウト... http://www.openrce.org/reference_library/anti_reversing - そこにあるもののいくつか。

http://www.amazon.com/Reversing-Secrets-Engineering-Eldad-Eilam/dp/0764574817/ - この本には非常に優れたアンチリバーシング情報があり、テクニックを順を追って説明しています。一般的に int リバースを取得している場合は、開始するのに最適な場所です。

于 2008-09-19T06:33:15.107 に答える
2

これらのことは、一般的に、価値があるというよりは厄介なことだと思います。

バイナリを保護するためにコードを書くのに多大な労力を費やしています。悪意のある者は、クラッキングに費やす労力が少なく (一般に、あなたよりも経験が豊富です)、クラックをリリースして、誰もがあなたの保護を回避できるようにします。あなたがいらいらさせるのは、あなたの保護によって不便を感じている正直な人だけです。

著作権侵害をビジネスのコストと考えてください。すべてのサポートが有料の顧客に対してのみ行われるようにすれば、海賊版ソフトウェアの増分コストはゼロです。

于 2008-09-19T06:21:17.223 に答える
1

TPM テクノロジがあります: ウィキペディアのtpm

バイナリの暗号化チェックサムを特別なチップに保存できるため、一方向の検証として機能する可能性があります。

: TPM は DRM に使用される可能性があるため、ある種の悪評があります。しかし、この分野の専門家にとって、それは一種の不公平であり、Linux ユーザーが自分の TPM チップの使用方法を正確に制御できるようにするオープン TPMグループさえあります。

于 2008-09-19T06:26:58.817 に答える
1

この問題に対する最も強力なソリューションの 1 つはTrusted Computingです。基本的に、アプリケーションを暗号化し、復号化キーを特別なチップ (トラステッド プラットフォーム モジュール) に送信します。チップは、コンピュータが「信頼できる」状態にあることを確認した場合にのみ、アプリケーションを復号化します。メモリ ビューアー/エディターはありません。デバッガーなどはありません。基本的に、復号化されたプログラムコードを表示できるようにするには、特別なハードウェアが必要です。

于 2008-09-19T06:36:28.280 に答える
0

したがって、最初にキーを受け取り、それをメモリに保存し、その後ディスクから取得するプログラムを作成する必要があります。正しいキーであれば、ソフトウェアは動作します。キーが間違っていると、ソフトウェアがクラッシュします。目標は、海賊が有効なキーを生成するのを困難にし、ライセンスされていないキーで動作するようにプログラムにパッチを当てるのを困難にすることです。

これは、実際には特別なハードウェアなしで実現できます。私たちの遺伝暗号を考えてみましょう。この宇宙の物理学に基づいて機能します。私たちはそれをハッキングしたり、薬を作成したりしようとしますが、無残に失敗し、通常、大量の望ましくない副作用を引き起こします。遺伝子の「コード」が進化して機能する複雑な「世界」をまだ完全にリバース エンジニアリングしていないためです。 . 基本的に、誰もがアクセスできる共通のプロセッサ (共通の「世界」) ですべてを実行している場合、現在のソフトウェアが非常に簡単にクラックされることが実証されているように、そのような安全なコードを書くことは事実上不可能です。

ソフトウェアでセキュリティを実現するには、本質的に、十分に複雑な独自のプラットフォームを作成する必要があります。他の人は、予測できない副作用なしにコードの動作を変更するために、完全かつ徹底的にリバース エンジニアリングを行う必要があります。ただし、プラットフォームがリバース エンジニアリングされると、振り出しに戻ることになります。

問題は、プラットフォームがおそらく共通のハードウェア上で実行されるため、プラットフォームがリバース エンジニアリングしやすくなり、コードがリバース エンジニアリングしやすくなるということです。もちろん、これは、プラットフォームに必要な複雑さのレベルがリバース エンジニアリングが十分に困難になるように、ハードルが少し上がったことを意味するだけかもしれません。

十分に複雑なソフトウェア プラットフォームとはどのようなものでしょうか? たとえば、おそらく 6 回の加算操作ごとに、7 回目の加算では、システムの初期化以降に実行された減算と乗算の合計回数の差の法 5 の対数の平方根で割った PI を乗算した結果が返されます。プラットフォームは、正しい結果をデコードするために、コード自体と同様に、これらの数値を個別に追跡する必要があります。したがって、コードは、設計したプラットフォームの複雑な基本動作に関する知識に基づいて作成されます。はい、プロセッササイクルを消費しますが、誰かがそのちょっとした驚きの動作をリバースエンジニアリングし、適切に動作させるために新しいコードに再設計する必要があります. さらに、自分のコードは一度書いたら変更するのが難しく、それは、各行が以前に起こったことすべてに依存するため、縮小不可能な複雑さに崩壊するからです。もちろん、十分に安全なプラットフォームでははるかに複雑になりますが、ポイントは、副作用を弱体化させることなくコードをリバース エンジニアリングして変更する前に、誰かがプラットフォームをリバース エンジニアリングするということです。

于 2009-05-20T02:23:44.510 に答える