恶意代码分析系列-几种常用技术(1)
字数 839 2025-08-15 21:31:07
恶意代码常用技术分析:释放与启动篇
开发环境与工具
- 操作系统:Windows 10 x64 1909
- 开发工具:Visual Studio 2017
- 编程语言:C/C++
- 编译版本:Debug版本
单一实例运行技术
技术原理
恶意程序通常需要确保系统中只有一个实例在运行,避免重复感染或资源冲突。
关键API
WINAPI CreateMutexA(
_In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes, // 安全属性指针,可为NULL
_In_ BOOL bInitialOwner, // 初始化互斥体对象的所有者
_In_opt_ LPCSTR lpName // 互斥体对象名称指针
);
注意事项
- 互斥体对象名称不能与现有的事件、信号量或文件映射对象名称相同
- 名称冲突会导致互斥体创建失败
资源释放技术
技术原理
将DLL、EXE、文本或图片等文件作为资源嵌入到程序中,运行时再释放到本地,减少文件数量降低被发现风险。
关键API函数
- 查找资源:
HRSRC WINAPI FindResource(
_In_opt_ HMODULE hModule, // 模块名称
_In_ LPCWSTR lpName, // 资源名称
_In_ LPCWSTR lpType // 资源类型
);
- 获取资源大小:
DWORD WINAPI SizeofResource(
_In_opt_ HMODULE hModule,
_In_ HRSRC hResInfo
);
- 加载资源:
HGLOBAL WINAPI LoadResource(
_In_opt_ HMODULE hModule, // 模块名称
_In_ HRSRC hResInfo // 资源句柄
);
- 锁定资源:
LPVOID WINAPI LockResource(
_In_ HGLOBAL hResData
);
实现流程
- 使用
FindResource定位程序内嵌资源 - 通过
SizeofResource获取资源大小 - 使用
LoadResource将资源加载到程序内存 - 通过
LockResource锁定内存中的资源,防止被其他操作影响
DLL延迟加载技术
技术原理
仅在真正调用DLL时才加载,在此之前程序可正常执行,减少初始加载时间和降低静态分析被发现的风险。
实现方法
-
开发环境设置:
- 在VS链接器中设置延迟加载的DLL(如ucrtbased.dll)
- 重新生成项目即可实现延迟加载
-
PE结构位置:
- 位于PE文件NT头中的
DataDirectory -> IMAGE_DIRECTORY_ARRY
- 位于PE文件NT头中的
程序启动技术
常用启动API
- WinExec:
UINT WINAPI WinExec(
_In_ LPCSTR lpCmdLine, // 要执行的程序的命令行
_In_ UINT uCmdShow // 显示选项
);
- ShellExecute:
HINSTANCE ShellExecuteW(
_In_opt_ HWND hwnd, // 父窗口句柄
_In_opt_ LPCWSTR lpOperation, // 操作类型:edit/explore/find/open等
_In_ LPCWSTR lpFile, // shell名称空间对象
_In_opt_ LPCWSTR lpParameters, // 可执行文件参数
_In_opt_ LPCWSTR lpDirectory, // 默认操作目录
_In_ INT nShowCmd // 窗口显示方式
);
- CreateProcess:
BOOL WINAPI CreateProcessW(
_In_opt_ LPCWSTR lpApplicationName, // 执行模块名
_Inout_opt_ LPWSTR lpCommandLine, // 执行命令行
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程安全属性
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程安全属性
_In_ BOOL bInheritHandles,
_In_ DWORD dwCreationFlags, // 优先级和创建标志
_In_opt_ LPVOID lpEnvironment, // 新进程环境块指针
_In_opt_ LPCWSTR lpCurrentDirectory, // 进程当前目录路径
_In_ LPSTARTUPINFOW lpStartupInfo, // STARTUPINFOW结构指针
_Out_ LPPROCESS_INFORMATION lpProcessInformation // PROCESS_INFORMATION结构指针
);
隐藏技巧
- 使用
SW_HIDE参数可以隐藏程序窗口 - 可成功隐藏执行CMD命令行的窗口
防御建议
- 监控上述API的调用行为
- 检查程序是否创建互斥体
- 分析PE文件中的资源段
- 检测延迟加载的DLL
- 监控异常进程创建行为
参考书籍
- 《Windows黑客编程技术详解》
- 《黑客大曝光》
注:下一篇将探讨恶意代码注入技术,分析常见的注入手段。