常用于恶意软件执行特定任务的API调用:
键盘记录器
轮询键盘状态或通过安装与键盘事件相关的钩子
-
GetAsyncKeyState()
:使用此函数来轮询键盘上每个键的状态。 -
GetKeyState()
:API调用(例如,检查Shift键是否被按下)。 -
SetWindowsHookExA()
:可以用来安装WH_KEYBOARD
和WH_MOUSE
事件的钩子。
网络流量监控
-
使用
WSASocket()
或socket()
来创建原始套接字。 -
使用
bind()
将套接字绑定到接口(网卡)。 -
使用
WSAIoctl()
或ioctlsocket()
将接口(网卡)设置为混杂模式。SIO_RECVALL
参数告诉操作系统将网络卡设置为混杂模式。
下载器
-
URLDownloadToFile()
:下载文件并保存到磁盘。 -
ShellExecute()
、WinExec()
等:执行新创建的文件。
HTTP CNC 流量
当在恶意软件中实现CNC时,由于HTTP的无状态特性,它应该与C2服务器保持持续联系。以下是用于创建HTTP会话的一些常用API调用:
-
InternetOpen()
,例如:InternetOpen(USER_AGENT,INTERNET_OPEN_TYPE_PROXY,argv[2],0,0)
。 -
InternetConnect()
:URL输入。 -
构建HTTP请求(
HttpOpenRequest()
、HttpAddRequestHeaders()
)。 -
HTTPSendRequest()
:发送HTTP请求。 -
InternetReadFile()
:读取响应,这可能意味着样本正在读取响应。
下发程序(DROPPERS)
一些下发程序将文件嵌入到自己的资源部分(例如:资源“.rsrc”部分)。用于管理资源的API调用包括:
-
FindResource
-
LoadResource
-
SizeOfResource
-
LockResource
DLL注入功能调用
-
使用
SetWindowsHookEx()
-
LoadLibraryA():将恶意DLL加载到攻击进程的地址空间中。
-
GetProcAddress():在远程进程中检索过滤函数的地址。
-
GetWindowsThreadProcessId():获取目标线程的ID。
-
SetWindowsHookEx():在远程进程的钩子链中安装过滤函数,仅适用于GUI应用程序,可以在一次调用中注入所有应用程序。
-
BroadcastSystemMessage():用于将消息从攻击进程发送到受害者进程(内部)。
-
GetMessage()
-
DispatchMessage()
-
使用CreateRemoteThread()
-
OpenProcess():通过此函数,攻击进程可以与目标受害进程通信。
-
VirtualAllocEx():允许一个进程在另一个进程内分配内存空间(用于存储恶意DLL的字符串名称)。
-
WriteProcessMemory():一个进程可以在另一个进程的内存空间中写入数据(非常可疑),通过这个方式,受害进程将被注入一个字符串,可以后续加载到LoadLibraryA()函数调用中。
-
GetModuleHandle():允许进程确定如何访问可能加载到内存空间的某个DLL,定位kernal32.dll(用于实现loadlibrary函数)。
-
GetProcAddress():用于定位kernel32.dll文件中LoadLibrary()的地址。
-
CreateRemoteThread():将在远程进程内创建一个远程线程,其中函数的地址将作为参数传递给新线程。一旦创建了新线程,此调用将执行以下操作:
-
在远程进程中创建一个新线程。
-
在新创建的线程中运行LoadLibraryA。
-
LoadLibraryA将恶意DLL加载到远程地址空间中。适用于所有应用程序,但仅适用于NT/XP系统。
API HOOK:R3函数
HOOK用户空间函数的固定步骤包括:
-
GetProcAddress:查找要挂钩的函数的地址。
-
VirtualProtect():设置内存保护为读/写。
-
ReadProcessMemory()或手动复制:保存受害者的前几个字节。
-
计算新的指令:通常是跳转到rootkit代码。
-
覆盖受害者函数的前几个字节:手动复制、WriteProcessMemory()。
-
VirtualProtect():恢复内存权限到原始值。
进程镂空API
-
CreateProcessA-> 以挂起状态创建一个进程。
-
NtUnmapViewOfSection-> 从内存中取消映射原始进程的内容(即,进程以挂起状态启动,其内容被清空,使其成为空壳)。
-
VirtualAllocEx-> 在空壳进程中分配新的内存地址。
-
WriteProcessMemory-> 向空壳进程注入全新的代码。
-
ResumeThread-> 恢复进程。
一些反调试/虚拟机检测
-
GetTickCount-> 用于检测是否存在调试器。
-
CountClipboardFormats-> 用于确定受害者的剪贴板是否为空。
-
GetForeGroundWindow-> 用于检查前台窗口的颜色是否变化,假定自动化沙盒工具不会切换活动窗口。
-
IsDebuggerPresent-> 检测调试器。
一些常规API调用
-
Fopen():打开文件以进行读取。
-
Sscanf():用于解析字符串。
-
ReadFile():通过查看句柄(hFile)来确定要读取的文件,句柄在Kernel32.dll中可用。
-
CreateFileA():不仅用于创建新文件,还用于读取现有文件。
-
CreateToolhelp32Snapshot():获取当前运行的进程列表。
-
Process32First():开始迭代从CreateToolhelp32Snapshot()获取的列表。
-
FindWindowsA():查找具有指定标题名或调用的特定窗口。此API调用检索与指定字符串匹配的类名和窗口名的顶级窗口的句柄(搜索以不区分大小写方式进行)。
-
RegSetValueEx():用于禁用用户帐户控制弹出窗口。
-
CreateThread():在当前进程中的单独线程中运行,启动线程。
-
GetEIP-> SHELLCODE通常用于确定其加载到内存中的位置。
-
GetFileSize():SHELLCODE通常使用此函数来遍历所有可能的句柄值,以确定自己的文档,通过比较大小来识别并引入更多可执行文件。
-
malloc:通过调用此函数在堆上分配内存。
-
free:通过调用此FREE函数,操作系统将通过HEAP缓冲区漏洞利用执行SHELLCODE。
-
GetTempPathA():获取临时文件夹的位置,用于下载文件。
-
WinExec():执行下载的文件。
其他有趣的调用:
-
AdjustTokenPrivileges、CallNextHookEx、CreateMutexA、DispatchMessageA、ExitWindowsEx、FindClose、FindResourceA、FlushFileBuffers、FreeEnvironmentStringsA、FreeEnvironmentStringsW、FreeLibrary、GetCommandLineA、GetCurrentProcess、GetCurrentThreadId、GetExitCodeProcess、GetExitCodeThread、GetFileAttributesA、GetFileType、GetForegroundWindow、GetKeyboardState、GetModuleHandleA、GetStartupInfoA、GetSystemDirectoryA、GetTickCount、GetUserNameA、GetVersionExA、GetWindowsDirectoryA、GlobalMemoryStatus、HeapCreate、ioctlsocket、keybd_event、LookupPrivilegeValueA、MapVirtualKeyA、mciSendStringA、MoveFileA、OleInitialize、OpenProcessToken、PeekMessageA、PeekNamedPipe、PostMessageA、RaiseException、RasEnumConnectionsA、RasGetConnectStatusA、SetEnvironmentVariableA、SetFileAttributesA、SetFileTime、SetKeyboardState、SetStdHandle、SetUnhandledExceptionFilter、UnhandledExceptionFilter、UnhookWindowsHookEx、URLDownloadToFileA、VirtualAlloc、WSAAsyncSelect、WSACleanup、WSAGetLastError、WSAStartup、RegCreateKeyA、RegCreateKeyExA、RegDeleteValueA、RegOpenKeyA等等。
原文始发于微信公众号(TIPFactory情报工厂):恶意软件TIPs -- 常用API
- 我的微信
- 微信扫一扫
-
- 我的微信公众号
- 微信扫一扫
-
评论