web-dev-qa-db-ja.com

マルウェアがメモリからDLLをロードする方法

マルウェアがリソースセクションなどからメモリからDLLをロードする方法を理解しようとしています。 Google全体にコードが表示されていますが、プロセスを説明できる単純な英語のような疑似コードを見つけることができません。私はほとんどの部分でc ++およびpeファイル形式を理解していますが、dllをメモリにロードする方法を理解できるように思えます。

2
jammy47

まず、マルウェアは通常、自身のDLLをメモリにロードしません。マルウェアが実行可能コードを別のプロセス(OpenProcess()、WriteProcessMemory())に挿入し、そのコードを実行するそのプロセスで新しいスレッドを開始する(CreateRemoteThread())と混同していると思います。これは、DLLをメモリにロードすることとは関係ありません。これは、コードを実行するよりもはるかに困難です。なぜマルウェアは、メモリにロードされる複数のDLLで構成される必要がありますか?ONEを書く方がはるかに簡単です。複数のDLLの代わりに実行可能なマルウェア。

質問に戻ります。WindowsをだましてメモリからDLL=)をロードしたい場合、これは非常に高度なプログラミングとクラッキングの間の何かです。

1つの欠点は、DLLで問題が発生した場合にデバッガーを使用できないことです。

たとえば次のコードを使用できます: https://github.com/fancycode/MemoryModule をロードしてDLLをメモリにロードします。デメリットはテストしなかったためです。後でメモリにアクセスするには、特別な関数を使用してDLLにアクセスする必要があります。たとえば、DLLから文字列リソースを読み取るには、通常のWindows APIを使用できません。 。同じライブラリの関数を使用する必要があります。

発生するいくつかの問題がここに詳細にリストされています: https://www.codeproject.com/Tips/430684/Loading-Win-DLLs-manually-without-LoadLibrary 著者は彼のコードでそれを言っています彼のDLLにはHINSTANCEハンドルがありません。これは大きな欠点です。

1
Elmue

OSを使用する唯一の方法は、ドキュメント化されているか、ドキュメント化されていないAPIを呼び出すことです。

これが私がさまざまなインジェクション攻撃を理解する最も簡単な方法であると私が考えるものであり、それはあなたが求めていたいくつかの方法をカバーしています

10プロセスインジェクションテクニック

リストの2番と3番は、ディスク上のDLLが両方ともPE構造で機能していなくてもコードインジェクションを許可するプロセスを示しています。

リフレクティブインジェクションは、メモリ内にPE構造を構築し、バイナリコードをそれにマップします。 PE構造と正しくマップされたバイナリにより、これは基本的にメモリ内にあり、ディスクからロードするためにライブラリAPIが呼び出されていません。

プロセスの空洞化は、ロードされたDLLの中断されたスレッドのセクションをマップ解除し、悪意のあるコードにマップし、スレッドが実行するように設定される前に実行ポイントを再ポイントします。 これをC#プロジェクトとして機能させようとしましたが、リベースを機能させませんでした:(

0
McMatty