影
割り当ての説明は次のとおりです。
「Ollydbgはあなたを救いません、研究者! ゲームは、オペレーティングシステムのカーネルの暗いコーナーでプレイされます。 仮想現実の隠れた場所を知る勇気はありますか? 影があなたを待っています、彼を見つけてください!」ヒントは明確です。 サンプルのアナライザーで数回実行します。
ネタバレの下に削除

わかりました、すべてがきれいです。 インポートに見える:
ネタバレの下に削除

この段階で、disasmリストを掘り下げることなく(小さい、オフセット00402310を参照)、アプリケーションのロジックを理解できます。
- ドライバーがロードされました(CreateService)
- いくつかのパラメーターが渡されます(DeviceIoControl)
- ドライバーは何かをしている
- ???
明らかに、ドライバーをフックする必要があります。 「Olya」アーキタイプのr3デバッガーをロードし、CreateServiceA、DeviceIoControlにクラックを設定して、F9をクリックします(アンチデバッグはありません)。 CreateServiceAのブレークポイントがすぐにトリガーされます。これはスタックの外観です。
ネタバレの下に削除

ドライバーへのパスに気付き、どこかにコピーします。 F9をクリックして、同じ関数でもう1回停止します。
ネタバレの下に削除

これは同じドライバのように思えるかもしれませんが、よく見てください。名前が少し異なります。 保存します。 F9をクリックすると、目の前にコンソールが表示され、いくつかのデータを入力するよう要求されます。
ネタバレの下に削除

ランダムに入力して、送信します。 DeviceIoControlの故障はすぐにトリガーします:
ネタバレの下に削除

ここでは、3番目と5番目のパラメーターによってそれぞれ送信される一連のメールを見ることができます。 4番目と6番目の引数は、バッファーのサイズです(ゼロを考慮)。 デバッガーでトレースして、再試行し、さらに1回トレースします。 その結果、次の図が表示されます。
ネタバレの下に削除

つまり、DeviceIoControlがゼロ以外の値を返した場合、クラックで解決されました。 さて、最初のドライバーに移りましょう。 DriverEntry:
ネタバレの下に削除

DeviceIoControlハンドラー:
ネタバレの下に削除

大切な検証:
ネタバレの下に削除

この機能を反転することは難しくありません。 ただし、2番目のドライバーもありますが、これについてはまだ何もわかりません。 そのDriverEntry:
ネタバレの下に削除

面白い映画! 実際のドライバフィルタのように見えます。 ハンドラーを見てください:
ネタバレの下に削除

ここに見えるもの:
- ValidateStr関数は、プライマリデータの追加検証を行います。A..Z+ a..z + 0..9 + 'の文字のみが許可されます。 + '@'。 私はそのようなチェックを追加した人の手を引きちぎります-個人的に、私のメールはそれを通過しません、それは記号「-」を含みます
- ModifyMail関数は、次のように電子メールを変更します。
ネタバレの下に削除
- IofCallDriverは、データが既に変更された状態で制御をメインドライバーに転送します
したがって、すべてのチェックを考慮に入れて、次のようにスケッチできます。
ネタバレの下に削除
#include "main.h" char mail[257]; char hashes[32][33]; void main() { for (;;) { printf_s("Enter your name (1 chars min and 256 chars max, only A..Z + a..z + '.' + '@'):\n"); fgets(mail, 257, stdin); int ln = strlen(mail) - 1; if (mail[ln] == '\n') mail[ln] = '\x00'; else ln++; if (ln < 1) continue; for (int i = 0; i < ln; i++) { if ((mail[i] < '0' || mail[i] > '9') && mail[i] != '.' && mail[i] != '@') { if (i & 1) mail[i] &= 0xDF; else mail[i] |= 0x20; } } //change chars case GetMD5(mail, ln, mail); for (int i = 0; i < 32; i++) { if (mail[i] < '0' || mail[i] > '9') { mail[i] &= 0xDF; GetMD5(mail, 32, hashes[i]); mail[i] |= 0x20; } else GetMD5(mail, 32, hashes[i]); } for (int i = 0; i < 32; i++) mail[i] = hashes[i][i]; printf("%s\n", mail); } }
GetMD5関数は、 ここから取った最も標準的なものです 。 コンパイル、実行:
ネタバレの下に削除

解決しました。 これに別れを告げます。