mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
140 lines
6.9 KiB
Markdown
140 lines
6.9 KiB
Markdown
# API courantes utilisées dans les logiciels malveillants
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|
|
|
|
## Générique
|
|
|
|
### Réseau
|
|
|
|
| Sockets bruts | Sockets WinAPI |
|
|
| --------------- | -------------- |
|
|
| socket() | WSAStratup() |
|
|
| bind() | bind() |
|
|
| listen() | listen() |
|
|
| accept() | accept() |
|
|
| connect() | connect() |
|
|
| read()/recv() | recv() |
|
|
| write() | send() |
|
|
| shutdown() | WSACleanup() |
|
|
|
|
### Persistance
|
|
|
|
| Registre | Fichier | Service |
|
|
| ---------------- | ------------- | ---------------------------- |
|
|
| RegCreateKeyEx() | GetTempPath() | OpenSCManager |
|
|
| RegOpenKeyEx() | CopyFile() | CreateService() |
|
|
| RegSetValueEx() | CreateFile() | StartServiceCtrlDispatcher() |
|
|
| RegDeleteKeyEx() | WriteFile() | |
|
|
| RegGetValue() | ReadFile() | |
|
|
|
|
### Chiffrement
|
|
|
|
| Nom |
|
|
| --------------------- |
|
|
| WinCrypt |
|
|
| CryptAcquireContext() |
|
|
| CryptGenKey() |
|
|
| CryptDeriveKey() |
|
|
| CryptDecrypt() |
|
|
| CryptReleaseContext() |
|
|
|
|
### Anti-analyse/VM
|
|
|
|
| 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] | |
|
|
|
|
### Discrétion
|
|
|
|
| Nom | |
|
|
| ----------------------- | -------------------------------------------------------------------------- |
|
|
| VirtualAlloc | Allouer de la mémoire (packers) |
|
|
| VirtualProtect | Changer les permissions de mémoire (packer donnant la permission 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| |
|
|
|
|
### Exécution
|
|
|
|
| Nom de la fonction |
|
|
| --------------------- |
|
|
| CreateProcessA/W |
|
|
| ShellExecute |
|
|
| WinExec |
|
|
| ResumeThread |
|
|
| NtResumeThread |
|
|
|
|
### Divers
|
|
|
|
- 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() -- Lister les 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
|
|
|
|
## Techniques de logiciels malveillants
|
|
|
|
### Injection de DLL
|
|
|
|
Exécuter une DLL arbitraire à l'intérieur d'un autre processus
|
|
|
|
1. Localiser le processus pour injecter la DLL malveillante : CreateToolhelp32Snapshot, Process32First, Process32Next
|
|
2. Ouvrir le processus : GetModuleHandle, GetProcAddress, OpenProcess
|
|
3. Écrire le chemin vers la DLL à l'intérieur du processus : VirtualAllocEx, WriteProcessMemory
|
|
4. Créer un thread dans le processus qui chargera la DLL malveillante : CreateRemoteThread, LoadLibrary
|
|
|
|
Autres fonctions à utiliser : NTCreateThreadEx, RtlCreateUserThread
|
|
|
|
### Injection de DLL réfléchissante
|
|
|
|
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 relocations et appellera la fonction DllMain.
|
|
|
|
### Détournement de thread
|
|
|
|
Trouver un thread d'un processus et le faire charger une DLL malveillante
|
|
|
|
1. Trouver un thread cible : CreateToolhelp32Snapshot, Thread32First, Thread32Next
|
|
2. Ouvrir le thread : OpenThread
|
|
3. Suspendre le thread : SuspendThread
|
|
4. Écrire le chemin vers la DLL malveillante à l'intérieur du processus de la victime : VirtualAllocEx, WriteProcessMemory
|
|
5. Reprendre le thread chargeant la bibliothèque : ResumeThread
|
|
|
|
### Injection PE
|
|
|
|
Injection d'exécution portable : L'exécutable sera écrit dans la mémoire du processus de la victime et sera exécuté à partir de là.
|
|
|
|
### Hollowing de processus
|
|
|
|
Le logiciel malveillant va désmapper le code légitime de la mémoire du processus et charger un binaire malveillant
|
|
|
|
1. Créer un nouveau processus : CreateProcess
|
|
2. Désmapper la mémoire : ZwUnmapViewOfSection, NtUnmapViewOfSection
|
|
3. Écrire le binaire malveillant dans la mémoire du processus : VirtualAllocEc, WriteProcessMemory
|
|
4. Définir le point d'entrée et exécuter : SetThreadContext, ResumeThread
|
|
|
|
## Hooking
|
|
|
|
- Le **SSDT** (**System Service Descriptor Table**) pointe vers des fonctions du noyau (ntoskrnl.exe) ou un pilote GUI (win32k.sys) afin que les processus utilisateurs puissent appeler ces fonctions.
|
|
- Un rootkit peut modifier ces pointeurs vers des adresses qu'il contrôle.
|
|
- **IRP** (**I/O Request Packets**) 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 hookée : DKOM (Direct Kernel Object Manipulation)
|
|
- Le **IAT** (**Import Address Table**) est utile pour résoudre les dépendances. Il est possible de hooker cette table afin de détourner le code qui sera appelé.
|
|
- **EAT** (**Export Address Table**) Hooks. Ces hooks peuvent être réalisés depuis **userland**. L'objectif est de hooker les fonctions exportées par les DLL.
|
|
- **Inline Hooks** : 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.
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|