Common API used in Malware
Genérico
Rede
Sockets Brutos | Sockets WinAPI |
---|---|
socket() | WSAStratup() |
bind() | bind() |
listen() | listen() |
accept() | accept() |
connect() | connect() |
read()/recv() | recv() |
write() | send() |
shutdown() | WSACleanup() |
Persistência
Registro | Arquivo | Serviço |
---|---|---|
RegCreateKeyEx() | GetTempPath() | OpenSCManager |
RegOpenKeyEx() | CopyFile() | CreateService() |
RegSetValueEx() | CreateFile() | StartServiceCtrlDispatcher() |
RegDeleteKeyEx() | WriteFile() | |
RegGetValue() | ReadFile() |
Criptografia
Nome |
---|
WinCrypt |
CryptAcquireContext() |
CryptGenKey() |
CryptDeriveKey() |
CryptDecrypt() |
CryptReleaseContext() |
Anti-Análise/VM
Nome da Função | Instruções de Assembly |
---|---|
IsDebuggerPresent() | CPUID() |
GetSystemInfo() | IN() |
GlobalMemoryStatusEx() | |
GetVersion() | |
CreateToolhelp32Snapshot [Verificar se um processo está em execução] | |
CreateFileW/A [Verificar se um arquivo existe] |
Stealth
Nome | |
---|---|
VirtualAlloc | Alocar memória (packers) |
VirtualProtect | Alterar permissão de memória (packer dando permissão de execução a uma seção) |
ReadProcessMemory | Injeção em processos externos |
WriteProcessMemoryA/W | Injeção em processos externos |
NtWriteVirtualMemory | |
CreateRemoteThread | Injeção de DLL/Processo... |
NtUnmapViewOfSection | |
QueueUserAPC | |
CreateProcessInternalA/W |
Execução
Nome da Função |
---|
CreateProcessA/W |
ShellExecute |
WinExec |
ResumeThread |
NtResumeThread |
Diversos
GetAsyncKeyState() -- Registro de teclas
SetWindowsHookEx -- Registro de teclas
GetForeGroundWindow -- Obter nome da janela em execução (ou o site de um navegador)
LoadLibrary() -- Importar biblioteca
GetProcAddress() -- Importar biblioteca
CreateToolhelp32Snapshot() -- Listar processos em execução
GetDC() -- Captura de tela
BitBlt() -- Captura de tela
InternetOpen(), InternetOpenUrl(), InternetReadFile(), InternetWriteFile() -- Acessar a Internet
FindResource(), LoadResource(), LockResource() -- Acessar recursos do executável
Técnicas de Malware
Injeção de DLL
Executar uma DLL arbitrária dentro de outro processo
Localizar o processo para injetar a DLL maliciosa: CreateToolhelp32Snapshot, Process32First, Process32Next
Abrir o processo: GetModuleHandle, GetProcAddress, OpenProcess
Escrever o caminho para a DLL dentro do processo: VirtualAllocEx, WriteProcessMemory
Criar uma thread no processo que carregará a DLL maliciosa: CreateRemoteThread, LoadLibrary
Outras funções a serem usadas: NTCreateThreadEx, RtlCreateUserThread
Injeção de DLL Reflexiva
Carregar uma DLL maliciosa sem chamar as chamadas normais da API do Windows. A DLL é mapeada dentro de um processo, resolverá os endereços de importação, corrigirá as realocações e chamará a função DllMain.
Sequestro de Thread
Encontrar uma thread de um processo e fazer com que ela carregue uma DLL maliciosa
Encontrar uma thread alvo: CreateToolhelp32Snapshot, Thread32First, Thread32Next
Abrir a thread: OpenThread
Suspender a thread: SuspendThread
Escrever o caminho para a DLL maliciosa dentro do processo da vítima: VirtualAllocEx, WriteProcessMemory
Retomar a thread carregando a biblioteca: ResumeThread
Injeção PE
Injeção de Execução Portátil: O executável será escrito na memória do processo da vítima e será executado a partir daí.
Hollowing de Processo
O malware irá desmapear o código legítimo da memória do processo e carregar um binário malicioso
Criar um novo processo: CreateProcess
Desmapear a memória: ZwUnmapViewOfSection, NtUnmapViewOfSection
Escrever o binário malicioso na memória do processo: VirtualAllocEc, WriteProcessMemory
Definir o ponto de entrada e executar: SetThreadContext, ResumeThread
Hooking
A SSDT (Tabela de Descritores de Serviço do Sistema) aponta para funções do kernel (ntoskrnl.exe) ou driver GUI (win32k.sys) para que processos de usuário possam chamar essas funções.
Um rootkit pode modificar esses ponteiros para endereços que ele controla
IRP (Pacotes de Solicitação de I/O) transmitem pedaços de dados de um componente para outro. Quase tudo no kernel usa IRPs e cada objeto de dispositivo tem sua própria tabela de funções que pode ser hookada: DKOM (Manipulação Direta de Objetos do Kernel)
A IAT (Tabela de Endereços de Importação) é útil para resolver dependências. É possível hookar esta tabela para sequestrar o código que será chamado.
EAT (Tabela de Endereços de Exportação) Hooks. Esses hooks podem ser feitos a partir do userland. O objetivo é hookar funções exportadas por DLLs.
Inline Hooks: Este tipo é difícil de alcançar. Isso envolve modificar o código das próprias funções. Talvez colocando um salto no início delas.
Last updated