恶意代码分析系列-几种常用技术(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函数

  1. 查找资源
HRSRC WINAPI FindResource(
    _In_opt_ HMODULE hModule,  // 模块名称
    _In_ LPCWSTR lpName,       // 资源名称
    _In_ LPCWSTR lpType        // 资源类型
);
  1. 获取资源大小
DWORD WINAPI SizeofResource(
    _In_opt_ HMODULE hModule,
    _In_ HRSRC hResInfo
);
  1. 加载资源
HGLOBAL WINAPI LoadResource(
    _In_opt_ HMODULE hModule,  // 模块名称
    _In_ HRSRC hResInfo        // 资源句柄
);
  1. 锁定资源
LPVOID WINAPI LockResource(
    _In_ HGLOBAL hResData
);

实现流程

  1. 使用FindResource定位程序内嵌资源
  2. 通过SizeofResource获取资源大小
  3. 使用LoadResource将资源加载到程序内存
  4. 通过LockResource锁定内存中的资源,防止被其他操作影响

DLL延迟加载技术

技术原理

仅在真正调用DLL时才加载,在此之前程序可正常执行,减少初始加载时间和降低静态分析被发现的风险。

实现方法

  1. 开发环境设置

    • 在VS链接器中设置延迟加载的DLL(如ucrtbased.dll)
    • 重新生成项目即可实现延迟加载
  2. PE结构位置

    • 位于PE文件NT头中的DataDirectory -> IMAGE_DIRECTORY_ARRY

程序启动技术

常用启动API

  1. WinExec
UINT WINAPI WinExec(
    _In_ LPCSTR lpCmdLine,  // 要执行的程序的命令行
    _In_ UINT uCmdShow      // 显示选项
);
  1. 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               // 窗口显示方式
);
  1. 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命令行的窗口

防御建议

  1. 监控上述API的调用行为
  2. 检查程序是否创建互斥体
  3. 分析PE文件中的资源段
  4. 检测延迟加载的DLL
  5. 监控异常进程创建行为

参考书籍

  • 《Windows黑客编程技术详解》
  • 《黑客大曝光》

注:下一篇将探讨恶意代码注入技术,分析常见的注入手段。

恶意代码常用技术分析:释放与启动篇 开发环境与工具 操作系统 :Windows 10 x64 1909 开发工具 :Visual Studio 2017 编程语言 :C/C++ 编译版本 :Debug版本 单一实例运行技术 技术原理 恶意程序通常需要确保系统中只有一个实例在运行,避免重复感染或资源冲突。 关键API 注意事项 互斥体对象名称不能与现有的事件、信号量或文件映射对象名称相同 名称冲突会导致互斥体创建失败 资源释放技术 技术原理 将DLL、EXE、文本或图片等文件作为资源嵌入到程序中,运行时再释放到本地,减少文件数量降低被发现风险。 关键API函数 查找资源 : 获取资源大小 : 加载资源 : 锁定资源 : 实现流程 使用 FindResource 定位程序内嵌资源 通过 SizeofResource 获取资源大小 使用 LoadResource 将资源加载到程序内存 通过 LockResource 锁定内存中的资源,防止被其他操作影响 DLL延迟加载技术 技术原理 仅在真正调用DLL时才加载,在此之前程序可正常执行,减少初始加载时间和降低静态分析被发现的风险。 实现方法 开发环境设置 : 在VS链接器中设置延迟加载的DLL(如ucrtbased.dll) 重新生成项目即可实现延迟加载 PE结构位置 : 位于PE文件NT头中的 DataDirectory -> IMAGE_DIRECTORY_ARRY 程序启动技术 常用启动API WinExec : ShellExecute : CreateProcess : 隐藏技巧 使用 SW_HIDE 参数可以隐藏程序窗口 可成功隐藏执行CMD命令行的窗口 防御建议 监控上述API的调用行为 检查程序是否创建互斥体 分析PE文件中的资源段 检测延迟加载的DLL 监控异常进程创建行为 参考书籍 《Windows黑客编程技术详解》 《黑客大曝光》 注:下一篇将探讨恶意代码注入技术,分析常见的注入手段。