該存儲庫包含一個庫,該庫允許本機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目錄包含一個自定義的PE/COFF加載程序,該定制量來自NDISWRAPPER。庫將處理重新定位和導入,然後提供類似dlopen的API。該代碼支持GDB(包括符號),基本塊覆蓋範圍集合以及運行時鉤和修補程序的調試。
目的是允許Linux上的自包含Windows庫的可擴展和高效的模糊。好的候選人可能是視頻編解碼器,減壓庫,病毒掃描儀,圖像解碼器等。
如果您需要添加對任何外部進口的支持,則寫存根通常很快,簡單。
窗戶上的分佈式,可擴展的模糊可能具有挑戰性且效率低下。對於端點安全產品尤其如此,端點安全產品使用跨越內核和用戶空間的複雜互連組件。這通常需要旋轉整個虛擬化的Windows環境,以模糊它們或收集覆蓋範圍數據。
這在Linux上不是一個問題,我發現將Windows Antivirus產品的移植組件轉換為Linux是可能的。這使我可以在最小容器中運行要測試的代碼,而開銷很少,並且可以輕鬆擴展測試。
這只是個人意見,但我也認為Linux具有更好的工具。 ¯_(ツ)_/¯
MSMPeng是惡意軟件保護服務,默認情況下在Windows 8、8.1、10,Windows Server 2016等上啟用。此外,Microsoft Security Essentials,System Center Endpoint保護和其他各種Microsoft Security產品共享相同的核心引擎。
負責掃描和分析的MSMPENG的核心組成部分稱為MPENGINE。 Mpengine是一個巨大而復雜的攻擊表面,包括數十個深奧的檔案格式,可執行的包裝工,各種架構的完整系統模擬器和各種語言的口譯器的完整系統模擬器。所有這些代碼均可訪問遠程攻擊者。
要構建測試客戶端,只需鍵入make 。
$ make
請注意, .i686或:i386後綴很重要,我們需要32位庫來使用32位DLL。
| 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的地圖文件。
微軟並沒有為每個構建發佈公共符號,有時在發布後幾個月落後了符號。確保您使用的是帶有公共符號的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尷尬。
(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中使用硬件斷點,您只需使用hb或hbreak而不是break即可。請注意,您只能獲得有限數量的硬件斷點。
(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移植,葡萄酒旨在運行完整的Windows應用程序。該項目旨在允許本機Linux代碼加載簡單的Windows DLL。
最接近的類比是NDISWRAPPER,但對於用戶空間。
GPL2