文件类、网络类、注册表与服务类、进程线程类、注入类、驱动类、加密与解密、消息传递等各种类别API恶意样本分析。
kernel32!CreateFile
功能:
这是一个多功能的函数,可打开或创建以下对象,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。
函数原型:
HANDLE WINAPI CreateFile(
_In_ LPCTSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
);
参数介绍:
lpFileName要打开的文件的名或设备名。这个字符串的最大长度在ANSI版本中为MAX_PATH,在unicode版本中为32767。
dwDesiredAccess指定类型的访问对象。如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息
dwShareMode, 如果是零表示不共享; 如果是FILE_SHARE_DELETE表示随后打开操作对象会成功只要删除访问请求;如果是FILE_SHARE_READ随后打开操作对象会成功只有请求读访问;如果是FILE_SHARE_WRITE 随后打开操作对象会成功只有请求写访问。
lpSecurityAttributes, 指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)
dwCreationDisposition,创建配置
dwFlagsAndAttributes,扩展属性
hTemplateFile,hTemplateFile为一个文件或设备句柄,表示按这个参数给出的句柄为模板创建文件(就是将该句柄文件拷贝到lpFileName指定的路径,然后再打开)。它将指定该文件的属性扩展到新创建的文件上面,这个参数可用于将某个新文件的属性设置成与现有文件一样,并且这样会忽略dwAttrsAndFlags。通常这个参数设置为NULL,为空表示不使用模板,一般为空。
kernel32!CreateFileMapping
功能:创建一个新的文件映射内核对象。
函数原型:
HANDLE WINAPI CreateFileMapping(
_In_HANDLE hFile,
_In_opt_LPSECURITY_ATTRIBUTES lpAttributes,
_In_DWORD flProtect,
_In_DWORD dwMaximumSizeHigh,
_In_DWORD dwMaximumSizeLow,
_In_opt_LPCTSTR lpName);
参数介绍:
hFile:Long,指定欲在其中创建映射的一个文件句柄。0xFFFFFFFF(-1,即INVALID_HANDLE_VALUE)表示在页面文件中创建一个可共享的文件映射。
lpFileMappigAttributes:SECURITY_ATTRIBUTES,它指明返回的句柄是否可以被子进程所继承,指定一个安全对象,在创建文件映射时使用。如果为NULL(用ByVal As Long传递零),表示使用默认安全对象。
结构体类型如下:保存对象的安全属性
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
flProtect:保护属性设置
dwMaximumSizeHigh:Long,文件映射的最大长度的高32位。
dwMaximumSizeLow:Long,文件映射的最大长度的低32位。如这个参数和dwMaximumSizeHigh都是零,就用磁盘文件的实际长度。
lpName:String,指定文件映射对象的名字。如存在这个名字的一个映射,函数就会打开它。用vbNullString可以创建一个无名的文件映射。
返回值:
Long,新建文件映射对象的句柄;零意味着出错。会设置GetLastError。即使函数成功,但倘若返回的句柄属于一个现成的文件映射对象,那么GetLastError也会设置成ERROR_ALREADY_EXISTS。在这种情况下,文件映射的长度就是现有对象的长度,而不是这个函数指定的尺寸。
备注:
创建一个映射到文件的句柄,将文件装载到内存,并使得他可以通过内存地址进行访问。启动器,装载器和注入器会使用这个函数来读取和修改PE文件。
kernel32.OpenFile
功能:
用于打开文件的
函数原型:
HFILE WINAPI OpenFile(
_In_ LPCSTR lpFileName,
_Out_ LPOFSTRUCT lpReOpenBuff,
_In_ UINT uStyle
);
参数介绍:(参数与返回值)
lpFileName:文件名
lpReOpenBuff:变量指针,用于存储文件被首次打开时接收信息
uStyle:打开文件的常量类型
成功返回打开的文件句柄,失败返回HFILE_ERROR
kernel32!FindFirstFile
功能:
根据文件名查找文件。该函数到一个文件夹(包括子文件夹)去搜索指定文件
函数原型:
HANDLE FindFirstFile(
LPCTSTR lpFileName,//filename
LPWIN32_FIND_DATA lpFindFileData//databuffer
);
参数介绍:
LPCTSTR lpFileName文件名(包括路径)
LPWIN32_FIND_DATA lpFindFileData 指向一个用于保存文件信息的结构体
结构体声明如下:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; //文件属性
FILETIME ftCreationTime; // 文件创建时间
FILETIME ftLastAccessTime; // 文件最后一次访问时间
FILETIME ftLastWriteTime; // 文件最后一次修改时间
DWORD nFileSizeHigh; // 文件长度高32位
DWORD nFileSizeLow; // 文件长度低32位
DWORD dwReserved0; // 系统保留
DWORD dwReserved1; // 系统保留
TCHAR cFileName[ MAX_PATH ]; // 长文件名
TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;
返回值:
如果调用成功返回一个句柄,可用来做为FindNextFile或 FindClose参数
调用失败 返回为INVALID_HANDLE_VALUE(即-1) ,可调用GetLastError来获取错误信息
备注:
用来搜索文件目录和枚举文件系统的函数
kernel32!FindNextFile
功能:
可以用来遍历目录或文件时,判断当前目录下是否有下一个目录或文件。
函数原型:
BOOLFindNextFile(
HANDLE hFindFile, //searchhandle
LPWIN32_FIND_DATA lpFindFileData //databuffer
);
参数介绍:
HANDLE hFindFile搜索的文件句柄 函数执行的时候搜索的是此句柄的下一文件
LPWIN32_FIND_DATA lpFindFileData 指向一个用于保存文件信息的结构体
返回值:
非零表示成功,零表示失败。如不再有与指定条件相符的文件,会将GetLastError设置成ERROR_NO_MORE_FILES
备注:
用来搜索文件目录和枚举文件系统的函数。
kernel32!GetModuleFileName
功能:
获取当前进程已加载模块的文件的完整路径,该模块必须由当前进程加载。
函数原型:
DWORD WINAPI GetModuleFileName(
_In_opt_ HMODULE hModule,
_Out_ LPTSTR lpFilename,
_In_ DWORD nSize
);
参数介绍:
hModule 一个模块的句柄。可以是一个DLL模块,或者是一个应用程序的实例句柄。如果该参数为NULL,
该函数返回该应用程序全路径。
lpFileName 指定一个字串缓冲区,要在其中容纳文件的用NULL字符中止的路径名,hModule模块就是从这个文件装载进来的
nSize 装载到缓冲区lpFileName的最大字符数量
返回值:
Long,如执行成功,返回复制到lpFileName的实际字符数量;零表示失败。
备注:
返回目前进程装载某个模块的文件名,恶意代码可以使用这个函数,在目前运行进程中修改或复制文件。
kernel32!GetModuleHandle
功能:
获取一个应用程序或动态链接库的模块句柄。
函数原型:
HMODULEGetModuleHandle(LPCTSTRlpModuleName);
参数介绍:
lpModuleName 模块名称
返回值:
如执行成功成功,则返回模块句柄。零表示失败
备注:
用来获取已装载模块句柄的函数,恶意代码可以使用此函数在一个装载模块中定位和修改代码,或者搜索一个合适位置来注入代码。
kernel32!GetProcAddress
功能:
检索指定的动态链接库(DLL)中的输出库函数地址。
函数原型:
FARPROC GetProcAddress(
HMODULE hModule,
LPCSTR lpProcName
);
参数介绍:
hModule
[in] 包含此函数的DLL模块的句柄。LoadLibrary、AfxLoadLibrary 或者GetModuleHandle函数可以返回此句柄。
lpProcName
[in] 包含函数名的以NULL结尾的字符串,或者指定函数的序数值。如果此参数是一个序数值,它必须在一个字的底字节,高字节必须为0。
返回值:
如果函数调用成功,返回值是DLL中的输出函数地址。
如果函数调用失败,返回值是NULL。
备注:
获取装载到内存中一个DLL程序的函数地址。用来从其他DLL程序中导入函数,以补充在PE文件头部中导入的函数。
kernel32!GetStartupInfo
功能:
取得进程在启动时被指定的 STARTUPINFO 结构。
函数原型:
VOID GetStartupInfo(
LPSTARTUPINFO lpStartupInfo);
参数介绍:
lpStartupInfo一个指向用来存放要获取的 STARTUPINFO 结构的指针。
结构体声明如下:
typedef struct _STARTUPINFO {
DWORD cb; //包含STARTUPINFO结构中的字节数
LPTSTR lpReserved; //保留。必须初始化为N U L L
LPTSTR lpDesktop; //用于标识启动应用程序所在的桌面的名字。如果该桌面存在,新进程便与指定的桌面相关联。如果桌面不存在,便创建一个带有默认属性的桌面,并使用为新进程指定的名字。如果lpDesktop是NULL(这是最常见的情况),那么该进程将与当前桌面相关联
LPTSTR lpTitle; //用于设定控制台窗口的名称。如果l p Ti t l e 是N U L L ,则可执行文件的名字将用作窗口名
DWORD dwX; //用于设定应用程序窗口在屏幕上应该放置的位置的x 和y 坐标(以像素为单位)。
DWORD dwY;// 只有当子进程用CW_USEDEFAULT作为CreateWindow的x参数来创建它的第一个重叠窗口时,才使用这两个坐标。若是创建控制台窗口的应用程序,这些成员用于指明控制台窗口的左上角
DWORD dwXSize; //用于设定应用程序窗口的宽度和长度(以像素为单位)只有wYsize
DWORD dwYSize;// 当子进程将CW_USEDEFAULT用作CreateWindow的nWidth参数来创建它的第一个重叠窗口时,才使用这些值。
DWORD dwXCountChars; //用于设定子应用程序的控制台窗口的宽度和高度(以字符为单位)
DWORD dwYCountChars;
DWORD dwFillAttribute; //用于设定子应用程序的控制台窗口使用的文本和背景颜色
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2; //保留。必须被初始化为0
LPBYTE lpReserved2; //保留。必须被初始化为NULL
HANDLE hStdInput; //用于设定供控制台输入和输出用的缓存的句柄。
HANDLE hStdOutput;// 用于标识控制台窗口的缓存
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
返回值:无
备注:
获取一个包含当前进程如何自动运行配置信息的结构,比如标准句柄指向哪些位置。
kernel32!GetTempPath
功能:
获取为临时文件指定的路径
函数原型:
DWORD WINAPI GetTempPath( _In_ DWORD nBufferLength, _Out_ LPTSTR lpBuffer);
参数介绍:
nBufferLength:表示lpBuffer的大小
lpBuffer:接收路径的一块内存
返回值:
如果成功,返回lpBuffer的长度,失败返回0
备注:
返回临时文件路径,如果看到恶意代码使用了这个函数,需要检查他是否在临时文件路径中读取或写入了一些文件。
kernel32!GetWindowsDirectory
功能:
获取Windows目录的完整路径名。
函数原型:
UINTGetWindowsDirectory(LPTSTR lpBuffer,UINT uSize)
参数介绍:
lpBuffer,指定一个字串缓冲区,用于装载Windows目录名。除非是根目录,否则目录中不会有一个中止用的“\”字符
nSize,lpBuffer字串的最大长度
返回值:
复制到lpBuffer的一个字串的长度。如lpBuffer不够大,不能容下整个字串,就会返回lpBuffer要求的长度,零表示失败
备注:
返回Windows目录的文件系统路径,恶意代码经常使用这个函数来确定将其他恶意程序安装到哪个目录。
NtosKrnl!NtQueryDirectoryFile
功能:
返回多种指定的文件信息
函数原型:
NTSTATUS ZwQueryDirectoryFile( __in HANDLE FileHandle, __in_opt HANDLE Event, __in_opt PIO_APC_ROUTINE ApcRoutine, __in_opt PVOID ApcContext, __out PIO_STATUS_BLOCK IoStatusBlock, __out PVOID FileInformation, __in ULONG Length, __in FILE_INFORMATION_CLASS FileInformationClass, __in BOOLEAN ReturnSingleEntry, __in_opt PUNICODE_STRING FileName, __in BOOLEAN RestartScan );
参数介绍:
FileHandle:ZwCreateFile和ZwOpenFile返回的句柄,代表着被查询信息的文件夹
Event:调用者创建的一个可选的事件句柄。
ApcRoutine:调用者提供的一个APC例程,当操作完成时,调用此例程。
ApcContext:如果调用者提供了APC例程,则此参数位APC例程的上下文
IoStatusBlock:指向IO_STATUS_BLOCK结构体,返回操作的完成状态和信息。
结构体声明如下:
typedef struct _IO_STATUS_BLOCK {
union { NTSTATUS Status; PVOID Pointer; };
ULONG_PTR Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
Status是请求被处理的状态,如果被成功的处理,则为STATUS_SUCCESS ,其他情况为STATUS_XXX
Information如果处理成功,Information表示处理的字节数,如果处理失败,此值为0。
FileInformation:接收文件的特定的信息
结构体声明如下:
typedef enum _FILE_INFORMATION_CLASS
{
FileDirectoryInformation = 1,
FileFullDirectoryInformation = 2,
FileBothDirectoryInformation = 3,
FileBasicInformation = 4,
FileStandardInformation = 5,
FileInternalInformation = 6,
FileEaInformation = 7,
FileAccessInformation = 8,
FileNameInformation = 9,
FileRenameInformation = 10,
FileLinkInformation = 11,
FileNamesInformation = 12,
FileDispositionInformation = 13,
FilePositionInformation = 14,
FileFullEaInformation = 15,
FileModeInformation = 16,
FileAlignmentInformation = 17,
FileAllInformation = 18,
FileAllocationInformation = 19,
FileEndOfFileInformation = 20,
FileAlternateNameInformation = 21,
FileStreamInformation = 22,
FilePipeInformation = 23,
FilePipeLocalInformation = 24,
FilePipeRemoteInformation = 25,
FileMailslotQueryInformation = 26,
FileMailslotSetInformation = 27,
FileCompressionInformation = 28,
FileObjectIdInformation = 29,
FileCompletionInformation = 30,
FileMoveClusterInformation = 31,
FileQuotaInformation = 32,
FileReparsePointInformation = 33,
FileNetworkOpenInformation = 34,
FileAttributeTagInformation = 35,
FileTrackingInformation = 36,
FileIdBothDirectoryInformation = 37,
FileIdFullDirectoryInformation = 38,
FileValidDataLengthInformation = 39,
FileShortNameInformation = 40,
FileIoCompletionNotificationInformation = 41,
FileIoStatusBlockRangeInformation = 42,
FileIoPriorityHintInformation = 43,
FileSfioReserveInformation = 44,
FileSfioVolumeInformation = 45,
FileHardLinkInformation = 46,
FileProcessIdsUsingFileInformation = 47,
FileNormalizedNameInformation = 48,
FileNetworkPhysicalNameInformation = 49,
FileMaximumInformation = 50
} FILE_INFORMATION_CLASS;
Length:FileInformation信息的长度。
FileInformationClass:需要返回的文件夹信息的类型。
ReturnSingleEntry:如果要返回单一入口,就将此值设为TRUE,否则设为FALSE。
FileName:调用者申请的文件名
RestartScan:如果第一次访问文件夹,将此参数设为TRUE,否则设为FALSE。
返回值:
成功返回STATUS_SUCCESS,失败返回错误码
备注:
返回一个目录中文件的信息,内核套件普遍会挂钩这个函数来隐藏文件。
kernel32!SetFileTime
功能:
设置文件的创建、访问及上次修改时间 函数原型:
BOOL WINAPI SetFileTime( _In_ HANDLE hFile, _In_opt_ const FILETIME *lpCreationTime, _In_opt_ const FILETIME *lpLastAccessTime, _In_opt_ const FILETIME *lpLastWriteTime);
参数介绍:
hFile Long,系统文件句柄 lpCreationTime FILETIME,文件的创建时间 lpLastAccessTime FILETIME,文件上一次访问的时间 lpLastWriteTime FILETIME,文件最近一次修改的时间
返回值:
非零表示成功,零表示失败
备注:
修改一个文件的创建,访问或者最后修改时间,恶意代码经常使用这个函数来隐藏恶意行为。
kernel32!Wow64DisableWow64FsRedirection
功能:
禁用文件系统重定向机制
函数原型:
BOOL WINAPI Wow64DisableWow64FsRedirection( _Out_ PVOID *OldValue);
参数介绍:
OldValue:Wow64文件系统重定向值
返回值:
成功返回非0,失败返回0.
备注:
禁用32为文件在64位操作系统中装载后发生的文件重定向机制,如果一个32位应用程序在调用这个函数后向C:\Windows\System32写数据,那么它将会直接写到真正的C:\Windows\System32,而不是被重定向至C:\Windows\SysWOW64