
おやすみ、 %USERNAME% ! 前回の記事「 ValveのSteam CEGとそれが食べるもの。はじめに 」では、CEGテクノロジーの抽象的な理解と原則のみを説明しました。 この記事では、理論の絶対最小値と実践の大部分について説明します。 今日そして今、私たちはこの保護から大切な実行可能ファイルを「離す」ことができるかどうかを検討します。
ステップI.「犠牲者」の選択と分析
CEGと任意のバージョンの存在は、 .versionセクションのヘッダーとその最初の4バイト( 78 56 34 12 )の存在によって簡単に検出できます。

この情報を知り、Steamライブラリで少し検索したところ、「 Extended Edition 」という接頭辞が付いた伝説のAge of Mythologyの HD再発行になりました。 ダウンロードが正常に完了した後、CEGが実行可能ファイルに署名するのを数秒待った後、デバッガーで、私の場合はx64dbgでそれを開きます。 そうそう、CEGはいくつかのアンチデバッグツールを使用することに注意する価値があるので、次の設定でScyllaHideプラグインを使用します。

そのため、実行可能ファイルを開くと、サードパーティのパッカーによってカバーされていないことがわかりますので、2番目のステップに安全に進むことができます。
ステップII デブリーフィング
CEGのどのバージョンにも、目的の値の一般的な計算を実行する関数が1つあります。 次のようになります。

これを知って、いずれかの指示に内訳を置きます
mov eax, dword ptr ds:[ecx]
、
次のいずれか:
mov dword ptr ds:[ecx],eax
:

「 実行 」( F9 )を押して、クラックが機能したことを確認します! 「そして、それは私たちに何を与えましたか?」-あなたは尋ねます、私は答えます:バッファ内のEAXの正確な値。 これを確認するには、「 CPU 」タブの反対側の右側の列を見てください。

画像からわかるように、 EDB88320の値を取得しました 。 それをクリップボードにコピーして先に進みます。 「 Step Over 」( F8 )を2回押して、CEGで使用される関数の1つの中に自分自身を見つけます。 そして、この段階では、そのような関数の既存のタイプについていくつかの言葉を言う価値があります。 実際には、次の3つのタイプがあります。
1 定値を持つ関数 ( Constant )-常に同じ定数値を返します。 パッチとして:
mov eax, <> ret
;
2 。 ランダム値を持つ関数 ( Random )-任意の整数値を返します。 パッチとして:
mov eax, <> ret
( CEGの最新バージョンでのみ使用 );
3 。 保護機能 ( 保護 )-真の機能へのポインターです。
jmp <>
。
それでは、ゲームに戻りましょう。 目的の関数内にあり、バッファーに正しい値があります。 次に、関数の形式を決定する必要があります。 いくつかの指示を下にスクロールすると、指示が使用されていることがわかります
lea eax, dword ptr ds[esi+ebx]
:

そして、これはただ一つのことを意味することができます-私たちは定数値を返す関数を扱っています。 一般に、 EDB88320、60、11、5、3fなどの値がEAXバッファーに表示される場合、この値を使用する関数が定数であることはすぐに明らかになることを覚えておく必要があります。 なんで? これらは「既知の」CEG定数値であるため、CEGのどのバージョンでも同じです。 したがって、関数の最初に移動して調整し、次のように変更します
mov eax, EDB88320
ret
:

それでは、次は何ですか? そして、ゲームを開始するまで(利益を計算する関数の内訳も同じように)すべてを繰り返します(つまり、すべてのCEGチェックに合格したことを意味します)。 すべて?! よく見てみましょう。 パッチを適用してファイルを保存し、別のPC(ゲームが既に意図的にダウンロードされたPC)で実行しようとします。 そして...残念だ。 ゲームは実行したくない! そうそう、もう一つの重要な詳細を忘れてしまいました! 実際、CEGは最初の記事で述べたように、いわゆるファイルチェックを使用しています。 デバッガーを再度開くと、すばらしいWinAPIの特徴的な関数GetFileInformationByHandle 、 CreateFileW 、 OpenFileById 、 StringFromGUID2 、 RegOpenKeyExW 、 SystemFunction036およびlstrcmpiWの存在により、これらのチェックを簡単に検出できます。 私たちのゲームでは、そのようなチェックは1つしかありません。GetFileInformationByHandleを「 References 」の検索対象にすると、すぐに見つけることができます。

最初に移動して、このチェックを呼び出す関数を探します( RMB->参照の検索->選択したアドレス(es) 、またはCTRL + Rキーの組み合わせ)。 次のようになります。

それでは、やってみましょう! これはより洗練された方法で行うことができますが、次を使用して簡単に行います
mov eax, 1 ret

行われた作業の結果を保存し、神について2回目のテストを行います。ゲームは別のSteamアカウントと別のPCで開始されました。
ステップIII Steamからのゲームの完全リリース(Yarr!Edition)
もちろん、喜びの後、私はもっと極端になりたかった。 しかし、あごひげを生やした時代のように、Steamを使用せずにLANで友人とプレイしたい場合はどうすればよいですか まあ、質問はありません。 これを行うために、部分的なオーバーレイをサポートする優れたSteamエミュレーターをダウンロードしました(!) SmartSteamEmuと呼ばれます。 設定した後、Steamをオンにせずにゲームを開始しました。 そして、私は何を見る- * .STEAMSTARTファイルが作成され、プロセスでゲームがハングしました。 30秒ほど考えた後、ゲームはまだ開始され、適切に機能していました。 しかし、なぜですか? 私たちは皆そうでしたね。 はい、そうですが、ちょっとしたタッチは忘れていました。 実際、このイベントファイルはSteamプロセスが実行されていないときに作成され、実際には最後のマイクロチェックです。 さて、3回目のデバッガーを開き、 CreateFileAですべての関数を探します。 ためらうことなく、すべての関数にブレークを設定します(この場合は2つしかありません)。 ゲームが開始されたとき、故障は機能しました:

STEAMSTART 、また会いましょう! したがって、この誤解を終わらせるために、単にトップJEをJNZまたはJMPに変更します。

パッチを保存し、再びSteamなしでゲームを実行してみてください。 そして出来上がり-ゲームは数秒で始まりました! 私たちはあなたにこれをしました、 CEG 、私たちを許してください。
実際、結論
ゲームAge of Mythology:Extended Editionの CEGは難しくありませんでした。 このゲームにはProtect機能もRandom機能もなく、 Constant機能のみがあり、タスクが大幅に簡素化されました。 また、このゲームでは、古くなったCRCの形でのマイナーチェックや、 プロセッサIDまたはハードドライブのシリアル番号の最新チェックはありませんでした 。
将来的には、これらの2つの新しいチェックをマスターして新しい記事を書くことができればいいのですが、今のところは、すぐに会いましょう!