さらに別のカスペルスキークラックメ

今回、LKは世界に6つのクラックをリリースしました。そのうち2つは人間の言語 Sで書かれています。分析を始めましょう。 リンクアーカイブ記事のサンプル





割り当ての説明は次のとおりです。

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



ネタバレの下に削除




わかりました、すべてがきれいです。 インポートに見える:



ネタバレの下に削除




この段階で、disasmリストを掘り下げることなく(小さい、オフセット00402310を参照)、アプリケーションのロジックを理解できます。



  1. ドライバーがロードされました(CreateService)
  2. いくつかのパラメーターが渡されます(DeviceIoControl)
  3. ドライバーは何かをしている
  4. ???


明らかに、ドライバーをフックする必要があります。 「Olya」アーキタイプのr3デバッガーをロードし、CreateServiceA、DeviceIoControlにクラックを設定して、F9をクリックします(アンチデバッグはありません)。 CreateServiceAのブレークポイントがすぐにトリガーされます。これはスタックの外観です。



ネタバレの下に削除




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



ネタバレの下に削除




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



ネタバレの下に削除




ランダムに入力して、送信します。 DeviceIoControlの故障はすぐにトリガーします:



ネタバレの下に削除




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



ネタバレの下に削除




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



ネタバレの下に削除




DeviceIoControlハンドラー:



ネタバレの下に削除




大切な検証:



ネタバレの下に削除




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



ネタバレの下に削除




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



ネタバレの下に削除




ここに見えるもの:



  1. ValidateStr関数は、プライマリデータの追加検証を行います。A..Z+ a..z + 0..9 + 'の文字のみが許可されます。 + '@'。 私はそのようなチェックを追加した人の手を引きちぎります-個人的に、私のメールはそれを通過しません、それは記号「-」を含みます
  2. ModifyMail関数は、次のように電子メールを変更します。



    ネタバレの下に削除


  3. 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関数は、 ここから取った最も標準的なものです 。 コンパイル、実行:



ネタバレの下に削除




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



All Articles