マルウェア分析ソフトウェアを作成したいのですが、プロセスのさまざまな kernel32 関数にコードを挿入する必要があります。たとえば、マルウェアが作成しようとするスリープを上書きする Sleep や、プロセスを強制終了する前にメモリをダンプする ExitProcess などです。
プロセスを中断して開始しようとした後、kernel32 rva を取得できることを期待してライブラリを列挙しようとしましたが、プロセスを中断して開始すると、ライブラリがロードされていないようです。
マルウェア分析ソフトウェアを作成したいのですが、プロセスのさまざまな kernel32 関数にコードを挿入する必要があります。たとえば、マルウェアが作成しようとするスリープを上書きする Sleep や、プロセスを強制終了する前にメモリをダンプする ExitProcess などです。
プロセスを中断して開始しようとした後、kernel32 rva を取得できることを期待してライブラリを列挙しようとしましたが、プロセスを中断して開始すると、ライブラリがロードされていないようです。
達成しようとしていることは、EasyHook API を使用して簡単に実行できます。API は、
https://github.com/EasyHook/EasyHook
以下は、Kernel32.dll から CreateFile をオーバーライドするサンプルです。CreateAndInject
メソッドを実行する必要があります
EasyHook.RemoteHooking.CreateAndInject(
targetExe, // executable to run
"", // command line arguments for target
0, // additional process creation flags to pass to CreateProcess
EasyHook.InjectionOptions.DoNotRequireStrongName, // allow injectionLibrary to be unsigned
injectionLibrary, // 32-bit library to inject (if target is 32-bit)
injectionLibrary, // 64-bit library to inject (if target is 64-bit)
out targetPID, // retrieve the newly created process ID
channelName // the parameters to pass into injected library
// ...
);
重要なのは、プロセスのメイン スレッド ID をフック DLL に送信し、その DLL がパッチを適用してメイン スレッドを起動することです。以下のようにEasyHookで行われます
if((hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, ThreadID)) == NULL)
THROW(STATUS_INTERNAL_ERROR, L"Unable to open wake up thread.");
if(!ResumeThread(hThread))
THROW(STATUS_INTERNAL_ERROR, L"Unable to resume process main thread.");
残りのフッキング プロセスは、プロセスを開き、ペイロードを送信するためにそのメモリに書き込むことによって、他の Windows プロセスで行われるのと同じです。
PS: サンプル メモ帳アプリケーションのファイル監視に関する詳細な例が必要な場合は、以下を参照してください。
https://easyhook.github.io/tutorials/remotefilemonitor.html
その他のチュートリアルのソース コードは、次のサイトで入手できます