Common API used in Malware
Last updated
Last updated
Groupe de sécurité Try Hard
Sockets bruts | Sockets WinAPI |
---|---|
socket() | WSAStratup() |
bind() | bind() |
listen() | listen() |
accept() | accept() |
connect() | connect() |
read()/recv() | recv() |
write() | send() |
shutdown() | WSACleanup() |
Registre | Fichier | Service |
---|---|---|
RegCreateKeyEx() | GetTempPath() | OpenSCManager |
RegOpenKeyEx() | CopyFile() | CreateService() |
RegSetValueEx() | CreateFile() | StartServiceCtrlDispatcher() |
RegDeleteKeyEx() | WriteFile() | |
RegGetValue() | ReadFile() |
Nom |
---|
WinCrypt |
CryptAcquireContext() |
CryptGenKey() |
CryptDeriveKey() |
CryptDecrypt() |
CryptReleaseContext() |
Nom de la fonction | Instructions d'assemblage |
---|---|
IsDebuggerPresent() | CPUID() |
GetSystemInfo() | IN() |
GlobalMemoryStatusEx() | |
GetVersion() | |
CreateToolhelp32Snapshot [Vérifier si un processus est en cours d'exécution] | |
CreateFileW/A [Vérifier si un fichier existe] |
Nom | |
---|---|
VirtualAlloc | Allouer de la mémoire (packers) |
VirtualProtect | Changer les autorisations de mémoire (packer donnant l'autorisation d'exécution à une section) |
ReadProcessMemory | Injection dans des processus externes |
WriteProcessMemoryA/W | Injection dans des processus externes |
NtWriteVirtualMemory | |
CreateRemoteThread | Injection de DLL/processus... |
NtUnmapViewOfSection | |
QueueUserAPC | |
CreateProcessInternalA/W |
Nom de la fonction |
---|
CreateProcessA/W |
ShellExecute |
WinExec |
ResumeThread |
NtResumeThread |
GetAsyncKeyState() -- Enregistrement des touches
SetWindowsHookEx -- Enregistrement des touches
GetForeGroundWindow -- Obtenir le nom de la fenêtre en cours d'exécution (ou le site web d'un navigateur)
LoadLibrary() -- Importer une bibliothèque
GetProcAddress() -- Importer une bibliothèque
CreateToolhelp32Snapshot() -- Liste des processus en cours d'exécution
GetDC() -- Capture d'écran
BitBlt() -- Capture d'écran
InternetOpen(), InternetOpenUrl(), InternetReadFile(), InternetWriteFile() -- Accéder à Internet
FindResource(), LoadResource(), LockResource() -- Accéder aux ressources de l'exécutable
Exécuter une DLL arbitraire à l'intérieur d'un autre processus
Localiser le processus pour injecter la DLL malveillante : CreateToolhelp32Snapshot, Process32First, Process32Next
Ouvrir le processus : GetModuleHandle, GetProcAddress, OpenProcess
Écrire le chemin de la DLL dans le processus : VirtualAllocEx, WriteProcessMemory
Créer un thread dans le processus qui chargera la DLL malveillante : CreateRemoteThread, LoadLibrary
Autres fonctions à utiliser : NTCreateThreadEx, RtlCreateUserThread
Charger une DLL malveillante sans appeler les appels API Windows normaux. La DLL est mappée à l'intérieur d'un processus, elle résoudra les adresses d'importation, corrigera les relocalisations et appellera la fonction DllMain.
Trouver un thread d'un processus et le faire charger une DLL malveillante
Trouver un thread cible : CreateToolhelp32Snapshot, Thread32First, Thread32Next
Ouvrir le thread : OpenThread
Suspendre le thread : SuspendThread
Écrire le chemin de la DLL malveillante à l'intérieur du processus cible : VirtualAllocEx, WriteProcessMemory
Reprendre le thread en chargeant la bibliothèque : ResumeThread
Injection d'exécution portable : L'exécutable sera écrit dans la mémoire du processus cible et sera exécuté à partir de là.
Le logiciel malveillant désallouera le code légitime de la mémoire du processus et chargera un binaire malveillant
Créer un nouveau processus : CreateProcess
Désallouer la mémoire : ZwUnmapViewOfSection, NtUnmapViewOfSection
Écrire le binaire malveillant dans la mémoire du processus : VirtualAllocEc, WriteProcessMemory
Définir le point d'entrée et exécuter : SetThreadContext, ResumeThread
La SSDT (Table des descripteurs de services système) pointe vers les fonctions du noyau (ntoskrnl.exe) ou du pilote GUI (win32k.sys) afin que les processus utilisateur puissent appeler ces fonctions.
Un rootkit peut modifier ces pointeurs vers des adresses qu'il contrôle
Les IRP (Paquets de requête d'E/S) transmettent des morceaux de données d'un composant à un autre. Presque tout dans le noyau utilise des IRP et chaque objet de périphérique a sa propre table de fonctions qui peut être accrochée : DKOM (Manipulation directe d'objets noyau)
L'IAT (Table d'adresses d'importation) est utile pour résoudre les dépendances. Il est possible d'accrocher cette table afin de détourner le code qui sera appelé.
Accrochage de l'EAT (Table d'adresses d'exportation). Ces accrochages peuvent être faits depuis l'espace utilisateur. Le but est d'accrocher les fonctions exportées par les DLL.
Accrochages en ligne : Ce type est difficile à réaliser. Cela implique de modifier le code des fonctions elles-mêmes. Peut-être en mettant un saut au début de celles-ci.
Groupe de sécurité Try Hard