つまり、多くのシェアウェア プログラムで合法的な使用の制約を打ち破る/だますアルゴリズムを誰かがどうやって開発できるのか、私はいつも疑問に思っていました。
好奇心のためだけに。
つまり、多くのシェアウェア プログラムで合法的な使用の制約を打ち破る/だますアルゴリズムを誰かがどうやって開発できるのか、私はいつも疑問に思っていました。
好奇心のためだけに。
違法であることは別として、それは非常に複雑な作業です。
理論的なレベルで言えば、一般的な方法は、プログラムを分解してクラックし、キーまたはシリアルコードがチェックされている場所を見つけようとすることです。
深刻な保護スキームは複数の場所で値をチェックし、後で使用するためにシリアルキーから重要な情報を取得するため、推測したと思われるときにプログラムがクラッシュするため、言うのは簡単です.
クラックを作成するには、チェックが行われるすべてのポイントを特定し、アセンブリ コードを適切に変更する必要があります (多くの場合、条件付きジャンプを反転したり、コスタントをメモリ ロケーションに保存したりします)。
keygen を作成するには、アルゴリズムを理解し、まったく同じ計算をやり直すプログラムを作成する必要があります (古いバージョンの MS Office のシリアルには非常に単純なルールがあり、数字の合計は の倍数である必要がありました。そのため、keygen の作成はかなり簡単でした)。
どちらのアクティビティでも、アプリケーションの実行をデバッガーで追跡し、何が起こっているかを把握する必要があります。また、オペレーティング システムの低レベル API を知る必要があります。
一部の厳重に保護されたアプリケーションでは、ファイルを逆アセンブルできないようにコードが暗号化されています。メモリに読み込まれると復号化されますが、メモリ内デバッガーが開始されたことを検出すると、開始を拒否します。
本質的には、非常に深い知識と創意工夫と多くの時間を必要とするものです! ああ、それはほとんどの国で違法だと言いましたか?
詳細については、Google で +ORC Cracking Tutorials を参照してください。それらは非常に古く、現在ではおそらく役に立たないものですが、それが何を意味するかについての良いアイデアを提供します。
いずれにせよ、独自の保護スキームを作成する場合は、これらすべてを知っておく必要があります。
悪者は、逆アセンブラを使用してキー チェック コードを検索します。これを行う方法を知っていれば、これは比較的簡単です。
その後、キー チェック コードを C または別の言語に翻訳します (この手順はオプションです)。キーチェックのプロセスを逆にすると、キージェネレーターが得られます。
アセンブラを知っていれば、これを行う方法を学ぶのにおよそ週末かかります。私はちょうど数年前にそれを行いました (ただし、何もリリースしたことはありません。それは私のゲーム開発の仕事のための単なる調査でした。クラックするのが難しいキーを作成するには、人々がクラックにどのようにアプローチするかを理解する必要があります)。
Nils の投稿では、キー ジェネレーターを扱っています。クラックの場合、通常は分岐点を見つけてロジックを反転 (または条件を削除) します。たとえば、ソフトウェアが登録されているかどうかをテストし、登録されている場合はゼロを返し、それに応じてジャンプします。1 バイトを変更することで、「0 に等しい場合にジャンプ (je)」を「0 に等しくない場合にジャンプ (jne)」に変更できます。または、実行したくないことを行うコードのさまざまな部分に対してノーオペレーションを記述することもできます。
コンパイルされたプログラムは逆アセンブルでき、十分な時間があれば、決心した人々はバイナリパッチを開発できます。クラックは、プログラムの動作を変更するための単なるバイナリ パッチです。
まず、ほとんどのコピー防止スキームはそれほど高度ではありません。
これを行うために使用されるいくつかの方法があります。デバッガーでコードをステップ実行できますが、これには通常、アセンブリに関する十分な知識が必要です。これを使用すると、プログラムのどこでコピー防止/キー生成メソッドが呼び出されているかがわかります。これにより、IDA Proのような逆アセンブラーを使用してコードをより詳細に分析し、何が起こっているのか、どのように回避できるのかを理解しようとすることができます。日付チェックに NOOP 命令を挿入することで、以前に時間制限のあるベータ版をクラックしました。
それは、ソフトウェアの十分な理解とアセンブリの基本的な理解に帰着します。 Hak5は、今シーズンの最初の 2 つのエピソードで、リバース エンジニアリングとクラッキングの基本についての 2 部構成のシリーズを作成しました。これは本当に基本的なことですが、おそらくまさにあなたが探しているものです。
クラッカー志望者は、プログラムを逆アセンブルし、「コピー防止」ビット、特にシリアル番号が有効かどうかを判断するアルゴリズムを探します。そのコードから、多くの場合、機能のロックを解除するために必要なビットのパターンを確認し、それらのパターンで数値を作成するジェネレーターを記述できます。
もう 1 つの方法は、シリアル番号が有効な場合は「true」を返し、そうでない場合は「false」を返す関数を探し、その関数が常に「true」を返すようにバイナリ パッチを開発することです。
他のすべては、主にこれら 2 つのアイデアの変形です。コピープロテクションは、定義上、常に破ることができます。ある時点で、最終的に実行可能なコードが必要になるか、プロセッサがそれを実行できなくなります。
アルゴリズムを抽出して「推測」を開始し、肯定的な応答を探すことができるシリアル番号。コンピューターは強力で、通常、ヒットを吐き出すまでに少ししかかかりません。
ハッキングに関して言えば、以前はプログラムを高レベルでステップ実行し、機能しなくなったポイントを探すことができました。次に、成功した最後の「呼び出し」に戻り、そこに足を踏み入れてから繰り返します。当時、コピー防止機能は通常、ディスクに書き込み、その後の読み取りが成功したかどうかを確認していました (成功した場合、フロッピーの一部をレーザーで焼いて書き込みできなかったため、コピー防止機能は失敗しました)。
次に、適切な呼び出しを見つけて、その呼び出しからの正しい戻り値をハードコーディングするだけでした。
今でも似ていると思いますが、通話の場所を隠すために多大な努力を払っています. 最後に試したものは、シングルステップ実行中のコードの上にコードをロードし続けたため、あきらめました。それ以来、はるかに複雑になっていると確信しています。
所有者の名前がバイナリのどこかに(暗号化されて難読化されて)保存されている、またはバイナリ全体に分散されている、パーソナライズされたバイナリを配布するだけではないのはなぜだろうか。保存しますが、ファイルから名前を削除するのは簡単すぎます。
クラックはそれぞれ異なると思いますが、ほとんどの場合、誰かが問題のアプリケーションをトレースするデバッガーに多くの時間を費やしていると思います。
シリアル ジェネレーターは、シリアル番号の有効性をチェックし、リバース エンジニアリングするアルゴリズムを分析することで、さらに一歩進んでいます。