首页
社区
课程
招聘
[原创]某GameThief木马分析
2023-6-10 11:43 15795

[原创]某GameThief木马分析

2023-6-10 11:43
15795

某GameThief木马分析

样本总体信息

初始文件:eada5b01ec5cb05087771672d7eae13a
卡巴检测为VHO:Trojan-GameThief.Win32.OnLineGames.gen
图片描述
Unpack文件:7d7d07e7fe7cf0df8018dd4ac63ae9d4
Remote_Injected_dll32:3afa06b0f19ac1bde4845c9871f04335
Binary114_dll64:afde65d08226e2f5c4d9922f514b61b3
Binary103_dll32:61465313f9436e2f0643535edf9b8b49
Binary109_sys64:86469a0506410b6ac66325419f735109
Binary107_dll64:1b1b1da222010d7354cb17e0e111f583
Binary110_dll32:9643a2235c8ec44dc78ad5fbb7d453ac
Binary111_dll32:3c2c58e6f29d4554eba9f08c2a441191
Binary110_103_dll32:a5edd8fd9c95a6563e0e829cf7db517e
Binary110_104_dll64:da0cfceb24f6c27a0faf813f5b9dd4db

初始文件

基本信息

初始文件由Upack打包,用于压缩文件体积。

Unpack文件

Unpack文件由初始文件解包而来

基本信息


文件资源段存在一个名为 "BINARY" 的资源文件,实际上是 dll 文件。

分析

检测当前操作系统是否符合要求。Windows版本必须为Windows 7或以上的操作系统版本

如果操作系统不符合要求,则会在 C:\Users\用户名\AppData\Local\Temp\ 目录下创建一个 .bat 文件并运行它,之后会退出进程

bat文件内容如下,用于删除自身及创建的bat文件。

使用ping命令来延迟执行,保证前面的命令已经执行完毕(即等待1.0.0.1主机3次回应)。接下来,使用del命令分别删除名为 C:\初始文件所在目录\7d7d07e7.exe 的文件和 “C:\Users\ADMINI~1\AppData\Local\Temp\4376.bat” 的文件,其中7d7d07e7.exe和5626bat 文件的文件名均为随机生成。
如果操作系统符合要求,检查当前进程访问令牌权限是否为SeDebugPrivilege,如果不是则使用AdjustTokenPrivileges提升进程访问令牌权限。

把dll形式的资源文件导入到系统目录(%%SystemRoot%%\syswow64\ 或 %%SystemRoot%%\system32)下,dll 文件名随机生成。

设置指定进程(secinit.exe、lodctr.exe、unlodctr.exe、instnm.exe)的环境变量名为 {4C1B162F-DD66-4463-A82E-CE4433FDB960}的值为 {BD1CD2B8-6745-44B8-A6D0-BD6F99CD0782} ,向指定进程中的某个进程远线程注入从资源段导出的dll。在注入过程中,会检索svchost.exe进程是否在运行,不在则创建svchost.exe进程,并判断svchost.exe是否运行在 WOW64 模式下,通过svchost.exe来启动指定进程。

 

secinit.exe 是安全初始化程序,用于初始化性能计数器的安全设置;
lodctr.exe 用于加载性能计数器计数器名称和 Explain 文本字符串 DLLs;
unlodctr.exe 用于卸载性能计数器计数器名称和 Explain 文本字符串 DLLs;
instnm.exe 则是安装名字服务的功能程序。

dll 已注入到 secinit.exe 进程中。

被注入的secint.exe进程的环境变量和值。

最后会创建一个 bat文件,其功能为删除自身和bat文件本身,用于消除与恶意行为有关的证据。

Remote_Injected_dll32

Remote_Injected_dll32 为初始文件注入到secinit.exe进程的dll文件

基本信息

分析

导出函数DllMain,首先提升进程令牌访问权限,接着使用DisableThreadLibraryCalls函数来禁用当前 DLL 的 DLL_PROCESS_ATTACH 和 DLL_PROCESS_DETACH 通知,之后会检查环境变量 {4C1B162F-DD66-4463-A82E-CE4433FDB960} 的值是否为 {BD1CD2B8-6745-44B8-A6D0-BD6F99CD0782},满足上述条件则会创建一个子线程。

不满足上述条件,则会检测 {F8A1D8BA-5B57-4AF0-B478-CAA36334E00F} 环境变量的值是否为 {C59D4706-B6EA-471E-941A-3D7384676E40} 。环境变量的值不满足并且 sub_1016E050函数返回为flase,就会终止当前进程。
sub_1016E050函数会注入指定进程和重新设置环境变量和值。

 

子线程会再次检查操作系统是否符合要求,获取并判断名为sdfasdfasfasdf 的窗口所在进程名是否为 svchost.exe ,如果是则终止该进程。等待5秒后,创建两个互斥量 [Guid(\"0A5D06B2-E8F1-42D1-B3AA-37D7C7174633\")] 和 [Guid(\"4F3CD4B2-B031-4C7C-AB94-C6F87F7E91B0\")] ,若其中一个互斥量已存在或创建失败时,检测当前进程是否为"secinit.exe",并终止该进程,确保互斥量创建成功且全局唯一,保证在多进程/线程下只有一个程序可以访问关键资源。

接着动态加载ALPC相关的API,如:NtAlpcAcceptConnectPort、NtAlpcCreatePort、NtAlpcSendWaitReceivePort、NtAllocateVirtualMemory等等,来创建一个名为 \RPC Control\E0BD3C9B-15CC-43D5-868C-B75AACFB7F50的RPC端口对象并执行一系列初始化和配置操作,确保端口的可用性。

当端口可用时,尝试打开服务 DcomLaunch,并获取其运行的进程 PID。如果打开服务失败,则遍历查找svchost.exe的 PID。一旦获取PID成功,首先会从RC资源段导出 Binary113 和 Binary114,其中Binary114是一个64位的dll(后续称此dll为Binary114_dll64),Binary113极有可能是shellcode,接着检测进程是否运行在 WOW64 模式下,如果是64位,会使用Heaven’s Gate(天堂之门)技术,将64位模块注入WoW64进程

之后与C2 服务器通信,通信前会从RC资源段导出名为Binary250,用RC4解密配置。发送内容包括channel_id、mac、ip、code、province、pubg_proxy_ip,之后还会检测当前进程位数以及从注册表 HKEY_LOCAL_MACHINE\Software\pubg_box 读取相关信息。


打开名为 {6F00AE89-797C-448A-978B-DCB2A7F3AB38} 的事件对象,检索并获取V6SLauncher.exe进程句柄 ,接着创建一个名为 Global\B5437222-9926-4F89-9DA1-F33214770865 的共享内存对象,并将映射到指定进程的虚拟地址空间中。

对很多字符串做了简单的异或加密,sub_1015AE60函数中解密后的字符串有:Steam.exe、ExecPubg.exe、TslGame_BE.exe、TslGame.exe、NVIDIA Web Helper.exe、csgo.exe、5EClient.exe、GameLoader.exe、crossfire.exe、CrossProxy.exe。
Steam.exe:Steam 平台的客户端程序,用于下载、安装、启动和管理各种游戏。
ExecPubg.exe:PUBG游戏的主程序。
TslGame.exe 和TslGame_BE.exe :PUBG 游戏的两个主要程序,后者为反作弊系统程序,用于检测和阻止作弊行为,前者为游戏本体程序。
NVIDIA Web Helper.exe:英伟达显卡驱动程序的辅助工具程序,用于提供一些额外的显卡驱动支持和功能。
csgo.exe:CS:GO游戏的主程序。
5EClient.exe:5E对战平台主程序。
GameLoader.exe:一些游戏的自定义启动器程序,比如穿越火线、DNF等游戏。
crossfire.exe 和 CrossProxy.exe:CF的主程序和代理程序,用于连接游戏服务器和提供网络数据传输支持。

 

包含WebSocket++ 库,WebSocket版本为0.8.2,WebSocket是html5中提出的一个协议规范,它允许浏览器与服务器中相互主动通信

检查系统中是否存在指定的DLL文件,如果存在则通过启动 regsvr32.exe来将其注册,并禁用Wow64文件系统重定向功能

调用FilterConnectCommunicationPort 连接 \ProcCommPort_{1FF62CDF-9626-41DF-8673-2C2DE973C0F8} 端口,如果连接成功,则在 C:\Windows\ 下创建一个目录并在此目录下创建一个 .sys文件,检测文件是否创建成功并恢复文件系统重定向,此过程中目录名和文件名均是随机生成长度为8的字符串,而.sys的文件内容从Remote_Injected_dll32的RC资源段导出Binary109并写入。

之后会将该驱动注册为自启动,在网络上可用的服务并启动服务。

在C:\Users\用户名\AppData\Local\Temp 创建一个随机文件名的dll文件,从资源段导出Binary103并写入内容,加载该dll并调用该dll的导出函数Install、UnInstall、SetTargetUrlCString、SetRedirectUrlStatus 函数,也会注册该dll

连接 \ProcCommPort_{1FF62CDF-9626-41DF-8673-2C2DE973C0F8} 端口,连接成功,则调用 CreateIoCompletionPort 创建一个 I/O 端口,并关联上述端口,用于异步I/O操作,然后创建第一个孙子线程。

第一个孙子线程主要实现 Windows 系统中的异步 I/O 操作,并对完成的 I/O 操作进行处理,如异常处理。

其中的关键I/O操作为监控 steam.exe、steamA.exe、csgolauncher.exe、steamchina.exe中某个进程的启动,在启动过程中则会从资源段先后导出Binary111(32位dll)和Binary112(极有可能是shellcode)注入到其中的某个进程中。

I/O操作之后,接着会动态加载ALPC相关API,创建名为 \RPC Control\60C926AD-394B-4FD5-AF74-4BA6163DF10F 的端口,然后在sub_1015F0E0函数中创建第二个孙子线程,第二个孙子线程用于\RPC Control\60C926AD-394B-4FD5-AF74-4BA6163DF10F的交互以及消息处理,如会从Binary111_dll32中导出相关函数;把Binary112的内容解密写入;包含调试字符串 \csgo\cfg\gamestate_integration_discordpresence.cfg 、--remote-debugging-port=37060、(steamwebhelper.exe.?"-steampid=\d?")、ExecPubg.exe、pubg_plugin_status、pubg_disable_cfentry_proxy、-LobbyUrl、(https.*html)、ExecPubg.exe、pubg_plugin_status等等。

 

--remote-debugging-port=37060: Chrome 浏览器启动时可以使用的一个命令行参数,用于指定一个端口号,使Chrome 可以远程调试连接。
(steamwebhelper.exe.?"-steampid=\d?"):一个正则表达式,匹配 Steam 平台中运行的名为 steamwebhelper.exe 进程的命令行参数。该参数表示启动该进程时传递一个 -steampid 的参数
ExecPubg.exe、pubg_plugin_status、pubg_disable_cfentry_proxy、ExecPubg.exe、pubg_plugin_status、pubg_disable_cfentry_proxy:与 PUBG游戏相关,游戏文件或插件或某些参数

注册窗口并创建一个窗口,并进入一个事件循环,接着注册一个本地进程间通信协议为 ncalrpc 的端口,并将其与名为[Guid(\"71CE029F-1D04-42EE-8DC8-5012FCC0EED3\")]的GUID关联,并开启监听,进入消息循环,不断接受并处理消息。最后,释放资源,包括卸载程序、释放映射文件、清空套接字库、卸载运行库、销毁对象、销毁线程池、关闭内核对象等操作。

在VT上查询部分C2地址,关联到多个样本,多数是dll文件。
https://www.virustotal.com/gui/domain/a.v6box.cn/relations
https://www.virustotal.com/gui/domain/c.v6box.cn/relations

Binary114_dll64

基本信息

分析

动态加载 DLL 来调用指定函数后,连接名为 \RPC Control\E0BD3C9B-15CC-43D5-868C-B75AACFB7F50 的RPC端口后,创建了两个用户态线程,并关闭了第二个线程返回的句柄。

第一个用户态线程,使用RPC端口进行进程间通信,当接受到消息时会执行sub_180001B50函数会创建一个用户态子线程来处理接收到的消息;第二个用户态线程会等待一个内核对象并在其被通知后关闭该对象,返回ALPC端口句柄。子线程会创建指定进程的环境块,如环境变量、工作目录等,再通过NtOpenProcess、NtAllocateVirtualMemory、NtCreateThreadEx实现远程注入。

最后遍历当前进程的模块列表,来卸载注入的dll,注册一个事件,标识着该 dll已被卸载

Binary103_dll32

基本信息

分析

导出函数Install,初始化一个安全描述符,并将该安全描述符与创建的名为{B8592103-AE8C-4D37-807F-F1CB76E62B7C}的互斥对象相关联。

如果互斥对象创建成功,则会检测当前系统上是否运行 Steam.exe,如果在运行则远线程注入指定dll。

导出函数SetTargetUrl用于设置链接的目标URL,URL指向导出函数Address,在Address函数中存在字符串 \csgo\cfg\gamestate_integration_discordpresence.cfg 、-LobbyUrl、(https.html)、Tslgame.exe、ExecPubg.exe。
\csgo\cfg\gamestate_integration_discordpresence.cfg 是一个CS:GO的游戏配置文件,用于与 Discord 集成并显示玩家状态。
-LobbyUrl 是一种命令行参数,通常用于指定多人游戏中的游戏大厅链接地址(Lobby URL)
(https.
html) 是一个正则表达式,可以匹配包含 "https" 和 ".html" 的任意字符串
导出函数UnInstall,用于卸载钩子和释放互斥对象;SetTargetUrlCString函数设置CString对象;SetRedirectUrlStatus函数重定向URL状态。

 

DllMain函数,dll加载且互斥对象创建成功时,遍历进程来检测Steam.exe进程中当前模块是否存在,然后通过fdwReason 的值来判断操作系统是在加载还是卸载该DLL,如果是加载事件(fdwReason = 1),禁用DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知,执行sub_100067F0函数;如果是卸载事件(fdwReason = 0),则执行sub_10006A80函数。

sub_100067F0函数:创建一个RPC字符串绑定,关联的GUID为[Guid(\"71CE029F-1D04-42EE-8DC8-5012FCC0EED3\")]并Hook CreateProcessInternalW函数,然后根据程序计数器判断是否释放互斥对象和终止当前线程,最后创建一个新的定时器对象。HOOK CreateProcessInternalW函数来实现对steam.exe进程创建的完全控制,在进程创建过程中经 枚举进程快照获得指定进程PID-->OpenThread-->SuspendThread-->GetThreadContext-->获取EIP-->修改EIP-->SetThreadContext-->ResumeThread 的方式实现线程挂起注入。

sub_10006A80函数会判断HOOK或线程挂起注入是否成功,成功则返回0,接着释放内存,销毁堆对象、释放定时器对象等。

Binary109_sys64

基本信息


驱动含有一个证书签名
图片描述
PDB信息

分析

加载并注册该驱动,注册驱动前检查当前系统是否开启了内核调试器,接着检测操作系统是否符合要求。符合要求时,注册一个监控进程创建的回调函数,该回调函数还会过调用PsGetProcessWow64Process函数获取进程的Wow64进程对象;注册了一个进程镜像加载的回调函数,并创建了一个名为 \ProcCommPort_{1FF62CDF-9626-41DF-8673-2C2DE973C0F8} 的通信端口,以便其他进程可以与该端口进行通信,通过FltStartFiltering函数启动过滤器,开始对进程的镜像加载进行过滤。

Binary107_dll64

基本信息

分析

主要为三个导出函数,DllRegisterServer、DllUnregisterServer、NSPStartup,其中DllRegisterServer函数功能为注册NSPStartup函数,DllUnregisterServer 为卸载NSPStartup函数
NSPStartup函数中,首先打开名为 Global\B5437222-9926-4F89-9DA1-F33214770865 的内存映射文件,之后会初始化和注册NSP、TCPProxy 类对象的初始化、创建与网络接口有关的I/O完成端口等等。

Binary110_dll32

基本信息

分析

只有获取到环境变量{FC3BA882-AAED-4E7F-8C6B-1224A40646D3} 的值为 {E7539593-2191-4A9D-ABC4-3940BD6E6279} 时,才会创建一个线程 。

该线程首先会创建一个snqu::CsGoPlug的对象,将其添加到列表中,然后解密以下URL:http:[//]csapi[.]skinsabc[.]com、http:[//]csapi[.]skiin[.]com、http:[//]csreport[.]skinsabc[.]com,将URL传递给sub_1000CC30函数并执行,最后释放snqu::CsGoPlug对象;在sub_1000CC30函数中,创建一个名为 [Guid("499D40B1-D0D6-4336-9AAF-DD7A5B535923")] 的全局互斥对象,之后会进行消息循环处理、相关的异常处理等。

CsGoPlug类中包含三个函数sub_1000FFE0、sub_10010000、sub_10010020。
在sub_1000FFE0函数中,sub_1000FD6函数的子函数sub_101B5D70会获取桌面窗口的客户区矩形大小,并创建一个新线程来执行sub_101B5BA0函数用于检查窗口是否存在且有效,并调用 MoveWindow 函数移动窗口位置与另一个窗口的位置重叠,达到HOOK窗口的目的。

子函数sub_1000F670会检查CefCore.dll是否存在并设置环境变量{73E58D05-D2A4-4A6E-BFB5-762A53DA1EE0}的值为CefCore.dll的路径,接着从自身RC资源段导出dll,即Binary110_104_dll64,然后禁用当前线程中的文件系统重定向,注册导出的dll文件。
子函数sub_100485F0和sub_10048640相对比较复杂,根据调用的API还有调试信息,如:API:CreateWindowExA、ShowWindow、UpdateWindow、GetWindowRec、 PostMessageA、PtInRect等,字符串:cs_main_page、csgo.png、csgo_center.png、csgo_banner.png、steam_banner.png、plug check csgo_show_paster:%s、null steam banner、csgo_resource_923等,可以大致推断出功能为HOOK指定窗口,获取指定窗口信息,对指定窗口进行监控以及窗口相关消息处理等等。

sub_10010000函数主要用于销毁窗口及其子窗口,释放与窗口相关的资源,释放 OLE 库所占用的资源等。sub_10010020调用PostMessageA把消息放入消息队列然后返回。

在 sub_10045BC 函数中,存在json字段nickname、steamId、channelId、mac、ip,而在sub_100087E0函数中存在字符串channel_id={0}&mac={1}&ip={2}&steam_id={3}&type={4}&launcher={5}&version=20220923 ;该dll中包含一个Crypto++库,可能是用于在加密通信数据。

Binary111_dll32

基本信息

分析

连接名为 \RPC Control\60C926AD-394B-4FD5-AF74-4BA6163DF10F 的RPC端口,通过该端口与远程主机建立连接,然后卸载指定模块,注册 ETW 事件并记录相关信息,最后调用sub_10001800函数。

sub_10001800函数主要用于卸载动态HOOK:Inline Hook和远程HOOK,通过检查 P 列表的内存保护属性来判断是否存在 hook,如果存在则通过恢复被修改的代码区域,以及还原被修改的代码区域的访问权限来卸载HOOK。

Binary110_103_dll32

位于Binary110_103资源段

基本信息

分析

导出函数CreateInstance用于创建COM组件的实例对象,其中有CMbPlugEx类、CMbPlug类,而在CMbPlugEx中的sub_10004280有一个EventSink类。在CmbPlug类中的sub_10004250中有一个函数sub_1000E740,功能很有可能是CEF注入。下面对sub_1000E740函数进行分析。
sub_100012B0函数会检索当前进程所在操作系统是否为64位,通过改变DLL目录的方式来延迟加载dll,最后动态加载libcef.dll中的相关API。

sub_10002730函数用于检测libcef.dll文件版本是否为85.0.0。实际上,在..\steam\bin\cef\cef.win7x64目录,存在一个libcef.dll文件,版本号为85.0.0

sub_1000ECE0用于获取steamwebhelper.exe进程的可执行文件路径和所有模块句柄

之后根据一些字符信息,如:initialize_cef_app、initialize_client_handler、initialize_cef_load_handler、cef_shutdown等等涉及CEF初始化设置、启动、页面加载、关闭等,并基于此https://bbs.kanxue.com/thread-262546.htm,推测BINARY110_103_dll32 功能很有可能为向steam页面插入广告或者是伪造页面。

Binary110_104_dll64

位于Binary110_103资源段

基本信息

分析

获取当前进程的文件名,并判断该进程是否为 regsvr32.exe,如果不是,则创建一个子线程。

子线程会创建一个窗口,并通过消息循环来处理相关事件,

而sub_180017EC0函数功能与Binary110_103_dll32中的sub_1000E740、sub_10002730、sub_1000ECE0等函数功能差不多。
包含几个导出函数DllInstall、DllRegisterServer、DllUnregisterServer、DllCanUnloadNow、DllGetClassObject。
DllInstall函数用于安装DLL,DllRegisterServer 注册 dll,并返回注册结果。如果注册失败,则会调用 DllUnregisterServer 卸载 dll。

DllRegisterServer函数用于初始化COM对象,将 dll 注册为 COM 对象,并将该 COM 对象关联到的 AppID 和 CLSID。AppID名为{58942be0-6d19-4812-ac05-fb480c913727}。

DllUnregisterServer用于反注册dll;DllCanUnloadNow 函数用于检查当前组件是否可以被卸载;DllGetClassObject 函数用于获取 COM 组件的类工厂对象,以便后续调用类厂对象的 CreateInstance 方法来创建组件的对象实例。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2023-6-12 01:25 被megaparsec编辑 ,原因:
收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回