ที่เก็บนี้มีไลบรารีที่อนุญาตให้โปรแกรม Linux ดั้งเดิมโหลดและเรียกใช้ฟังก์ชั่นการโทรจาก Windows DLL
เพื่อเป็นการสาธิตฉันได้ส่งผู้พิทักษ์ Windows ไปยัง Linux
$ ./mpclient eicar.com
main(): Scanning eicar.com...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Virus:DOS/EICAR_Test_File identified.
ไดเรกทอรี peloader มีตัวโหลด PE/Coff แบบกำหนดเองที่ได้มาจาก Ndiswrapper ห้องสมุดจะประมวลผลการย้ายถิ่นฐานและการนำเข้าจากนั้นให้ API ที่มีลักษณะคล้าย dlopen รหัสรองรับการดีบักด้วย GDB (รวมถึงสัญลักษณ์) คอลเลกชันการครอบคลุมบล็อกพื้นฐานและการเชื่อมต่อและการติดตั้งรันไทม์
ความตั้งใจคือการอนุญาตให้ปรับขนาดได้และมีประสิทธิภาพของไลบรารี Windows ที่มีอยู่ในตัวเองบน Linux ผู้สมัครที่ดีอาจเป็นตัวแปลงสัญญาณวิดีโอ, ห้องสมุดการบีบอัด, เครื่องสแกนไวรัส, ตัวถอดรหัสรูปภาพและอื่น ๆ
หากคุณต้องการเพิ่มการสนับสนุนสำหรับการนำเข้าภายนอกใด ๆ การเขียนต้นขั้วมักจะง่ายและรวดเร็ว
การกระจายแบบกระจายที่ปรับขนาดได้บน Windows อาจเป็นเรื่องที่ท้าทายและไม่มีประสิทธิภาพ นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับผลิตภัณฑ์รักษาความปลอดภัยปลายทางซึ่งใช้ส่วนประกอบที่เชื่อมต่อถึงกันที่ซับซ้อนซึ่งครอบคลุมทั่วเคอร์เนลและพื้นที่ผู้ใช้ สิ่งนี้มักจะต้องมีการปั่นสภาพแวดล้อม Windows เสมือนจริงทั้งหมดเพื่อฟอกหรือรวบรวมข้อมูลความครอบคลุม
นี่เป็นปัญหาที่น้อยลงของ Linux และฉันพบว่าส่วนประกอบการพอร์ตของผลิตภัณฑ์ Windows Antivirus ไปยัง Linux มักเป็นไปได้ สิ่งนี้ช่วยให้ฉันเรียกใช้รหัสที่ฉันกำลังทดสอบในคอนเทนเนอร์น้อยที่สุดที่มีค่าใช้จ่ายน้อยมากและขยายการทดสอบได้อย่างง่ายดาย
นี่เป็นเพียงความเห็นส่วนตัว แต่ฉันก็คิดว่า Linux มีเครื่องมือที่ดีกว่า ¯_(ツ)_/¯
MSMPENG เป็นบริการป้องกันมัลแวร์ที่เปิดใช้งานโดยค่าเริ่มต้นใน Windows 8, 8.1, 10, Windows Server 2016 และอื่น ๆ นอกจากนี้ Microsoft Security Essentials, System Center Endpoint Protect และผลิตภัณฑ์ความปลอดภัยของ Microsoft อื่น ๆ แบ่งปันเครื่องมือหลักเดียวกัน
องค์ประกอบหลักของ 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 | ใช้เพื่อสกัดคำจำกัดความ |
คุณจะต้องดาวน์โหลดไฟล์อัปเดต Antimalware 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 Line Terminators ให้แก้ไขเช่นนี้:
$ dos2unix mpengine.map
เมื่อคุณเรียกใช้ mpclient ภายใต้ GDB มันจะตรวจจับดีบักเกอร์และพิมพ์คำสั่งที่คุณต้องป้อนเพื่อสอน 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
จุดพักจุดเฝ้าดูและ backtraces ทำงานได้ตามปกติแม้ว่ามันอาจจะน่าเชื่อถือกว่าที่จะใช้เบรกพอยต์ของฮาร์ดแวร์มากกว่าจุดพักของซอฟต์แวร์
ในการใช้เบรกพอยต์ของฮาร์ดแวร์ใน 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
Winelib ใช้ในการพอร์ต Windows C ++ โครงการไปยัง Linux และไวน์มีวัตถุประสงค์เพื่อเรียกใช้แอพพลิเคชั่น Windows เต็มรูปแบบ โครงการนี้มีวัตถุประสงค์เพื่อให้โค้ด Linux ดั้งเดิมโหลด Windows DLL อย่างง่าย
การเปรียบเทียบที่ใกล้เคียงที่สุดคือ ndiswrapper แต่สำหรับผู้ใช้พื้นที่
GPL2