Please choose a tutorial page:
- Fundamentals — Information about C
- Tools
- Registers
- Simple Instructions
- Example 1 — SC CDKey Initial Verification
- Example 2 — SC CDKey Initial Verification
- Sample 1 — SC CDKey Initial Verification
- Example 2 — SC CDKey Initial Verification
- 例2b — SC CDKey Final Decode
- The Stack
- Stack Example
- Functions
- 例3–Storm.Decode
- Stack Example
Stack Example
- Machine Code
- Example 4 — Smashing the Stack
- Cracking a Game
- Example 5 — Cracking a game
- Example 6 — Writing a keygen
- .Stack の例 (1879)dll インジェクションとパッチ
- Memory Searching
- Example 7 — Starcraft (1.05)
- Cheat を書く Example 7 Step 1 — Messages
- Example 7 Step 1b — 上記、w/func ptrs
- Example 7 Final
- Example 8 — IX86 を取得する。dllファイル
- 16ビットアセンブリ
- 例9 — 16ビットゲームのキージェン
- 例10 — ローダーの作成
このセクションでは、ゲーム/ソフトウェアの登録に用いるクラッカーのいくつかのテクニックについて説明します。 CDクラックについては、私はその方法を知らないので言及しません。むしろ、一般的にキーまたは登録コードに基づく攻撃について言及します。
Common Protections
最も一般的な保護で、ここで説明するものは、プログラムがロックを解除するために登録キーを必要とする場合です。 通常、キーはプログラムによって提供されるランダムな登録コードに基づくか、または入力されたユーザー名に基づくかのいずれかです。
ここで、いくつかの定義を挙げておきます。 これらの定義は私のものであり、他の人が使用する定義と必ずしも一致しないことに注意してください。
- 登録コードはプログラムによって生成されるコードであり、登録キーはそこから派生するか、またはチェックされます。 登録キーは、そのユーザ名に基づいています。
- 登録キーはプログラムのロックを解除するために使用されるキーです。 それは登録コード、登録ユーザー名、または全く何もないことに基づいているかもしれません。
Finding the Spot
最初の例は Starcraft の CDKey 検証アルゴリズムについてですが、私はこのアルゴリズムを提供しました。 Starcraft のものは最も単純な検証で、ユーザー名やコードがなくてもキーがそれ自身を検証します。 問題は、どうやってアルゴリズムを見つけるかです。
残念なことに、答えはさまざまで、一般に簡単ではありません。
最初のステップは、明らかにプログラムを逆アセンブルすることです。 その後、クラッカーとして、プログラムの弱点を見つけようとする必要があります。 3436>
- キーを要求するテキストを探す
- メモリ内の登録コードを探し、それがアクセスされる場所を見つける
- コードを入力して失敗し、その失敗コードをメモリから探す
- 登録について何かユニークなこと(色、テキスト、ダイアログ、など)がないか探す。
- キーを格納するレジストリ キーを検索する
- 登録情報を格納するファイルを検索する
- 不正なキーが与えられたときのエラー メッセージを検索する
最後のテクニックが最も有用だと私は考えています。 しかし、全部試してみて、そのゲームに合いそうなものを試してみるのが一番効果的です。 次のセクションの例では、後で見るように、ソフトウェアが未登録であることを知らせるテキストを検索することが、このゲームにうまく作用することがわかったのです。 キーを保存しているファイルと、それが作成された場所を検索する、2つ目の例を行うかもしれません。
Starcraft の CDKey 検証ツールを見つけるために、私は Winsock 関数 (send() および recv()) のネットワーク トラフィックから始めました。 そこから、Battle.netでStarcraftのキーを検証するパケットが送信される場所までさかのぼって探しました。 これは大変な作業でしたが、当時はスタークラフトのネットワーク・アクティビティについて学んでいたので、すでにやっていたことの副次的な効果がほとんどでした。 このチュートリアルを書き続ければ、いずれはそこまで詳しくなれるかもしれませんが、まだその予定はありません。
Cracking the Game
正しい場所を見つけたら、ゲームのクラッキングは非常に簡単であることがよくあります。 通常、プログラムは次のようなコードになります:
if(keyIsValid) unlock() else displayError()
これに対するアセンブリは次のようになります:
85 xx test keyIsValid, keyIsValid74 06 jz errore8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:
マシンコードのセクションで述べたように、左側のバイトはマシンコードのバイトかもしれません(参考資料から素早くやったので、正確に正しいかどうかわかりません。 このプログラムは2、3バイトを変更することで、常にジャンプするように強制したり、決してジャンプしないようにしたりすることができます。
強制的にジャンプさせる(この場合、キーは常に有効になる)には、jzをjmpに置き換えます(74をebに変更):
85 xx test keyIsValid, keyIsValideb 06 jmp errore8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:
ジャンプしないようにするには、jzをnop命令のペアに置き換えます:
85 xx test keyIsValid, keyIsValid90 nop90 nope8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:
適切に変更してゲームを実行し、任意のコードを入力します。 期待通りの結果が得られるはずです!
次の例では、実際のゲーム (明白な理由によりここでは名前を挙げないゲーム) でこれを示します。
Writing a Keygen
ゲームをクラッキングするよりもさらに良いのは、そのための keygen を作成することです。 ユーザがユーザ名または登録コードを入力すると、 keygen が有効なキーを出力します。
一般に、これはアルゴリズムを完全にリバースエンジニアリングして理解することが必要です。 その後、C言語(または任意の言語)でそのコピーを作成し、同じ結果を生成します。 このチュートリアルの最初の3つの例はまさにそれであり、アセンブリコードをCに戻していることに注意してください。
Questions
Feel free to edit this section and post questions, I’ll do my best to answer them.このセクションを編集して質問を投稿してください。 しかし、質問が存在することを私に知らせるために、私に連絡する必要があるかもしれません。