木马常用dll/api函数
前言
微软提供了很多dll,被木马经常使用的也有很多,没有必要全部记下来,碰到了去查 msdn 就好了,但是有时候官方文档机翻过比较晦涩难懂,所以本文主要列举了常用的dll/api 以及对应的功能,希望对大家有所帮助,就当一篇索引吧。
DLL
Kernel32.dll
Kernel32.dll 包括 Windows操作系统最基本的功能,比如文件系统、设备访问、进程、线程、内存、错误处理等。这些功能基本上是所有操作系统都提供的功能。
以下内容来自百度百科
1 | kernel32.dll是Windows 9x/Me中非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理,当Windows启动时,kernel32.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。 |
这是百度的说法,其实是有问题的,Kernel32.dll 并不是内核层的dll,而是属于用户层。Kernel32.dll 属于子系统dll,作用就是提供一个进入内核层的接口。
接口就是,ssdt表,把ring3的Win32 API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。
ssdt通过修改此表的函数地址可以对常用windows函数进行hook,从而实现对一些核心的系统动作进行过滤、监控的目的。一些HIPS、防毒软件、系统监控、注册表监控软件往往会采用此接口来实现自己的监控模块。
WS2_32.dll
ws2_32.dll是Windows Sockets应用程序接口, 用于支持Internet和网络应用程序。它提供网络相关服务,包括 Winsock、NetDDE、RPC、Netbios。
Wininet.dll
关于WinINet - Win32应用程序|微软文档 (microsoft.com)
Windows Internet (WinINet) 应用程序编程接口 (API) 使应用程序能够与 FTP 和 HTTP 协议交互以访问 Internet 资源
Urlmon.dll
urlmon.dll是计算机硬盘驱动器上的可执行文件。此文件包含机器代码。如果您在PC上启动软件OLE,则urlmon.dll中包含的命令将在您的PC上执行。为此,该文件将加载到主内存 (RAM) 中,并作为 Win32 进程的 OLE32 扩展(也称为任务)在那里运行。
Advapi32.dll
Advapi32.dll是一个与API服务库关联的动态链接库文件,提供对高级功能的访问。它具有Windows 内核提供的额外功能,包括注册表、系统关闭重启、Windows Service、用户账号管理。
User32.dll
与Windows窗口交互相关的操作、鼠标键盘、基本控件如按钮、滚动条等。
Ntdll.dll
ntdll.dll是Windows系统从ring3到ring0的入口。位于Kernel32.dll和user32.dll中的所有win32 API 最终都是调用ntdll.dll中的函数实现的。ntdll.dll中的函数使用SYSENTRY进入ring0,函数的实现实体在ring0中。注意 ntdll.dll也是属于用户层,而不是内核层。
Shell32.dll
主要进行与 Windows 图形shell相关的操作
Rpccrt4.dll
rpcrt4.dll是远程程序调用(RPC)应用程序接口API,用于WIndows应用程序对网络和Internet连接。
Crypt32.dll
Crypt32.dll是实现CryptoAPI中许多证书和加密消息传递功能的模块,例如CryptSignMessage。主要用来加密。
当然不止这些,有师傅遇到经常见到的dll可以告诉我,我再补充,
API
文件类
CreateFile
顾名思义。创建一个新文件,或仅仅打开一个已有文件。
CreateFileA 函数 (fileapi.h) - Win32 应用|微软文档 (microsoft.com)
CreateFileMapping
创建一个映射到文件的句柄,将文件装载到内存,并使得它可以通过内存地址进行访问。启动器、装载器和注入器会使用这个函数来读取和修改PE文件。
CreateFileMappingA 函数 (winbase.h) - Win32 应用|微软文档 (microsoft.com)
OpenFile
也是打开文件。和 Createfile 功能差不多,但感觉 create file用到的更多
OpenFile 函数 (winbase.h) - Win32 应用|微软文档 (microsoft.com)
FindFirstFile/FindNextFile
根据文件名查找文件/ 遍历文件时,判断当前目录是否有下一个文件。
FindFirstFileA function (fileapi.h) - Win32 apps |微软文档 (microsoft.com)
GetModuleFileName
返回目前进程装载模块的文件的完整路径。恶意代码可以使用这个函数,在目前运行进程中修改或者复制文件。
GetModuleFileNameA function (libloaderapi.h) - Win32 apps |微软文档 (microsoft.com)
GetModuleHandle
用来获取已装载模块句柄的函数,恶意代码可以使用GetModuleHandle在一个装载模块中定位和修改代码,或者搜索一个合适位置来注入代码。
GetModuleHandleA function (libloaderapi.h) - Win32 apps |微软文档 (microsoft.com)
GetProcAddress
获取装载到内存中一个DLL程序的函数地址。用来从其他DLL程序中导入函数,以补充在PE文件头部中导入的函数。
GetProcAddress | Microsoft Docs
GetStartupInfo
取得进程在启动时被指定的 STARTUPINFO 结构。这个结构包括当前进程如何自动配置运行配置信息,比如标准句柄指向哪些位置。
GetStartupInfoW function (processthreadsapi.h) - Win32 apps |微软文档 (microsoft.com)
GetTempPath
获取为临时文件指定的路径,如果看到恶意代码使用了这个函数,需要检查他是否在临时文件路径中读取或写入了一些文件。
GetTempPathA 函数 (fileapi.h) - Win32 apps |微软文档 (microsoft.com)
GetWindowsDirectory
获取Windows 目录的路径,恶意代码经常使用这个函数来确定将其他恶意程序安装到哪个目录
GetWindowsDirectoryA function (sysinfoapi.h) - Win32 apps |微软文档 (microsoft.com)
MapViewOfFile
将一个文件映射到内存,将文件内容变得通过内存地址可访问。启动器,装载器和注入器使用这个函数来读取和修改PE文件。通过使用此函数,恶意代码可以避免使用WriteFile来修改文件内容。
MapViewOfFile 函数 (memoryapi.h) - Win32 应用程序|微软文档 (microsoft.com)
NtQueryDirectoryFile
返回一个目录中文件的信息,内核套件普遍会hook这个函数来隐藏文件。
NtQueryDirectoryFile function (ntifs.h) - Windows drivers | Microsoft Docs
SetFileTime
修改一个文件的创建,访问或者最后修改时间,恶意代码经常使用这个函数来隐藏恶意行为。
SetFileTime function (fileapi.h) - Win32 apps |微软文档 (microsoft.com)
Wow64DisableWow64FsRedirection
禁用32为文件在64位操作系统中装载后发生的文件重定向机制,如果一个32位应用程序在调用这个函数后向C:\Windows\System32写数据,那么它将会直接写到真正C:\Windows\System32,而不是被重定向至C:\Windows\SysWOW64
Wow64DisableWow64FsRedirection function (wow64apiset.h) - Win32 apps | Microsoft Docs
网络类
accept
用来监听入站网络连接,此函数预示着程序会在一个套接字上监听入站网络连接。
bind
用来将一个本地地址关联到套接字上,以监听入站网络连接
connect
用来连接一个远程套接字。恶意代码经常使用底层功能函数来连接一个命令控制服务器。
InternetOpenA
初始化WinINet中的一些高层次互联网访问函数,比如InternetOpenUrl和InternetReadFile。搜索Internetopen函数是找到互联网访问功能初始位置的一个好方法。InternetOpen函数的-一个参数是User-Agent,有时也可以作为基于网络的特征码。
InternetOpenA function (wininet.h) - Win32 apps | Microsoft Docs
CoCreateInstance
创建一个COM对象,COM对象提供了非常多样化的功能。类标识(CLSID)会告诉你哪个文件包含着实现COM对象的代码。
CoCreateInstance function (combaseapi.h) - Win32 apps |微软文档 (microsoft.com)
FtpPutFile
将本地文件上传到FTP服务器
FtpPutFileA 函数 (wininet.h) - Win32 apps |微软文档 (microsoft.com)
GetAdaptersInfo
用来获取系统上网络适配器的相关信息。后门程序有时会调用GetAdaptersInfo函数,来取得关于受感染主机的摘要信息。在某些情况下,这个函数也会被使用来取得主机的MAC地址,在对抗虚拟机技术中用来检测VMware等虚拟机。
GetAdaptersInfo function (iphlpapi.h) - Win32 apps |微软文档 (microsoft.com)
gethostbyname
返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针,在向一个远程主机发起IP连接之前,用来对一个特定域名执行一次DNS查询,作为命令控制服务器的域名通常可以用来创建很好的网络监测特征码
gethostbyname 函数 (winsock2.h) - Win32 应用|微软文档 (microsoft.com)
gethostname
获取计算机主机名。后门程序经常使用此函数来获取受害主机的摘要信息
gethostname 函数 (winsock.h) - Win32 应用|微软文档 (microsoft.com)
inet_addr
将一个IP地址字符串,如127.0.0.1,进行转化,使其能够在如connect等函数中使用。这些字符串有时也可以用作基于网络的特征码。
inet_addr函数 (winsock2.h) - Win32 应用|微软文档 (microsoft.com)
InternetOpen
初始化WinINet中的一些高层次互联网访问函数,搜索此函数是找到互联网访问功能初始位置的一个好方法。该函数的一个参数是User-Agent,有时也可以作为基于的特征码。
InternetOpenA 函数 (wininet.h) - Win32 应用程序|微软文档 (microsoft.com)
InternetOpenUrl
使用FTP,HTTP或HTTPS协议连接来打开一个特定的URL,如果URL固定,则可以作为基于网络的特征码
InternetOpenUrlA 函数 (wininet.h) - Win32 apps |微软文档 (microsoft.com)
InternetReadFile
从一个由InternetOpenUrl,FtpOpenFile, 或HttpOpenRequest函数打开的句柄中读取数据
InternetReadFile function (wininet.h) - Win32 apps |微软文档 (microsoft.com)
InternetWriteFile
向服务器上传文件
InternetWriteFile 函数 (wininet.h) - Win32 应用程序|微软文档 (microsoft.com)
NetShareEnum
返回服务器上共享的资源的信息
NetShareEnum function (lmshare.h) - Win32 apps |微软文档 (microsoft.com)
OleInitialize
用来初始化COM库,使用COM对象的程序必须在调用任何其他COM功能之前,调用这个函数。
OleInitialize function (ole2.h) - Win32 apps |微软文档 (microsoft.com)
recv
从一个远程主机获取数据,恶意代码经常使用这个函数来从远程的命令控制服务器获取数据。
send
发送数据到远程主机,恶意代码经常使用这个函数来发送数据到远程的命令控制服务器。
WSAStartup
用来初始化底层级别的网络功能,搜索此函数调用位置,经常是定位网络相关功能最简单的方法。
WSAStartup 函数 (winsock.h) - Win32 应用|微软文档 (microsoft.com)
注册与服务类
CreateService
用来启动、停止、修改或发送一-个信 号到运行服务。如果恶意代码使用了它自己的恶意服务,你就需要分析实现服务的代码,来确定出调用的用意。
CreateServiceA function (winsvc.h) - Win32 apps |微软文档 (microsoft.com)
ControlService
用来启动,停止,修改或发送一个信号到运行服务。如果恶意代码使用了他自己的恶意服务,你就需要分析实现服务的代码,来确定出调用的用意。
ControlService function (winsvc.h) - Win32 apps |微软文档 (microsoft.com)
OpenSCManager
打开一个到服务控制管理器的句柄。任何想要安装,修改或是控制一个服务的程序,都必须要调用这个函数,才能使用其他服务操纵函数
OpenSCManagerA function (winsvc.h) - Win32 apps |微软文档 (microsoft.com)
RegisterHotKey
用来注册一个热键,当用户任意时刻输入一个特定键值组合时,注册热键句柄将会被通知,无论当用户输入键值组合时哪个窗口是活跃的,这个函数通常被间谍软件使用,使其在键值组合中输入前对用户保持隐藏。
RegisterHotKey function (winuser.h) - Win32 apps |微软文档 (microsoft.com)
RegOpenKey
打开一个注册表键值的句柄,来进行读写。修改注册表键值通常是软件在主机上进行持久化保存的一种方法。注册表也包含了完整的操作系统和应用程序配置信息。
RegOpenKeyA 函数 (winreg.h) - Win32 应用|微软文档 (microsoft.com)
StartServiceCtrlDispatcher
由服务使用来连接到服务管理控制进程的主线程。任何以服务方式运行的进程必须在启动后30秒内调用这个函数。在恶意代码中找到这个函数,可以知道他的功能应以服务方式运行。
StartServiceCtrlDispatcherA function (winsvc.h) - Win32 apps | Microsoft Docs
RegCloseKey
关闭指定注册表的键
RegCloseKey 函数 (winreg.h) - Win32 应用程序|微软文档 (microsoft.com)
RegCreateKey/RegCreateKeyEx
创建指定的注册表项。如果注册表中已存在该项,则该函数将打开它。
RegCreateKeyA function (winreg.h) - Win32 apps |微软文档 (microsoft.com)
RegCreateKeyExA function (winreg.h) - Win32 apps |微软文档 (microsoft.com)
RegDeleteKey
删除一个注册表项
RegDeleteKeyA function (winreg.h) - Win32 apps |微软文档 (microsoft.com)
RegDeleteValue
用于删除一个键下的一个键值
RegDeleteValueA 函数 (winreg.h) - Win32 apps |微软文档 (microsoft.com)
RegQueryValue
取得指定项或子项的默认(未命名)值
RegQueryValueExA 函数 (winreg.h) - Win32 apps |微软文档 (microsoft.com)
RegSetValue/RegSetValueEx
设置指定注册表项的默认值或未命名值的数据
RegSetValueA 函数 (winreg.h) - Win32 apps |微软文档 (microsoft.com)
RegSetValueExA 函数 (winreg.h) - Win32 apps |微软文档 (microsoft.com)
RegQueryInfoKey
查询有关注册表项的信息
RegQueryInfoKeyW 函数 (winreg.h) - Win32 apps |微软文档 (microsoft.com)
RegEnumKey/RegEnumKeyEx
获取指定的子键值
RegEnumKeyA function (winreg.h) - Win32 apps |微软文档 (microsoft.com)
RegEnumValue
用来枚举指定项的值
[RegEnumValueA 函数 (winreg.h) - Win32 apps |微软文档 (microsoft.com)](https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regenumvaluea#:~:text=The winreg.h header defines RegEnumValue as an alias,mismatches that result in compilation or runtime errors.)
RegLoadKey
从以前用RegSaveKey函数创建的一个文件里装载注册表信息
RegLoadKeyA 函数 (winreg.h) - Win32 apps |微软文档 (microsoft.com)
RegReplaceKey
用一个磁盘文件保存的信息替换注册表信息;并创建一个备份,在其中包含当前注册表信息
[RegReplaceKeyA function (winreg.h) - Win32 apps |微软文档 (microsoft.com)](https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regreplacekeya#:~:text=The winreg.h header defines RegReplaceKey as an alias,mismatches that result in compilation or runtime errors.)
RegRestoreKey
从一个磁盘文件恢复注册表信息
RegRestoreKeyA function (winreg.h) - Win32 apps |微软文档 (microsoft.com)
RegSaveKey
将一个项以及它的所有子项都保存到一个磁盘文件
RegSaveKeyA 函数 (winreg.h) - Win32 apps |微软文档 (microsoft.com)
RegConnectRegistry
访问远程系统的部分注册表
RegConnectRegistryA 函数 (winreg.h) - Win32 apps |微软文档 (microsoft.com)
RegNotifyChangeKeyValue
使应用程序可以接收事件通知中指定的注册表项及其子项的更改
RegNotifyChangeKeyValue function (winreg.h) - Win32 apps |微软文档 (microsoft.com)
RegUnloadKey
卸载指定的项以及它的所有子项
RegUnLoadKeyA 函数 (winreg.h) - Win32 apps |微软文档 (microsoft.com)
进程线程类
AttachThreadInput
把一个线程的输入消息连接到另外的线程,在一些情况下,自己的窗口没有输入焦点但是想要当前焦点窗口的键盘输入消息,可以使用Win32 API函数AttachThreadInput()来解决这个问题
AttachThreadInput 函数 (winuser.h) - Win32 apps |微软文档 (microsoft.com)
CheckRemoteDebuggerPresent
检查一个特定进程是否被调试。这个函数通常在一个反调试技术中被使用。
CheckRemoteDebuggerPresent function (debugapi.h) - Win32 apps |微软文档 (microsoft.com)
ConnectNamedPipe
用来为进程间通信创建一个服务端管道,等待一个客户端管道连接进来。后门程序和反向shell经常使用此函数来简单的连接到一个命令控制服务器。
ConnectNamedPipe function (namedpipeapi.h) - Win32 apps |微软文档 (microsoft.com)
CreateProcess
创建并启动一个新进程。经常用到的函数,需要多关注下参数
创建进程 - Win32 apps | Microsoft Docs
CreateRemoteThread
创建一个远程线程。启动器和隐蔽性恶意代码通常使用这个函数,将代码注入到其他进程中执行。
CreateRemoteThread function (processthreadsapi.h) - Win32 apps |微软文档 (microsoft.com)
CreateToolhelp32Snapshot
用来创建一个进程,堆空间,线程和模块的快照。恶意代码经常使用这个函数,在多个进程或线程之间传播感染
CreateToolhelp32Snapshot function (tlhelp32.h) - Win32 apps |微软文档 (microsoft.com)
EnumProcesses
用来在系统上枚举运行进程的函数,恶意代码经常枚举进程来找到一个可以注入的进程。
枚举进程函数 (psapi.h) - Win32 应用|微软文档 (microsoft.com)
IsWow64Process
由一个32位进程使用,来确定它是否运行在64位操作系统上
IsWow64Process function (wow64apiset.h) - Win32 apps |微软文档 (microsoft.com)
ZwQueryInformationProcess
返回关于一个特定进程的不同信息。这个函数通常在反调试技术中被使用。
ZwQueryInformationProcess 函数 - Win32 apps | Microsoft Docs
OpenProcess
打开系统上运行其他进程的句柄。这个句柄可以被用来向其他进程内存中读写数据,或是注入代码到其他进程中。
OpenProcess function (processthreadsapi.h) - Win32 apps |微软文档 (microsoft.com)
PeekNamedPipe
用来从一个命名管道中复制数据,而无须从管道中移除数据。这个函数在反向shell中很常用。
PeekNamedPipe 函数 (namedpipeapi.h) - Win32 apps |微软文档 (microsoft.com)
Process32First/Process32Next
在调用CreateToolhelp32Snapshot之后,使用此函数和Process32Next来枚举进程。恶意代码通常枚举进程,来找到一个可以注入的进程。
进程32第一个函数 (tlhelp32.h) - Win32 应用|微软文档 (microsoft.com)
ReadProcessMemory
用来从远程进程中读取内存。
ReadProcessMemory function (memoryapi.h) - Win32 apps |微软文档 (microsoft.com)
ResumeThread
继续之前挂起的线程。此函数在几种注入技术中都会被使用。
ResumeThread 函数 (processthreadsapi.h) - Win32 应用|微软文档 (microsoft.com)
SetThreadContext
修改给定线程的上下文,一些注入技术会使用这个函数
SetThreadContext function (processthreadsapi.h) - Win32 apps |微软文档 (microsoft.com)
ShellExecute
用来执行另一个程序,如果恶意代码创建了一个新的进程,需要分析这个新进程。
ShellExecuteA function (shellapi.h) - Win32 apps |微软文档 (microsoft.com)
SuspendThread
挂起一个线程,使得他停止运行。恶意代码有时会挂起一个线程,通过代码注入技术来修改它。
SuspendThread function (processthreadsapi.h) - Win32 apps |微软文档 (microsoft.com)
Thread32First
用来查询一个进程的所有线程。注入器会使用这些函数来找出可供注入的合适线程。
Thread32First 函数 (tlhelp32.h) - Win32 应用|微软文档 (microsoft.com)
Thread32Next
返回进程中下一个线程的信息
Thread32Next 函数 (tlhelp32.h) - Win32 应用|微软文档 (microsoft.com)
WinExec
运行指定的程序
WinExec 函数 (winbase.h) - Win32 应用|微软文档 (microsoft.com)
WriteProcessMemory
用来向远程进程写数据的函数,恶意代码在进程注入中会用到此函数。入口区必须可以访问,否则操作将失败
WriteProcessMemory function (memoryapi.h) - Win32 apps |微软文档 (microsoft.com)
RpcServrRegisterIf
注册与RPC运行时库的接口。
RpcServerRegisterIf3 函数 (rpcdce.h) - Win32 apps |微软文档 (microsoft.com)
RpcServerListen
指示RPC运行时库来监听远程过程调用
RpcServerListen function (rpcdce.h) - Win32 apps |微软文档 (microsoft.com)
RpcServerUseProtseqEp
告诉RPC运行时库使用指定的协议序列与指定的端点组合来接收远程过程调用。
RpcServerUseProtseqEp function (rpcdce.h) - Win32 apps |微软文档 (microsoft.com)
RpcMgmtStopServerListening
告诉服务端停止对RPC的监听
RpcMgmtStopServerListening function (rpcdce.h) - Win32 apps |微软文档 (microsoft.com)
RpcServerUnregisterIf
从RPC运行时库注册表中删除一个接口
RpcServerUnregisterIf function (rpcdce.h) - Win32 apps |微软文档 (microsoft.com)
RpcStringBindingCompose
创建一个字符串绑定句柄。
RpcStringBindingCompose function (rpcdce.h) - Win32 apps |微软文档 (microsoft.com)
注入类
GetThreadContext
返回一个给定线程的上下文结构。线程上下文结构中存储了所有线程信息,比如寄存器值和目前状态。
GetThreadContext function (processthreadsapi.h) - Win32 apps | Microsoft Docs
VirtualAllocEx
一个内存分配的例程,支持在远程进程中分配内存。恶意代码有时会在进程注入中使用 VirtualAllocEx函数。
VirtualProtectEx
修改一个内存区域的保护机制,恶意代码可能会使用这个函数来将一块只读的内存节修改为可执行代码。
QueueUserAPC
用来在其他线程中执行代码,恶意代码有时会使用这个函数注入代码到其他进程。
参考链接:
http://blog.nsfocus.net/malware-sample-analysis-api/
Peace.