-
-
[原创]某GameThief木马分析
-
发表于: 2023-6-10 11:43 17627
-
初始文件: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文件由初始文件解包而来
文件资源段存在一个名为 "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 为初始文件注入到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
动态加载 DLL 来调用指定函数后,连接名为 \RPC Control\E0BD3C9B-15CC-43D5-868C-B75AACFB7F50 的RPC端口后,创建了两个用户态线程,并关闭了第二个线程返回的句柄。
第一个用户态线程,使用RPC端口进行进程间通信,当接受到消息时会执行sub_180001B50函数会创建一个用户态子线程来处理接收到的消息;第二个用户态线程会等待一个内核对象并在其被通知后关闭该对象,返回ALPC端口句柄。子线程会创建指定进程的环境块,如环境变量、工作目录等,再通过NtOpenProcess、NtAllocateVirtualMemory、NtCreateThreadEx实现远程注入。
最后遍历当前进程的模块列表,来卸载注入的dll,注册一个事件,标识着该 dll已被卸载
导出函数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,接着释放内存,销毁堆对象、释放定时器对象等。
驱动含有一个证书签名
PDB信息
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [原创]Discord Stealer样本分析 12330
- [原创]某GameThief木马分析 17628
- 3CX供应链攻击样本分析 17102
- Sality病毒分析 12648