Ce référentiel contient une bibliothèque qui permet aux programmes Linux natifs de charger et d'appeler les fonctions à partir d'une DLL Windows.
Comme démonstration, j'ai porté Windows Defender à Linux.
$ ./mpclient eicar.com
main(): Scanning eicar.com...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Virus:DOS/EICAR_Test_File identified.
Le répertoire peloader contient un chargeur PE / COFF personnalisé dérivé de NDISWrapper. La bibliothèque traitera les délocalisations et les importations, puis fournira une API comme dlopen . Le code prend en charge le débogage avec GDB (y compris les symboles), la collecte de couverture de bloc de base et le crochet et le correctif d'exécution.
L'intention est de permettre une fuzzage évolutive et efficace des bibliothèques Windows autonomes sur Linux. Les bons candidats peuvent être des codecs vidéo, des bibliothèques de décompression, des scanners de virus, des décodeurs d'images, etc.
Si vous devez ajouter une prise en charge des importations externes, l'écriture de talons est généralement rapide et facile.
Le fuzzing distribué et évolutif sur Windows peut être difficile et inefficace. Cela est particulièrement vrai pour les produits de sécurité Endpoint, qui utilisent des composants interconnectés complexes qui s'étendent sur le noyau et l'espace utilisateur. Cela nécessite souvent de faire tourner un environnement Windows virtualisé entier pour les fuzz ou collecter des données de couverture.
C'est moins un problème sur Linux, et j'ai constaté que le portage des composants des produits antivirus Windows à Linux est souvent possible. Cela me permet d'exécuter le code que je teste dans un minimum de conteneurs avec très peu de frais généraux et de mettre à l'échelle facilement les tests.
C'est juste une opinion personnelle, mais je pense aussi que Linux a de meilleurs outils. ¯_(ツ)_/¯
MSMPENG est le service de protection contre les logiciels malveillants qui est activé par défaut sur Windows 8, 8.1, 10, Windows Server 2016, etc. De plus, Microsoft Security Essentials, System Center Endpoint Protection et divers autres produits Microsoft Security partagent le même moteur de base.
Le composant central du MSMPENG responsable de la numérisation et de l'analyse est appelé MPEngine. MPENGINE est une surface d'attaque vaste et complexe, comprenant des gestionnaires pour des dizaines de formats d'archives ésotériques, des emballeurs exécutables, des émulateurs de système complet pour diverses architectures et interprètes pour diverses langues. Tout ce code est accessible aux attaquants distants.
Pour construire le client de test, tapez simplement make .
$ make
Notez que les suffixes .i686 ou :i386 sont importants, nous avons besoin des bibliothèques 32 bits pour utiliser la DLL 32 bits.
| Fedora / Redhat | Ubuntu / Debian | Commentaire |
|---|---|---|
glibc-devel.i686 | libc6-dev:i386 / libc6-dev-i386 | Le nom varie avec la version. |
libgcc.i686 | gcc-multilib | |
readline-devel.i686 | libreadline-dev:i386 | Facultatif, utilisé dans MPScript. |
cabextract | cabextract | Utilisé pour extraire les définitions. |
Vous devrez télécharger le fichier de mise à jour anti-logiciel 32 bits à partir de cette page:
Cela devrait être un lien direct vers le bon fichier:
Cela téléchargera un fichier appelé mpam-fe.exe , qui est un fichier d'armoire qui peut être extrait avec cabextract . Extraire les fichiers dans le répertoire 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.
Si vous voulez savoir quelle version vous avez, essayez ceci:
$ exiftool mpengine.dll | grep 'Product Version Number'
Product Version Number : 1.1.13701.0
Le chargeur MPEngine principal est appelé mpclient , il accepte les noms de fichiers pour scanner sous forme de paramètre.
$ ./mpclient netsky.exe
main(): Scanning netsky.exe...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat Worm:Win32/Netsky.P@mm identified.
Il existe d'autres exemples d'outils, mpstreamfuzz et mpscript .
Si vous souhaitez déboguer un crash, un seul pas à travers une routine ou définir des points d'arrêt, suivez ces exemples. Tout d'abord, vous avez besoin d'un fichier de carte d'Ida.
Microsoft ne publie pas de symboles publics pour chaque version, et parfois les symboles sont à la traîne pendant quelques mois après la sortie. Assurez-vous que vous utilisez une version MPEngine avec des symboles publics disponibles.
Utilisez l'exemple de ligne de commande suivante pour générer des fichiers MAP et IDB.
> idaw -A -P+ -S"createmap.idc mpengine.map" mpengine.dll
Si vous générez les fichiers de carte sur Windows, vous obtiendrez des terminateurs de ligne CRLF, réparez-les comme ceci:
$ dos2unix mpengine.map
Lorsque vous exécutez MPClient sous GDB, il détectera un débogueur et imprimera les commandes que vous devez entrer pour enseigner à GDB les symboles:
$ 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)
Si vous entrez les commandes qu'il affiche en GDB, vous aurez des symboles disponibles.
Notez que
genmapsym.shsuppose que vous utilisez 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>
Ensuite, vous pouvez continuer et cela fonctionnera normalement.
(gdb) c
Les points d'arrêt, les points de surveillance et les contributions fonctionnent tous comme normaux, bien qu'il puisse être plus fiable d'utiliser les points d'arrêt matériel que les points d'arrêt du logiciel.
Pour utiliser les points d'arrêt matériel dans GDB, vous utilisez simplement hb ou hbreak au lieu de break . Notez que vous n'obtenez qu'un nombre limité de points d'arrêt matériel.
(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
Ce projet ne remplace pas le vin ou le Vinelib.
Winelib est utilisé pour porter les projets Windows C ++ vers Linux, et le vin est destiné à exécuter des applications Windows complètes. Ce projet est destiné à permettre au code Linux natif de charger des DLL Windows simples.
L'analogie la plus proche serait ndiswrapper mais pour l'espace utilisateur.
Gpl2