Этот репозиторий содержит библиотеку, которая позволяет нативным программам 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 Loader, полученный из NDISWRAPPER. Библиотека будет обрабатывать переезды и импорт, а затем предоставит dlopen -подобный API. Код поддерживает отладку с GDB (включая символы), базовую коллекцию покрытия блоков, а также зацепление и исправление времени выполнения.
Намерение состоит в том, чтобы позволить масштабируемому и эффективному пузырьке автономных библиотек Windows на Linux. Хорошими кандидатами могут быть видеокодеки, декомпрессионные библиотеки, вирусные сканеры, декодеры изображений и так далее.
Если вам нужно добавить поддержку для любого внешнего импорта, написание заглушек обычно быстро и просто.
Распределенное масштабируемое пузырь на окнах может быть сложным и неэффективным. Это особенно верно для продуктов безопасности конечных точек, которые используют сложные взаимосвязанные компоненты, которые охватывают ядро и пространство пользователя. Это часто требует раскручивания всей виртуализированной среды Windows, чтобы избавиться от них или сбора данных охвата.
Это менее проблема в Linux, и я обнаружил, что переносительные компоненты антивирусных продуктов Windows часто возможны. Это позволяет мне запустить код, который я тестирую в минимальных контейнерах с очень небольшим количеством накладных расходов, и легко расширить тестирование.
Это просто личное мнение, но я также думаю, что у Linux есть лучшие инструменты. ¯_(ツ)_/¯
MSMPENG - это служба защиты от вредоносных программ, которая по умолчанию включена в Windows 8, 8.1, 10, Windows Server 2016 и так далее. Кроме того, Microsoft Security Essentials, защита конечных точек системы и различные другие продукты безопасности Microsoft имеют один и тот же основной двигатель.
Основной компонент MSMPENG, ответственный за сканирование и анализ, называется MPENGINE. MpEngine - это обширная и сложная поверхность атаки, состоящая из обработчиков для десятков эзотерических архивных форматов, исполняемых упаковщиков, полных системных эмуляторов для различных архитектур и переводчиков для различных языков. Весь этот код доступен для удаленных злоумышленников.
Чтобы создать тестовый клиент, просто введите make .
$ make
Обратите внимание, что суффиксы .i686 или :i386 важны, нам нужны 32 -битные библиотеки, чтобы использовать 32 -битный DLL.
| Федора / Редхат | 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 с доступными общественными символами.
Используйте следующую пример командную линию для генерации файлов MAP и IDB.
> idaw -A -P+ -S"createmap.idc mpengine.map" mpengine.dll
Если вы генерируете файлы карты в Windows, вы получите терминаторы линии CRLF, исправьте их так:
$ 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
Точки останова, точки наблюдения и отступники работают как нормально, хотя это может быть более надежным для использования аппаратных точек останова, чем точки прорыва программного обеспечения.
Чтобы использовать аппаратные точки останова в 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 загружать простые DLL Windows.
Самая близкая аналогия была бы ndiswrapper, но для пользователя.
GPL2