对Formbook的逆向工程分析,这是一种利用.NET程序集操作和XOR解密的信息窃取程序。通过x32dbg提取了完整载荷,包括XOR解密循环、CLR初始化、SQLExpress诱饵以及键盘记录/剪贴板API。
x32dbg 内存转储显示,Formbook 解密其配置数据,并使用 NtAllocateVirtualMemory 为其分配内存。
NtAllocateVirtualMemory – 为解密后的载荷分配内存。mov edx, dword ptr ds:[esi+1C] – 从 ESI 寄存器中获取加密数据的大小。push 0x1000 – 使用 MEM_COMMIT 分配内存。push 0 – 指定分配类型或保护标志。mov edx, dword ptr ds:[esi+4] – 获取另一个配置值。lea ecx, [ebp-4] – 加载指向局部变量的指针。test ecx, ecx – 检查指针是否有效。mov ecx, [esi+1C] – 再次获取加密数据大小。push 0x1000 – 重复 MEM_COMMIT 标志。push 0 – 重复分配标志。ConnectionStrings – 用于 C2 地址的 .NET 配置键。system.data、DbProviderFactories – .NET 配置节(可能是诱饵)。system.serviceModel – .NET 服务模型节。<DbProviderFactories /> – 空 XML 元素(诱饵)。ConnectionStrings 很可能包含 C2 URL。
显示 NtAllocateVirtualMemory 和 ConnectionStrings 解密的 x32dbg 视图。
此 x32dbg 视图显示,Formbook 使用 .NET 程序集操作、基于 XOR 的解密以及 CLR(公共语言运行时)初始化来执行其载荷。
xor eax, eax – 清零 EAX,表明使用基于 XOR 的解密。call 0x6C6E7F60 – 调用解密或处理函数。call 0x6C6EE8B0 – 调用另一个处理函数。DllCanUnloadNowInternal – 管理 .NET 程序集的加载/卸载。PublicKeyToken=31bf3856ad364e35 – 冒充 Microsoft 程序集。system.serviceModel – .NET 服务模型配置(C2 通信)。System.Web – .NET Web 配置(基于 HTTP 的 C2)。clr.NGenCreateNGenWorker – 创建 .NET 本机映像生成器工作线程。clr.GetCLRFunction – 获取 CLR 函数。return to clr.Initialize – 初始化 .NET 运行时。xor eax, eax 及后续的 call 函数证实了基于 XOR 的解密。PublicKeyToken 使其看起来像 Microsoft 程序集。system.serviceModel 和 System.Web 存储 C2 设置。
显示 XOR 解密、DllCanUnloadNowInternal 和 CLR 初始化的 x32dbg 视图。
此 x32dbg 视图显示,Formbook 使用与 SQLExpress 相关的字符串作为诱饵,并初始化 .NET CLR 以执行其载荷。
L"ce=..\SQLEXPR" – 一个诱饵字符串,与 SQL 数据窃取无关。它用于使恶意软件看起来像合法的 SQL Server Express 组件clr.InitializeFusion – 初始化 .NET Fusion 程序集加载器,用于将 .NET 载荷加载到内存中。clr.GetCLRFunction – 获取 CLR 函数以执行托管代码。clr.NGenCreateNGenWorker – 创建 .NET 本机映像生成器工作线程,使载荷无需 JIT 编译即可运行。return to clr.InitializeFusion+1751 – 返回到 CLR 初始化例程。SQLEXPR 字符串是用于规避安全工具检测的诱饵。
显示 L"ce=..\SQLEXPR"、clr.InitializeFusion 和 CLR 函数的 x32dbg 视图。
此 x32dbg 视图显示 Formbook 载荷的起始位置,位于标准 PE DOS 存根消息之后。恶意软件使用 XOR 解密循环在内存中解密其载荷。
This program cannot be run in DOS mode – 标准 PE DOS 存根消息。xor dword ptr ds:[edi], eax – 将 EDI 处的数据与 EAX 进行 XOR 运算(解密)。mov al, byte ptr ds:[edi+1] – 将 EDI+1 处的一个字节加载到 AL。xor al, byte ptr ds:[edx+1] – 将 AL 与 EDX+1 处的字节进行 XOR 运算(解密密钥)。mov byte ptr ds:[edi], al – 将解密后的字节写回 EDI。call ntdll.77DDE45C – 调用 RtlIsCurrentThreadAttachExempt(反调试)。cmp dword ptr ds:[esi+4], 0 – 检查计数器(ESI+4)是否为零。sub dword ptr ds:[esi+4], eax – 递减计数器。test edx, edx – 测试 EDX 是否为零。jne ntdll.77DDF9F4 – 若非零则循环返回(解密循环)。RtlIsCurrentThreadAttachExempt 以规避调试器。
显示标准 PE DOS 存根消息之后 XOR 解密循环的 x32dbg 视图。
对提取载荷的 Binary Ninja 分析揭示了 Formbook 用于键盘记录、剪贴板劫持和权限提升的全面 API 列表。
SetClipboardData、GetClipboardData – 窃取并替换剪贴板数据。SetWindowsHookExW、SetWindowsHookExA – 安装键盘钩子。NtSetInformationProcess、NtCreateThreadEx、NtTerminateProcess。NtAdjustPrivilegesToken – 调整令牌权限。NtShutdownSystem、SystemParametersInfoA/W。MsInstallProductW/A – 安装产品以实现持久化。CreateProcessInternalW – 创建新进程。MsInstallProductW/A 确保恶意软件在启动时运行。
显示键盘记录、剪贴板和权限提升 API 的 Binary Ninja 视图。
本次分析发现了 Formbook,一种复杂的信息窃取程序,它使用加密配置、.NET 程序集操作、XOR 解密以及键盘记录/剪贴板劫持。
NtAllocateVirtualMemory 在内存中解密其配置。DllCanUnloadNowInternal 和 PublicKeyToken 冒充 Microsoft 程序集。clr.InitializeFusion 和 clr.NGenCreateNGenWorker 运行其 .NET 载荷。L"ce=..\SQLEXPR" 作为诱饵以规避检测。SetWindowsHookExW、SetClipboardData 和 GetClipboardData。NtAdjustPrivilegesToken 获取提升的访问权限。NtAllocateVirtualMemory 和 ConnectionStrings。DllCanUnloadNowInternal 和 CLR 初始化。SetWindowsHookExW 和 SetClipboardData 调用。NtAdjustPrivilegesToken 和 NtCreateThreadEx 的使用。所分析的 Formbook 样本可在 MalwareBazaar 上获取,供希望自行分析的人员使用:
🔗 MalwareBazaar 上的 Formbook 样本
使用的工具: x64dbg、Binary Ninja