Este repositório contém uma biblioteca que permite que os programas nativos do Linux carreguem e chamem funções de uma DLL do Windows.
Como demonstração, portei o Windows Defender para o Linux.
$ ./mpclient eicar.com
main(): Scanning eicar.com...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Virus:DOS/EICAR_Test_File identified.
O diretório peloader contém um carregador PE/coff personalizado derivado do NDisWrapper. A biblioteca processará as realocações e importações e fornecerá uma API do tipo dlopen . O código suporta a depuração com o GDB (incluindo símbolos), a coleta básica de cobertura do bloco e a risca e a aderência do tempo de execução.
A intenção é permitir a difusão escalável e eficiente de bibliotecas do Windows independentes no Linux. Bons candidatos podem ser codecs de vídeo, bibliotecas de descompressão, scanners de vírus, decodificadores de imagem e assim por diante.
Se você precisar adicionar suporte para quaisquer importações externas, a escrita de stubs geralmente é rápida e fácil.
A difusão distribuída e escalável nas janelas pode ser desafiadora e ineficiente. Isso é especialmente verdadeiro para produtos de segurança do endpoint, que usam componentes interconectados complexos que abrangem o espaço do kernel e do usuário. Isso geralmente requer rotear um ambiente de Windows virtualizado inteiro para confundi -los ou coletar dados de cobertura.
Isso é menos um problema no Linux, e descobri que a porção de componentes dos produtos antivírus do Windows para o Linux é frequentemente possível. Isso me permite executar o código que estou testando em contêineres mínimos com muito pouca sobrecarga e ampliando facilmente os testes.
Isso é apenas uma opinião pessoal, mas também acho que o Linux tem melhores ferramentas. ¯_(ツ)_/¯
O MSMPeng é o serviço de proteção de malware ativado por padrão no Windows 8, 8.1, 10, Windows Server 2016 e assim por diante. Além disso, o Microsoft Security Essentials, o System Center endpoint Protection e vários outros produtos de segurança do Microsoft compartilham o mesmo mecanismo principal.
O componente central do MSMPENG responsável pela digitalização e análise é chamado de MPENGINE. O MPengine é uma superfície de ataque vasta e complexa, composta por manipuladores de dezenas de formatos de arquivo esotéricos, empacotadores executáveis, emuladores de sistema completo para várias arquiteturas e intérpretes para vários idiomas. Todo esse código é acessível a atacantes remotos.
Para construir o cliente de teste, basta digitar make .
$ make
Observe que os sufixos .i686 ou :i386 são importantes, precisamos das bibliotecas de 32 bits para usar a DLL de 32 bits.
| Fedora / Redhat | Ubuntu / Debian | Comentário |
|---|---|---|
glibc-devel.i686 | libc6-dev:i386 / libc6-dev-i386 | O nome varia com a versão. |
libgcc.i686 | gcc-multilib | |
readline-devel.i686 | libreadline-dev:i386 | Opcional, usado no MPScript. |
cabextract | cabextract | Usado para extrair definições. |
Você precisará baixar o arquivo de atualização de antimalware de 32 bits desta página:
Este deve ser um link direto para o arquivo certo:
Isso baixará um arquivo chamado mpam-fe.exe , que é um arquivo de gabinete que pode ser extraído com cabextract . Extraia os arquivos no diretório 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.
Se você quiser saber qual versão você obteve, tente o seguinte:
$ exiftool mpengine.dll | grep 'Product Version Number'
Product Version Number : 1.1.13701.0
O principal carregador de MPengine é chamado mpclient , ele aceita nomes de arquivos para digitalizar como um parâmetro.
$ ./mpclient netsky.exe
main(): Scanning netsky.exe...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Worm:Win32/Netsky.P@mm identified.
Existem outras ferramentas de amostra, mpstreamfuzz e mpscript .
Se você deseja depurar um acidente, um passo único por uma rotina ou definir pontos de interrupção, siga esses exemplos. Primeiro, você precisa de um arquivo de mapa da IDA.
A Microsoft não libera símbolos públicos para todas as compilações e, às vezes, os símbolos ficam para trás por alguns meses após o lançamento. Verifique se você está usando uma versão do MPengine com símbolos públicos disponíveis.
Use a seguinte linha de comando de amostra para gerar arquivos de mapa e iDB.
> idaw -A -P+ -S"createmap.idc mpengine.map" mpengine.dll
Se você gerar os arquivos do mapa no Windows, obterá os terminadores de linha CRLF, corrige -os assim:
$ dos2unix mpengine.map
Quando você executa o MPClient sob o GDB, ele detectará um depurador e imprime os comandos que você precisa entrar para ensinar GDB sobre os símbolos:
$ 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)
Se você inserir os comandos que ele aparecer no GDB, você terá símbolos disponíveis.
Observe que
genmapsym.shassume que você está usando o 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>
Então você pode continuar e será executado normalmente.
(gdb) c
Pontos de interrupção, pontos de observação e traseiros funcionam normalmente, embora possa ser mais confiável usar pontos de interrupção de hardware do que pontos de interrupção do software.
Para usar pontos de interrupção de hardware no GDB, basta usar hb ou hbreak em vez de break . Observe que você obtém apenas um número limitado de pontos de interrupção de hardware.
(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
Este projeto não substitui o vinho ou o winelib.
O WinElib é usado para portar projetos de porte do Windows C ++ para o Linux, e o vinho destina -se a executar aplicativos completos do Windows. Este projeto destina -se a permitir que o código Linux nativo carregue DLLs simples do Windows.
A analogia mais próxima seria o NDisWrapper, mas para o Usuários Space.
GPL2