このリポジトリには、ネイティブLinuxプログラムがWindows DLLから機能をロードおよび呼び出すことを可能にするライブラリが含まれています。
デモンストレーションとして、Windows DefenderをLinuxに移植しました。
$ ./mpclient eicar.com
main(): Scanning eicar.com...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Virus:DOS/EICAR_Test_File identified.
peloaderディレクトリには、ndiswrapperから派生したカスタムPE/COFコヒュードローダーが含まれています。ライブラリは、移転と輸入を処理し、 dlopen -like APIを提供します。このコードは、GDB(シンボルを含む)、基本的なブロックカバレッジコレクション、ランタイムフックとパッチングでのデバッグをサポートします。
意図は、Linux上の自己完結型のWindowsライブラリのスケーラブルで効率的なファジングを可能にすることです。優れた候補者は、ビデオコーデック、減圧ライブラリ、ウイルススキャナー、画像デコーダーなどです。
外部インポートのサポートを追加する必要がある場合、通常、スタブの書き込みは迅速かつ簡単です。
Windowsでの分散型のスケーラブルなファジングは、挑戦的で非効率的です。これは、カーネルとユーザースペース全体にわたる複雑な相互接続コンポーネントを使用するエンドポイントセキュリティ製品に特に当てはまります。これには、多くの場合、仮想化されたWindows環境全体をスピンアップして、それらを曖昧にしたり、カバレッジデータを収集したりする必要があります。
これはLinuxの問題ではなく、Windows Antivirus製品のコンポーネントをLinuxに移植することがしばしば可能であることがわかりました。これにより、オーバーヘッドが非常に少ない最小限のコンテナでテストしているコードを実行でき、テストを簡単にスケールアップすることができます。
これは単なる個人的な意見ですが、Linuxにはより良いツールがあると思います。 ¯_(ツ)_/¯
MSMPENGは、Windows 8、8.1、10、Windows Server 2016などでデフォルトでデフォルトで有効になっているマルウェア保護サービスです。さらに、Microsoft Security Essentials、System Center Endpoint Protection、およびその他のさまざまなMicrosoftセキュリティ製品が同じコアエンジンを共有しています。
スキャンと分析を担当するMSMPENGのコアコンポーネントは、MPENGINEと呼ばれます。 MPENGINEは広大で複雑な攻撃面であり、数十の難解なアーカイブ形式、実行可能パッカー、さまざまなアーキテクチャ用の完全なシステムエミュレーター、さまざまな言語の通訳者で構成されています。このコードはすべて、リモート攻撃者がアクセスできます。
テストクライアントを構築するには、単にmakeを入力します。
$ make
.i686または:i386サフィックスが重要であることに注意してください。32ビットDLLを使用するには32ビットライブラリが必要です。
| Fedora / Redhat | ubuntu / debian | コメント |
|---|---|---|
glibc-devel.i686 | libc6-dev:i386 / libc6-dev-i386 | 名前はバージョンによって異なります。 |
libgcc.i686 | gcc-multilib | |
readline-devel.i686 | libreadline-dev:i386 | MPScriptで使用されるオプション。 |
cabextract | cabextract | 定義を抽出するために使用されます。 |
このページから32ビットアンチマルウェアアップデートファイルをダウンロードする必要があります。
これは、正しいファイルへの直接リンクである必要があります。
これにより、 mpam-fe.exeというファイルがダウンロードされます。これは、 cabextractで抽出できるキャビネットファイルです。ファイルをengineディレクトリに抽出します。
$ cabextract mpam-fe.exe
Extracting cabinet: mpam-fe.exe
extracting MPSigStub.exe
extracting mpavdlta.vdm
extracting mpasdlta.vdm
extracting mpavbase.vdm
extracting mpasbase.vdm
extracting mpengine.dll
All done, no errors.
どのバージョンを入手したかを知りたい場合は、これを試してみてください。
$ exiftool mpengine.dll | grep 'Product Version Number'
Product Version Number : 1.1.13701.0
メインのMPENGINEローダーはmpclientと呼ばれ、パラメーターとしてスキャンするファイル名を受け入れます。
$ ./mpclient netsky.exe
main(): Scanning netsky.exe...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Worm:Win32/Netsky.P@mm identified.
他にもいくつかのサンプルツール、 mpstreamfuzzとmpscriptがあります。
クラッシュをデバッグしたい場合は、ルーチンを通して単一のステップまたはブレークポイントを設定したい場合は、次の例に従ってください。まず、IDAのマップファイルが必要です。
Microsoftは、すべてのビルドのパブリックシンボルをリリースせず、リリース後数か月間シンボルが遅れている場合があります。パブリックシンボルを使用できるMPENGINEバージョンを使用していることを確認してください。
次のサンプルコマンドラインを使用して、マップファイルとIDBファイルを生成します。
> idaw -A -P+ -S"createmap.idc mpengine.map" mpengine.dll
Windowsでマップファイルを生成する場合、CRLFラインターミネーターを取得し、次のように修正します。
$ dos2unix mpengine.map
GDBでMPClientを実行すると、デバッガーを検出し、GDBをシンボルについて教えるために入力する必要があるコマンドを印刷します。
$ gdb -q ./mpclient
(gdb) r testfile.txt
Starting program: mpclient
main(): GDB: add-symbol-file engine/mpengine.dll 0xf6af4008+0x1000
main(): GDB: shell bash genmapsym.sh 0xf6af4008+0x1000 symbols_19009.o < mpengine.map
main(): GDB: add-symbol-file symbols_19009.o 0
Program received signal SIGTRAP, Trace/breakpoint trap.
0x0804d213 in main (argc=1, argv=0xffffcc64, envp=0xffffcc6c) at mpclient.c:156
156 __debugbreak();
(gdb)
GDBに表示するコマンドを入力すると、シンボルが利用可能になります。
genmapsym.sh、GNU awkを使用していると仮定していることに注意してください。
(gdb) add-symbol-file engine/mpengine.dll 0xf6af4008+0x1000
add symbol table from file "engine/mpengine.dll" at
.text_addr = 0xf6af5008
Reading symbols from engine/mpengine.dll...done.
(gdb) shell bash genmapsym.sh 0xf6af4008+0x1000 symbols_19009.o < mpengine.map
(gdb) add-symbol-file symbols_19009.o 0
add symbol table from file "symbols_19009.o" at
.text_addr = 0x0
Reading symbols from symbols_19009.o...done.
(gdb) p as3_parsemetadata_swf_vars_t
$1 = {void (void)} 0xf6feb842 <as3_parsemetadata_swf_vars_t>
その後、続行すると、通常どおり実行されます。
(gdb) c
ブレークポイント、ウォッチポイント、バックトレースはすべて通常のように機能しますが、ソフトウェアのブレークポイントよりもハードウェアブレークポイントを使用する方が信頼できる場合があります。
GDBでハードウェアブレークポイントを使用するには、 breakの代わりにhbまたはhbreakを使用するだけです。限られた数のハードウェアブレークポイントのみを取得することに注意してください。
(gdb) b as3_parsemethodinfo_swf_vars_t
Breakpoint 1 at 0xf6feb8da
(gdb) c
Continuing.
main(): Scanning test/input.swf...
EngineScanCallback(): Scanning input
Breakpoint 1, 0xf6feb8da in as3_parsemethodinfo_swf_vars_t ()
(gdb) bt
#0 0xf6feb8da in as3_parsemethodinfo_swf_vars_t ()
#1 0xf6dbad7f in SwfScanFunc ()
#2 0xf6d73ec3 in UfsScannerWrapper__ScanFile_scanresult_t ()
#3 0xf6d6c9e3 in UfsClientRequest__fscan_SCAN_REPLY ()
#4 0xf6d6a818 in UfsNode__ScanLoopHelper_wchar_t ()
#5 0xf6d6a626 in UfsNode__Analyze_UfsAnalyzeSetup ()
#6 0xf6d71f7f in UfsClientRequest__AnalyzeLeaf_wchar_t ()
#7 0xf6d71bb9 in UfsClientRequest__AnalyzePath_wchar_t ()
#8 0xf6dbbd88 in std___String_alloc_std___String_base_types_char_std__allocator_char______Myptr_void_ ()
#9 0xf6d75e72 in UfsCmdBase__ExecuteCmd__lambda_c80a88e180c1f4524a759d69aa15f87e____lambda_c80a88e180c1f4524a759d69aa15f87e__ ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb) x/3i $pc
=> 0xf6feb8da <as3_parsemethodinfo_swf_vars_t+7>: lea ebx,[edx+0x1c]
0xf6feb8dd <as3_parsemethodinfo_swf_vars_t+10>: push esi
0xf6feb8de <as3_parsemethodinfo_swf_vars_t+11>: mov edx,ebx
このプロジェクトは、ワインやウィネリブに取って代わるものではありません。
Winelibは、Windows C ++プロジェクトをLinuxに移植するために使用され、Wineは完全なWindowsアプリケーションを実行することを目的としています。このプロジェクトは、ネイティブLinuxコードが単純なWindows DLLをロードできるようにすることを目的としています。
最も近い類推は、ndiswrapperですが、ユーザースペースの場合です。
gpl2