API函数:文件类(第23课)

文件类、网络类、注册表与服务类、进程线程类、注入类、驱动类、加密与解密、消息传递等各种类别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

头像
  • ¥ 129.0元
  • ¥ 99.0元
  • 市场价:129.0元
  • ¥ 69.0元
  • 市场价:99.0元
  • ¥ 999.0元
  • 市场价:1599.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: