advapi32!AdjustTokenPrivileges
功能:启用或禁止指定访问令牌的特权。
函数原型:
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle,
BOOL DisableAllPrivileges,
PTOKEN_PRIVILEGES NewState,
DWORD BufferLength,
PTOKEN_PRIVILEGES PreviousState,
PDWORD ReturnLength
);
参数介绍:
TokenHandle, 包含特权的句柄
DisableAllPrivileges,禁用所有权限标志
NewState,新特权信息的指针(结构体)
结构体说明如下:
typedef struct _TOKEN_PRIVILEGES
{
ULONG PrivilegeCount; //数组元素的个数
LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; //数组.类型为LUID_AND_ATTRIBUTES
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
typedef struct _LUID_AND_ATTRIBUTES
{ // luaa
LUID Luid; //标识了一个LUID值
DWORD Attributes; //标识了LUID属性.这个值包含了多达32位(one-bit)的标识.它的意思是取决于LUID的定义和使用
} LUID_AND_ATTRIBUTES;
BufferLength, 缓冲数据大小,以字节为单位的PreviousState的缓存区(sizeof)
PreviousState,接收被改变特权当前状态的Buffer
ReturnLength 接收PreviousState缓存区要求的大小
如果这个函数成功,返回非0.失败返回0.为了确定这个函数是否修改了所有指定的特权,可以调用GetLastError函数,当这个函数返回下面的值之一时就代表函数成功:
ERROR_SUCCESS: 这个函数修改了所有指定的特权。
ERROR_NOT_ALL_ASSIGNED: 这个令牌没有参数NewState里指定一个或多个的权限。(一个或多个没有修改成功).即使权限没有被修改。这个函数也可能成功(返回这个error值)表明 参数PreviousState 被修改。
Gdi32!BitBlt
功能:对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。
函数原型:BOOL BitBlt(
int x,
int y,
int nWidth,
int nHeight,
CDC* pSrcDC,
int xSrc,
int ySrc,
DWORD dwRop
);
参数介绍:
X:指定目标矩形的左上角的逻辑x坐标。
Y:指定目标矩形的左上角的逻辑y坐标。
nWidth:指定宽度(以逻辑单位)的目标矩形和源位图。
nHeight:指定高度(以逻辑单位)目标矩形和源位图。
pSrcDC:设置为标识设备上下文位图要复制的 CDC 对象的指针。 它必须是 NULL,如果dwRop 指定不包括一个源的光栅操作。
xSrc:指定源位图的左上角的逻辑x坐标。
ySrc:指定源位图的左上角的逻辑y坐标。
dwRop:指定要执行的光栅操作。 光栅操作代码定义GDI如何组合在涉及一个当前画笔、一个可能的源位图和一个目标位图的输出操作的颜色
返回值:
返回非0表示成功,0表示失败
备注:
用来将图形数据从一个设备复制到另一个设备。间谍软件有时候会使用这个函数来捕获屏幕。这个函数也经常被编译器作为共享代码而添加。
user32!CallNextHookEx
功能:可以将钩子信息传递到当前钩子链中的下一个子程,一个钩子程序可以调用这个函数之前或之后处理钩子信息。
函数原型
LRESULT WINAPI CallNextHookEx(
_In_opt_ HHOOK hhk,
_In_ int nCode,
_In_ WPARAM wParam,
_In_ LPARAM lParam):
参数介绍:
hhk[可选]
说明:当前钩子的句柄
nCode [in]
说明:钩子代码; 就是给下一个钩子要交待的
传递给当前Hook过程的代码。下一个钩子程序使用此代码,以确定如何处理钩的信息。
wParam[in]
说明:要传递的参数; 由钩子类型决定是什么参数
wParam参数值传递给当前Hook过程。此参数的含义取决于当前的钩链与钩的类型。
lParam[in]
说明:要传递的参数; 由钩子类型决定是什么参数
lParam的值传递给当前Hook过程。此参数的含义取决于当前的钩链与钩的类型。
返回值:
返回这个值链中的下一个钩子程序。当前Hook过程也必须返回该值。返回值的含义取决于钩型。
备注:
在由SetWindowsHookEx函数设置了挂钩时间的代码中使用。CallNextHookEx函数会调用链上的下一个挂钩函数。分析调用CallNextHookEx的函数可以确定出SetWindowsHookEx设置挂钩的用意。
crypt32!CertOpenSystemStore
功能:用来访问本地系统中的证书。
函数原型:
HCERTSTORE WINAPI CertOpenSystemStore(
HCRYPTPROV hProv,
LPCTSTR szSubsystemProtocol
);
参数介绍:
hProv:CSP句柄,NULL为默认句柄,或者由CryptAcquireContext返回
szSubsystemProtocol:打开的系统存储区的名字。假如名字不为CA,MY,ROOT,SPC则新建一个证书存储区域,可以使用CertEnumSystemStore列出所有的已存在的系统存储区
返回值:
NULL表示失败,成功则返回证书句柄。
备注:
用来访问在本地系统中的证书。
kernel32!CreateMutex
功能:用来创建一个有名或无名的互斥量对象
函数原型:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针
BOOL bInitialOwner, // 初始化互斥对象的所有者
LPCTSTR lpName // 指向互斥对象名的指针
);
参数介绍:
lpMutexAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值),表示使用不允许继承的默认描述符
bInitialOwner Long,如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有
lpName String,指定互斥体对象的名字。用vbNullString创建一个未命名的互斥体对象。如已经存在拥有这个名字的一个事件,则打开现有的已命名互斥体。这个名字可能不与现有的事件、信号机、可等待计时器或文件映射相符
返回值:
Long,如执行成功,就返回互斥体对象的句柄;零表示出错。会设置GetLastError。即使返回的是一个有效句柄,但倘若指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS
备注:
创建一个互斥对象,可以被恶意代码用来确保在给定时刻只有一个实例在系统上运行。恶意代码经常使用固定名字为互斥对象命名,这样他们就可以成为一个很好的主机特征,来检测系统是否感染了这个恶意样本。
crypt32!CryptAcquireContext
功能:连接CSP,获得指定CSP的密钥容器的句柄;
函数原型:
BOOL WINAPI CryptAcquireContext(
__out HCRYPTPROV *phProv,
__in LPCTSTR pszContainer,
__in LPCTSTR pszProvider,
__in DWORD dwProvType,
__in DWORD dwFlags
);
参数介绍:
*phProv, CSP句柄指针
pszContainer, 密钥容器名称,指向密钥容器的字符串指针;如果dwFlags为CRYPT_VERIFYCONTEXT,pszContainer必须为NULL
pszProvider,指向CSP名称的字符串指针;为NULL,表示使用默认的CSP
dwProvType, CSP类型
dwFlags 标志位
返回值:
操作成功返回TRUE,否则返回FALSE。
备注:
这经常是恶意代码用来初始化使用Windows加密库的第一个函数。还有跟多其他函数是和加密相关的,绝大多数的函数都以Crypt开头。
EnbaleExecuteProtectionSupport
备注:一个未经文档化的API函数,用来修改宿主上的数据执行保护(DEP)设置,是的系统更容易被攻击。
kernel32!FindResource
功能:确定指定模块中指定类型和名称的资源所在位置。
函数原型:
HRSRC WINAPI FindResource( _In_opt_ HMODULE hModule, _In_ LPCTSTR lpName, _In_ LPCTSTR lpType);
参数介绍:
hModule:处理包含资源的可执行文件的模块。NULL值则指定模块句柄指向操作系统通常情况下创建最近过程的相关位图文件。
lpName:指定资源名称。若想了解更多的信息,请参见注意部分。
lpType:指定资源类型。若想了解更多的信息,请参见注意部分。作为标准资源类型。这个参数的含义同EnumResLangProc\lpType。
返回值:
如果函数运行成功,那么返回值为指向被指定资源信息块的句柄。为了获得这些资源,将这个句柄传递给LoadResource函数。如果函数运行失败,则返回值为NULL
备注:
用来在可执行文件和装在DLL程序中寻找资源的函数。恶意代码有时会使用资源来存储字符串,配置信息或者其他恶意文件。如果看到使用了这个函数,需要进一步检查恶意代码PE头中的.rsrc节
user32!FindWindow
功能:检索处理顶级窗口的类名和窗口名称匹配指定的字符串
函数原型:
HWND FindWindow
(
LPCSTR lpClassName,
LPCSTR lpWindowName
);
参数介绍:
lpClassName
指向一个以NULL字符结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。
如果该参数为null时,将会寻找任何与lpWindowName参数匹配的窗口。
lpWindowName
指向一个以NULL字符结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。
返回值:
如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。
如果函数执行失败,则返回值为 NULL
备注:
在桌面上搜索打开窗口的函数,有时这个函数会在反调试技术中使用,来搜索OllyDbg工具的窗口。
user32!GetAsyncKeyState
功能:用来判断函数调用时指定虚拟键的状态
函数原型:
SHORT GetAsyncKeyState(int nVirtKey);
参数介绍:
nVirtKey:指定256个可能的虚拟键盘值中的一个.
返回值:
指定虚拟键瞬时的状态值,它有四种返回值: 0—键当前未处于按下状态,而且自上次调用GetAsyncKeyState后改键也未被按过; 1—键当前未处于按下状态,但在此之前(自上次调用GetAsyncKeyState后)键曾经被按过; -32768(即16进制数&H8000) — 键当前处于按下状态,但在此之前(自上次调用GetAsyncKeyState后)键未被按过; -32767(即16进制数&H8001) — 键当前处于按下状态,而且在此之前(自上次调用GetAsyncKeyState后)键也曾经被按过。
备注:
用来确定一个特定键是否被输入。恶意代码有时会使用这个函数来实现一个击键记录器
user32!GetDC
功能:该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图。
函数原型:
HDC GetDC(HWND hWnd);
参数介绍:
hWnd:设备上下文环境被检索的窗口的句柄,如果该值为NULL,GetDC则检索整个屏幕的设备上下文环境。
返回值:
如果成功,返回指定窗口客户区的设备上下文环境;如果失败,返回值为Null。
备注:
返回一个窗口或者是整个屏幕的设备上下文句柄。间谍软件经常使用这个函数来抓取桌面截屏
user32!GetForegroundWindow
功能:获取一个前台窗口的句柄
函数原型:HWND GetForegroundWindow(void);
参数介绍:无
返回值:返回值是一个前台窗口的句柄。在某些情况下,如一个窗口失去激活时,前台窗口可以是NULL。
备注:返回桌面目前正在处于前端的窗口句柄,击键记录器普遍使用这个函数,来确定用户正在往哪个窗口输入
user32!GetKeyState
功能:该函数检取指定虚拟键的状态。该状态指定此键是UP状态,DOWN状态,还是被触发的
函数原型:
SHORT GetKeyState(int nVirtKey);
参数介绍:nVrtKey:定义一虚拟键。若要求的虚拟键是字母或数字(A~Z,a~z或0~9),nVirtKey必须被置为相应字符的ASCII码值,对于其他的键,nVirtKey必须是一虚拟键码。若使用非英语键盘布局,则取值在ASCIIa~z和0~9的虚拟键被用于定义绝大多数的字符键
返回值:
返回虚拟键的状态,若高序位为1,则键处于DOWN状态,否则为UP状态。
若低序位为1,则键被触发
备注:
被击键记录器使用,来获取键盘上一个特定键的状态。
kernel32!GetSystemDefaultLangId
功能:返回系统默认的语言设置
函数原型:
LANGID GetSystemDefaultLangID(void);
参数介绍:无
返回值:
返回本地系统的语言标识符
备注:
返回系统默认语言设置的函数。这可以用来定制显示与文件名,作为对感染主机摘要信息的获取,这个函数也会被一些由“爱国主义”所驱动的恶意代码使用,从而对一些特定区域的系统进行感染。
kernel32!GetTickCount
功能:返回从操作系统启动所经过的毫秒数
函数原型:
DWORD GetTickCount(void);
参数介绍:无
返回值:
返回从操作系统启动到当前所经过的毫秒数
备注:
返回从启动后到当前时间的微秒数。这个函数有时在反调试技术中被使用来获取时间信息。此函数也经常有编译器添加并包含在许多可执行程序中,因此简单的在导入函数列表中看到这个函数只能提供少量的线索信息
kernel32!GetVersionEx
功能:
函数原型:
BOOL WINAPI GetVersionEx(
_Inout_ LPOSVERSIONINFO lpVersionInfo
);
参数介绍:lpVersionInfo:用于装载版本信息的结构。在正式调用函数之前,必须先将这个结构的dwOSVersionInfoSize字段设为结构的大小(148)
结构体声明如下:
typedef struct _OSVERSIONINFO{
DWORD dwOSVersionInfoSize; //指定该数据结构的字节大小
DWORD dwMajorVersion; //操作系统的主版本号
DWORD dwMinorVersion; //操作系统的副版本号
DWORD dwBuildNumber; //操作系统的创建号
DWORD dwPlatformId; //操作系统ID号
TCHAR szCSDVersion[ 128 ]; //关于操作系统的一些附加信息
} OSVERSIONINFO;
返回值:
成功返回非0,失败返回0
备注:
返回目前正在运行的Windows操作系统版本信息。可以被用来获取受害主机的摘要信息,或是在不同Windows版本中选择未经文档化结构的一些偏移地址。
kernel32!IsDebuggerPresent
功能:确定调用进程是否由用户模式的调试器调试
函数原型:
BOOL WINAPI IsDebuggerPresent(void);
参数介绍:
无
返回值:
如果当前进程运行在调试器的上下文,返回值为非零值。
如果当前进程没有运行在调试器的上下文,返回值是零。
备注:
检查当前进程是否被调试,经常在反调试技术中使用,这个函数经常有编译器添加并包含在许多可执行程序中,因此简单的在导入函数列表中看到这个函数,只能提供少量的线索信息。
kernel32!LoadLibrary
功能:装载一个dll程序到进程中
函数原型:
HMODULE WINAPI LoadLibrary( _In_ LPCTSTR lpFileName);
参数介绍:
lpLibFileName指定要载入的动态链接库的名称。采用与CreateProcess函数的lpCommandLine参数指定的同样的搜索顺序
返回值:
成功则返回库模块的句柄,零表示失败
备注:
装载一个dll程序到进程中,而这个程序在程序启动时还没有被装载。几乎每一个Win32程序都会导入这个函数。
kernel32!LoadResource
功能:该函数装载指定资源到全局存储器。
函数原型:
HGLOBAL LoadResource(HMODULE hModule,HRSRC hReslnfo);
参数介绍:
hModule:处理包合资源的可执行文件的模块句柄。若hModule为NULL,系统从当前过程中的模块中装载资源。
hReslnfo:将被装载资源的句柄。它必须由函数FindResource或FindResourceEx创建。
返回值:
如果函数运行成功,返回值是相关资源的数据的句柄。如果函数运行失败,返回值为NULL
备注:
从PE文件中装载资源进入到内存中。恶意代码有时候会使用资源来存储字符串,配置信息或者其他恶意软件。
user32!MapVirtualKey
功能:该函数将一虚拟键码翻译(映射)成一扫描码或一字符值,或者将一扫描码翻译成一虚拟键码
函数原型:
UINT MapVirtualKey(UINT uCode,UINT uMapType)
参数介绍:
uCode:定义一个键的扫描码或虚拟键码。该值如何解释依赖于uMapType参数的值。
uMapType:定义将要执行的翻译。该参数的值依赖于uCode参数的值。取值如下:
0:代表uCode是一虚拟键码且被翻译为一扫描码。若一虚拟键码不区分左右,则返回左键的扫描码。若未进行翻译,则函数返回O。
1:代表uCode是一扫描码且被翻译为一虚拟键码,且此虚拟键码不区分左右。若未进行翻译,则函数返回0。
2:代表uCode为一虚拟键码且被翻译为一未被移位的字符值存放于返回值的低序字中。死键(发音符号)则通过设置返回值的最高位来表示。若未进行翻译,则函数返回0。
3:代表uCode为一扫描码且被翻译为区分左右键的一虚拟键码。若未进行翻译,则函数返回0。
返回值:
返回值可以是一扫描码,或一虚拟键码,或一字符值,这完全依赖于不同的uCode和uMapType的值。若未进行翻译,则函数返回0。
备注:
将一个虚拟键值代码转化成字符值,经常被击键记录器恶意代码所使用
kernel32!Module32First
功能:检索与进程相关联的第一个模块的信息
函数原型:
BOOL WINAPI Module32First(
HANDLE hSnapshot,
LPMODULEENTRY32 lpme
);
参数介绍:
hSnapshot
调用CreateToolhelp32Snapshot函数返回的快照句柄
lpme
MODULEENTRY32结构的指针。用来返回数据
结构体声明如下:
typedef struct tagMODULEENTRY32 {
DWORD dwSize;// 指定结构的长度,以字节为单位
DWORD th32ModuleID;// 此成员已经不再被使用,通常被设置为1
DWORD th32ProcessID;// 正在检查的进程标识符
DWORD GlblcntUsage;// 全局模块的使用计数,即模块的总载入次数
DWORD ProccntUsage;// 全局模块的使用计数
BYTE *modBaseAddr;// 模块的基址,在其所属的进程范围内。
DWORD modBaseSize;// 模块的大小,单位字节
HMODULE hModule;// 所属进程的范围内,模块句柄
TCHAR szModule[MAX_PATH];// NULL结尾的字符串,其中包含模块名。
TCHAR szExePath[MAX_PATH];// NULL结尾的字符串,其中包含的位置,或模块的路径。
} MODULEENTRY32, *PMODULEENTRY32, *LPMODULEENTRY32;
返回值:
成功返回TRUE失败返回FALSE
备注:
用来枚举装载到进程中的模块,注入器通常使用这个函数来确定注入代码的位置。
kernel32!Module32Next
功能:用来枚举装载到进程中的模块
函数原型:
BOOL WINAPI Module32Next( _In_ HANDLE hSnapshot, _Out_ LPMODULEENTRY32 lpme);
参数介绍:
hSnapshot
调用CreateToolhelp32Snapshot函数返回的快照句柄
lpme
MODULEENTRY32结构的指针。用来返回数据
返回值:
如果模块链中的下一个模块拷贝到了缓冲区中,就返回TRUE,否则返回FALSE。
备注:
用来枚举装载到进程中的模块,注入器通常使用这个函数来确定注入代码的位置。
Netapi32!NetScheduleJobAdd
功能:
函数原型:
NET_API_STATUS NetScheduleJobAdd( _In_opt_ LPCWSTR Servername, _In_ LPBYTE Buffer, _Out_ LPDWORD JobId);
参数介绍:
Servername:函数要执行的远程服务的DNS或NetBIOS名字
Buffer:执行AT_INFO结构的指针,描述了要提交的任务
JobId:新提交的任务ID
返回值:
成功返回NERR_Success,失败返回系统错误码
备注:
提交一个计划安排,来让一个程序在某个特定日期时间运行。恶意代码可以使用这个函数来运行一个其他程序,作为一位恶意代码分析师,需要定位与分析会在未来某个时间运行的程序。
kernel32!OpenMutex
功能:为现有的一个已命名互斥体对象创建一个新句柄。
函数原型:
HANDLE OpenMutex(
DWORD dwDesiredAccess, // access
BOOL bInheritHandle, // inheritance option
LPCTSTR lpName // object name
);
参数介绍:
dwDesiredAccess:
MUTEX_ALL_ACCESS 请求对互斥体的完全访问
MUTEX_MODIFY_STATE 允许使用 ReleaseMutex 函数
SYNCHRONIZE 允许互斥体对象同步使用
bInheritHandle : 如希望子进程能够继承句柄,则为TRUE
lpName :要打开对象的名字
返回值:
如执行成功,返回对象的句柄;零表示失败
备注:
打开一个双向互斥对象的句柄,可以被恶意代码用来确保在任意给定时间在系统上只能有一个运行实例。恶意代码通常使用固定名字来为互斥对象命名,因此可以用作很好的主机特征。
kernel32!OutputDebugString
功能:输出字符串到一个附加的调试器上。
函数原型:void WINAPI OutputDebugString( __in_opt LPCTSTR lpOutputString);
参数介绍:lpOutputString:需要输出的字符串
返回值:无
备注:可以被使用在反调试技术上。
user32!SetWindowsHookEx
功能:设置一个挂钩函数,使其在某个特定时间触发时被调用。
函数原型:
HHOOK WINAPI SetWindowsHookEx(
__in int idHook, \\钩子类型
__in HOOKPROC lpfn, \\回调函数地址
__in HINSTANCE hMod, \\实例句柄
__in DWORD dwThreadId); \\线程ID
参数介绍:
idHook:钩子类型
lpfn:回调函数地址
hMod:实例句柄
dwThreadId:线程ID
返回值:
若此函数执行成功,则返回值就是该挂钩处理过程的句柄;若此函数执行失败,则返回值为NULL
备注:
此函数普遍被击键记录器和间谍软件使用,这个函数也提供了一种轻易的方法,将一个DLL程序装载入系统的所有GUI进程中。这个函数有时也会被编译器添加。