文件类

1、kernel32!CreateFile

  • 打开或创建以下对象,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。

    2、kernel32!CreateFileMapping

  • 功能:创建一个新的文件映射内核对象。

  • 创建一个映射到文件的句柄,将文件装载到内存,并使得他可以通过内存地址进行访问。启动器,装载器和注入器会使用这个函数来读取和修改PE文件。

    3、kernel32!OpenFile

  • 成功返回打开文件的句柄

    4、kernel32!FindFirstFile

  • 搜索文件目录,枚举文件系统

    5、kernel32!FindNextFile

  • 搜索文件目录,枚举文件系统

    6、kernel32!GetModuleFileName

  • 获取当前进程已加载模块的文件的完整路径

  • 恶意代码可以使用这个函数,在目前运行进程中修改或复制文件

    7、kernel32!GetModuleHandle

  • 获取一个应用程序或动态链接库的模块句柄

  • 获取已装载模块句柄的函数,恶意代码可以使用此函数在一个装载模块中定位和修改代码,或者搜索一个合适位置来注入代码。

    8、kernel32!GetProcAddress

  • 检索指定的动态链接库(DLL)中的输出库函数地址

    1. #include <windows.h>
    2. typedef (CALLBACK * PMessageBox)(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT UType);
    3. void main()
    4. {
    5. HMODULE hModule=GetModuleHandle("user32.dll");
    6. if(NULL == hModule) //若源程序没载入user32.dll则LoadLibrary它
    7. {
    8. hModule = LoadLibrary("user32.dll");
    9. }
    10. PMessageBox MESS = (PMessageBox)GetProcAddress(hModule,"MessageBoxA");
    11. if (MESS)
    12. {
    13. (*MESS)(NULL,"MessageBoxText(内容)","Title(标题)",MB_OK);
    14. }
    15. }

    9、kernel32!GetTempPath

  • 返回临时文件路径,如果看到恶意代码使用了这个函数,需要检查他是否在临时文件路径中读取或写入了一些文件。

    10、kernel32!GetWindowsDirectory

  • 返回Windows目录的文件系统路径,恶意代码经常使用这个函数来确定将其他恶意程序安装到哪个目录。

11、kernel32!MapViewOfFile

  • 映射一个文件到内存,将文件内容变得通过内存地址可访问。启动器,装载器和注入器使用这个函数来读取和修改PE文件。通过使用此函数,恶意代码可以避免使用WriteFile来修改文件内容。
  • 先要使用函数 CreateFileMapping 来创建一个想共享的文件数据句柄,然后使用 MapViewOfFile 来映射文件到内存,然后使用 OpenFileMapping 函数在另一个进程里打开共享文件的名称,这样就可以实现不同的进程共享数据。

网络类

image.png

0、WSAStartup

  • 允许应用程序或DLL指明windows socket API的版本号及获得特定windows socket的实现细节。应用程序或dll只能在一次成功的ESAStartup()调用后才能进一步调用Windows socket API函数。

    1、ws2_32!socket

  • socket: Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

  • 根据指定的地址、数据类型和协议来分配一个套接口的描述字及其所用的资源。如果协议protocol未指定(等于0),则使用缺省的连接方式

    2、ws2_32!accept

  • 监听入站网络连接

    3、ws2_32!bind(服务器端)

  • 服务器端要用 bind() 函数将套接字与特定的 IP 地址和端口绑定起来,只有这样,流经该 IP 地址和端口的数据才能交给套接字处理。类似地,客户端也要用 connect() 函数建立连接。

    4、ws2_32!connect(客户端)

  • 用来连接一个远程套接字。恶意代码经常使用底层功能函数来连接一个命令控制服务器

    5、ws2_32!recv

  • 从一个远程主机获取数据,恶意代码经常使用这个函数来从远程的命令控制服务器获取数据。

    6、ws2_32!send

  • 发送数据到远程主机,恶意代码经常使用这个函数来发送数据到远程的命令控制服务器。

    7、wininet.InternetOpen

  • 该函数是第一个由应用程序调用的 WinINet 函数。它告诉 Internet DLL 初始化内部数据结构并准备接收应用程序之后的其他调用。当应用程序结束使用 Internet 函数时,应调用 InternetCloseHandle 函数来释放与之相关的资源。

    8、wininet!FtpPutFile

  • 一个高层次上的函数,用来向一个远程FTP服务器上传文件

    9、ws2_32!gethostname

  • 获取计算机主机名。后门程序经常使用此函数来获取受害主机的摘要信息

    10、ws2_32!inet_addr

  • 将一个IP地址字符串,如127.0.0.1,进行转化,使其能够在如connect等函数中使用。这些字符串有时也可以用作基于网络的特征码

  • 点分十进制IP转换成长整型数

    11、wininet!InternetOpenUrl

  • 使用FTP,HTTP或HTTPS协议连接来打开一个特定的URL,如果URL固定,则可以作为基于网络的特征码

    12、wininet!InternetReadFile

  • 从一个由InternetOpenUrl,FtpOpenFile, 或HttpOpenRequest函数打开的句柄中读取数据

    13、wininet!InternetWriteFile

  • 写数据到之前打开的一个URL,文件上传

    14、urlmon!URLDownloadToFile

  • 从指定URL地址读取内容并将读取到的内容保存到特定的文件里

    16、端口号转换成网络字节序

  • htons

    17、ws2_32!closesocket

  • 关闭socket连接

    18、WSACleanup

  • 解除与Socket库的绑定,释放socket库所占用的系统资源


注册表与服务类

1、advapi32!CreateService

  • 创建一个服务对象,并将其添加到指定的服务控制管理器数据库。创建一个可以再启动时刻运行的服务。恶意代码使用此函数来持久化,隐藏或者是启动内核驱动

    2、advapi32!ControlService

  • 用来启动,停止,修改或发送一个信号到运行服务。如果恶意代码使用了他自己的恶意服务,你就需要分析实现服务的代码,来确定出调用的用意。

    3、advapi32!OpenSCManager

  • 开一个到服务控制管理器的句柄。任何想要安装,修改或是控制一个服务的程序,都必须要调用这个函数,才能使用其他服务操纵函数。

    4、user32!RegisterHotKey

  • 用来注册一个热键,当用户任意时刻输入一个特定键值组合时,注册热键句柄将会被通知,无论当用户输入键值组合时哪个窗口是活跃的,这个函数通常被间谍软件使用,使其在键值组合中输入前对用户保持隐藏。

    5、advapi32!RegOpenKey

  • 打开一个注册表键值的句柄,来进行读写。修改注册表键值通常是软件在主机上进行持久化保存的一种方法。注册表也包含了完整的操作系统和应用程序配置信息。

    6、advapi32!StartServiceCtrlDispatcher

  • 由服务使用来连接到服务管理控制进程的主线程。任何以服务方式运行的进程必须在启动后30秒内调用这个函数。在恶意代码中找到这个函数,可以知道他的功能应该以服务方式运行。

    7、advapi32!RegCloseKey

  • 释放指定注册键的句柄

    8、advapi32!RegCreateKey

  • 用于创建或打开注册表项

    9、advapi32!RegDeleteKey

  • 被删除的键值不能有子项。删除的一个键值和所有其子项,您需要枚举子项,并单独删除他们。删除键递归,使用 RegDeleteTree 或 SHDeleteKey 函数。

    10、advapi32!RegQueryValue

  • 取得指定项或子项的默认(未命名)值

    11、advapi32!RegSetValue

  • 设置指定注册表项的默认值或未命名值的数据

进程线程类

1、user32!AttachThreadInput

  • 把一个线程的输入消息连接到另外的线程,在一些情况下,自己的窗口没有输入焦点但是想要当前焦点窗口的键盘输入消息,可以使用Win32 API函数AttachThreadInput()来解决这个问题

    2、kernel32!CheckRemoteDebuggerPresent

  • 检查一个特定进程是否被调试。这个函数通常在一个反调试技术中被使用。

    3、kernel32!ConnectNamedPipe

  • 用来为进程间通信创建一个服务端管道,等待一个客户端管道连接进来。后门程序和反向shell经常使用此函数来简单的连接到一个命令控制服务器。

    4、kernel32!CreateProcess

  • 创建并启动一个新进程。如果恶意代码创建了一个新进程,你需要同时分析这个新进程。

    5、kernel32!CreateRemoteThread

  • 用来在一个远程进程中启动一个线程。启动器和隐蔽性恶意代码通常使用这个函数,将代码注入到其他进程中执行。

    6、kernel32!CreateToolhelp32Snapshot

  • 通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照。

    7、kernel32!EnumProcesses

  • 用来在系统上枚举运行进程,恶意代码经常枚举进程来找到一个可以注入的进程。

    8、kernel32!EnumProcessModules

  • :用来枚举给定进程的已装载模块(可执行文件和DLL程序),恶意代码在进行注入时经常枚举模块

    9、kernel32!IsWow64Process

  • 由一个32位进程使用,来确定它是否运行在64位操作系统上

    10、kernel32!OpenProcess

  • 打开系统上已存在的进程对象,返回进程句柄。这个句柄可以被用来向其他进程内存中读写数据,或是注入代码到其他进程中。

    11、kernel32!Process32First

  • 是一个进程获取函数,当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用process32First函数来获得第一个进程的句柄。

    12、kernel32!Process32Next

  • 当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用Process32Next函数来获得下一个进程的句柄。

    13、kernel32!ReadProcessMemory

  • 从远程进程中读取内存。

    14、kernel32!ResumeThread

  • 继续之前挂起的线程。此函数在几种注入技术中都会被使用。

    15、kernel32!SuspendThread

  • 挂起一个线程,使得它停止运行。恶意代码有时会挂起一个线程,通过代码注入技术来修改它。

    16、kernel32!Thread32First

  • 用来轮询一个进程的所有线程。注入器会使用这些函数来找出可供注入的合适线程。

    17、kernel32!Thread32Next

  • 返回进程中下一个线程的信息

    18、kernel32!WriteProcessMemory

  • 用来向远程进程写数据的函数,恶意代码在进程注入中会用到此函数。


加密与解密

1、advapi32!CryptAcquireContext

  • 这个函数是用来取得指定CSP密钥容器句柄,以后的任何加密操作就是针对此CSP 句柄而言。函数首先查找由dwProvType和pszProvider 指定的CSP,如果找到了CSP,函数就查找由此CSP指定的密钥容器。由适当的dwFlags 标志,这个函数就可以创建和销毁密钥容器,如果不要求访问私钥的话,也可以提供对CSP临时密钥容器的访问。

    2、advapi32!CryptReleaseContext

  • 此函数释放CSP的句柄。对于每一次调用,CSP 的引用计数都减1。当引用计数为0时,CSP上下文就会被系统释放变成无效句柄,以后针对此CSP 句柄的函数不再可用。此函数并不销毁密钥容器或密钥对。

    3、advapi32!CryptEnumProviders

  • 此函数得到第一个或下一个可用的CSP。如果使用循环,就可以得到计算机上所有可用的CSP。

    4、advapi32!CryptCreateHash

  • 它创建并返回了一个CSP哈希对象的句柄。此句柄由CryptHashData和CryptHashSessionKey来调用

    5、advapi32! CryptGetHashParam

  • 得到指定哈希对象的数据。

    6、advapi32!CryptEncrypt

  • 此函数用于加密数据。加密数据所需要的算法由hKey的密钥指定

    7、advapi32!CryptDecrypt

  • 此函数对由CryptEncrypt加密过的数据进行解密

    8、advapi32!CryptGenKey

  • 此函数生成一个密钥

    9、advapi32!CryptDestroyKey

  • 此函数释放密钥句柄。

    10、advapi32!CryptGetUserKey

  • 获取用户的公钥/私钥对其中一个的句柄,该功能仅由公钥/私钥对的所有者使用,并且仅当CSP及其相关联的密钥容器的句柄可用时

  • 有些勒索病毒在加密过程中使用Windows Crypto API生成密钥并进行加密,但此API在某些操作系统上并未将生成密钥时产生的素数从内存中删除,因此若该内存块尚未被覆盖,我们就可以通过截取素数生成出同样的密钥,使用该密钥实现对已被加密的文件进行解密。

消息传递

1、User32!SendMessage

  • 将指定的消息发送到一个或多个窗口

    2、User32!PostMessage

  • 将一条消息放入到消息队列中。消息队列里的消息通过调用GetMessage和PeekMessage取得。

    3、User32!GetMessage

  • 从调用线程的消息队列里取得一个消息并将其放于指定的结构。此函数可取得与指定窗口联系的消息和由PostThreadMessage寄送的线程消息。

    4、User32!PeekMessage

  • 为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构

    5、User32!WaitMessage

  • 功能:当一个线程的消息队列中无其它消息时,该函数就将控制权交给另外的线程,同时将该线程挂起,直到一个新的消息被放入线程的消息队列之中才返回。

    6、User32!DispatchMessage

  • 功能:该函数分发一个消息给窗口程序。通常消息从GetMessage函数获得。消息被分发到回调函数(过程函数),作用是消息传递给操作系统,然后操作系统去调用我们的回调函数,也就是说我们在窗体的过程函数中处理消息。

其他

1、advapi32!AdjustTokenPrivileges

  • 启用或禁止指定访问令牌的特权。

    2、crypt32!CertOpenSystemStore

  • 访问在本地系统中的证书

    3、kernel32!CreateMutex

  • 创建一个有名或无名的互斥量对象,可以被恶意代码用来确保在给定时刻只有一个实例在系统上运行。恶意代码经常使用固定名字为互斥对象命名,这样他们就可以成为一个很好的主机特征,来检测系统是否感染了这个恶意样本。

    4、kernel32!FindResource

  • 在可执行文件和装在DLL程序中寻找资源的函数。恶意代码有时会使用资源来存储字符串,配置信息或者其他恶意文件。如果看到使用了这个函数,需要进一步检查恶意代码PE头中的.rsrc节

    5、user32!GetDC

  • 返回一个窗口或者是整个屏幕的设备上下文句柄。间谍软件经常使用这个函数来抓取桌面截屏

    6、kernel32!GetSystemDefaultLangId

  • 返回系统默认语言设置的函数。这可以用来定制显示与文件名,作为对感染主机摘要信息的获取,这个函数也会被一些由“爱国主义”所驱动的恶意代码使用,从而对一些特定区域的系统进行感染。

    7、kernel32!GetTickCount

  • 返回从启动后到当前时间的微秒数。这个函数有时在反调试技术中被使用来获取时间信息。此函数也经常有编译器添加并包含在许多可执行程序中,因此简单的在导入函数列表中看到这个函数只能提供少量的线索信息

常用Native API

1、ntdll.dll!NtQuerySystemInformation

  • 获取进程信息,EnumProcesses、Process32First、Process32Next等调用的底层函数
  • 依靠内核函数ExpGetProcessInformation
  • 杀毒软件和系统进程使用PsSetCreateProcessNotifyRoutine来监视进程创建和销毁


2、ntdll!NtQueryVolumeInformationFile

  • 与文件和目录相关
  • 文件系统信息

    3、ntdll!NtQueryDirectoryFile

  • 与文件和目录相关

  • 获取真实文件和目录信息列表

    4、ntdll!NtCreateFile

  • 与文件和目录相关

  • 创建一个新文件或打开现有文件

    5、ntdll!NtVdmControl

  • 与文件和目录相关


6、ntdll!NtEnumerateKey

  • 与注册表相关
  • 能在注册表某个部分通过查询指定键的索引以获得它的信息


7、ntdll!NtEnumerateValueKey

  • 与注册表相关
  • 用来获取一个键值信息

8、advapi32!EnumServiceGroup

  • 对系统服务的控制


9、advapi32!EnumServicesStatus

  • 对系统服务的控制