私の質問は非常に簡単です。あなたは「アクセス許可」または「アクセス拒否」を出力する実行可能ファイルであり、悪者はあなたのアルゴリズムを理解しようとするか、内部にパッチを当てて、常に「アクセス許可」と言わせようとします。
この紹介の後、あなたは私が何をしているのか非常に不思議に思うかもしれません. 彼はDiablo3がリリースされたらクラックするつもりですか? 私はあなたの心配を和らげることができます、私はそれらのクラッカーの一人ではありません. 私の目標はクラックです。
Crackmes は、たとえば www.crackmes.de で見つけることができます。Crackme は、(ほとんどの場合) シリアルを検証し、シリアルに応じて「アクセス許可」または「アクセス拒否」を出力する小さなアルゴリズムを含む小さな実行可能ファイルです。目標は、この実行可能出力を常に「アクセス許可」にすることです。使用が許可されている方法は、作成者によって制限されている場合があります-パッチを適用したり、逆アセンブルしたりしないでください-または、バイナリ、objdump、および16進エディターで実行できるすべてのものを含みます。クラックメをクラックすることは間違いなく楽しみの 1 つですが、プログラマーとして、どうすれば難しいクラックメを作成できるのか疑問に思っています。
基本的には、crackme は 2 つの主要な部分で構成されていると思います。特定のシリアル検証と、その周辺のコードです。
アセンブリを使用するだけでシリアル検証を追跡しにくくすることは非常に可能です。たとえば、シリアルを受け入れるために特定の状態になる必要があるシミュレートされたマイクロプロセッサの入力としてシリアルを取得するという考えがあります。一方、安くなって、この部分を保護するための暗号的に強力な方法についてもっと学ぶかもしれません. したがって、攻撃者が実行可能ファイルにパッチを当てようとするのを難しくすることは、それほど難しいことではありません。
ただし、より困難な部分は、バイナリを保護することです。どういうわけか元に戻すことができない、完全に安全なシリアル検証を想定してみましょう(もちろん、元に戻すことができることはわかっています. 攻撃者がバイナリのジャンプをオーバーライドしてバイナリに何かを受け入れさせないようにするにはどうすればよいでしょうか?
このトピックについて少し調べてみましたが、バイナリ セキュリティ、バイナリの自己検証などに関するほとんどの結果は、侵害されたバイナリを使用してオペレーティング システムへの攻撃を防止しようとする記事に行き着きます。特定のバイナリに署名し、それらの署名をカーネルで検証します。
私の現在の考えは次のとおりです。
- バイナリ内の明示的な場所をジャンプであることを確認します。
- バイナリのチェックサム部分を調べ、実行時に計算されたチェックサムをそれらと比較します。
- コード内の関数に対して肯定的および否定的な実行時チェックを行います。シリアル検証に副作用があります。:)
潜在的な攻撃者をより長く苛立たせる方法をもっと考えることができますか? (もちろん、プログラム自体にプログラムの正しいチェックサムを埋め込むことができてチェックサムジェネレーターを壊すことができない限り、いつか彼を永遠に遠ざけることはできません.hehe)