: y( N k) T) ]! W( q: t
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
# r8 a. C; j! F" E7 I$ o% M
3 l( j7 a; s( p5 e0 e5 O+ T9 g
7 u3 B5 ~8 ^' a$ l
1 Z1 ^+ k4 m4 i! G: l + W' k" f& u9 K
5 |7 S. L7 @0 Y! D: F0 U
2 Y+ I* u+ \" m0 s ) a! q2 @" Q+ i6 x: K* U; z9 A' D
u, W6 C$ d, X1 N$ a 下面就以开发者角度进行解析下这个APP的功能的实现原理。 % x( V) T, t5 y9 o$ S& y$ h- e
0 S) t5 j& ~* `: M: U9 M' J; {/ H$ s% w6 g2 s& k+ M
, ]. M0 I- }4 w7 e# v
! t" M5 a) ]* w' q9 Q( y; B2 \! i; m) ~5 q; u5 L4 m T
基础信息 ! H) v0 U( _2 d y- `+ ?
" F f& [* h0 W$ G/ A* |5 ]
. K( i: x1 N) W; q* s) X
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 0 t: R& [2 ^- D6 }
5 @! \ m% |" h6 q
' ~* ~9 V7 D& g1 F% X% ?3 H 2 p4 S5 ~% U8 A
9 x/ A8 _6 v- a& F: b4 b) Y
+ E7 x& \- w Z1 j8 n
1 L3 z* f0 B3 M( m, V5 Y" Z1 {7 F! P & o- F/ q' v+ [+ |% n
/ P0 _& A; f2 u) d% I 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
, b# ~* o: E9 P/ r' ] 8 F9 u& S/ V3 B7 S5 M
- k$ {, T/ {2 y0 @
: f4 B1 m0 W! |: R: g$ I
2 Z/ A$ i# g5 v3 t
# P+ |0 ^7 U/ C8 P
. f a/ l5 _- T6 T% k 6 W+ h" j8 m, `1 r
+ l/ n4 Q# C- L' B: v 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
# y+ V" J3 b" ?* j, D! c; d; i7 k7 {1 }
- E8 i/ d0 `# h& B- q
7 S% G6 [# M1 ]. ] % N8 L i- M8 j# Q& |" O/ @# z
. }. K5 P+ g. h/ S
3 ~) B5 f' Q2 C7 W+ \ - G4 ?9 v* g9 Q S
3 F7 K1 u% D W
, K, {0 P; `. h* f9 f! _
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
6 W5 h1 e I- \# R. m : b5 D+ Q$ D& v# E$ T1 |) T- t) l
5 V0 t. X- f, M- b* b: J: u
6 ]" } d; @9 T# O6 C* U
2 ~/ U; [3 e0 ~5 q0 t1 c
. g& ~) K, n7 `6 i Y3 ] ! V( K4 r; W& W, x3 ]
- M% E0 u$ L2 k( b- ]) M' J, F
9 m9 z% u8 X4 a* X& ?1 z6 _& K: y 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
# q, y' }4 F$ R: E
# V8 C$ X9 ~/ h( c* s. T
; f$ u" }9 Z6 \: r% Z ! D# s# ]' {: i: {9 O( G, F
$ D! P- A7 F8 t4 l/ A, h
- x( @% f" k' j* d6 Q' `" Z8 P3 F
, D6 k/ o! _. {+ R9 J( Z
! M; q5 A$ T4 q. ?, v ^2 o
6 g: N+ `# g1 x: {# p . @9 b' r8 J' J
: o) n7 x' j$ V& J/ [, C$ j F7 W; x& T- l+ u& V
签名信息 8 r% k1 L2 a# f8 p1 ~* m5 w; n
U. i7 G, ~& V1 d
1 I: O& z( K1 x# s 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
- I, [9 L5 n8 a7 i- J5 w
3 z) ]# {* g0 w2 U3 h F4 }/ J
! R' g8 `6 {/ c5 r2 V; ^ 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
& H2 N' [5 e% C/ F; Z9 Q+ B ; c3 R+ k7 x$ u
; F7 @+ `( q8 k
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 2 e( e+ a' n+ B
6 @' _# I% d' |: i: E$ I3 j E3 A
L! r. e1 p3 T
' ]' ^8 ^4 D2 P0 Y
# q* c% j, Z1 ^3 f- r# S' t/ F. \% e$ x' T
, Q: _: ~7 R- T9 m* w; b
& y$ e+ M) N8 F( [; W
2 W( ]5 S4 u3 _! b6 Z
android签名的数字证书的一般都是采用 X.509的国际标准。
" m: z6 P; r" j
" {' U+ Y5 ?5 o
" \2 P1 q5 L0 \, d; j 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
, @+ [+ M* D& ^) G; ]. T4 a. u K1 g 9 }3 y9 m% \! q C: s
3 a/ O( [2 g' V0 J" F 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 4 B2 H: R/ u. W7 X% X
+ J! L2 D! J" y: r0 U9 P! E, r/ \# o' x/ U7 H
( Z3 k, b A# \2 O# | t* c0 Z6 |
+ i r' D% L7 w9 h# {4 T# M
/ b. ^3 s) K$ v: p2 I$ d& e0 k' Y
8 r M+ E, C, n! a) x6 u0 ~ . z4 l d' S0 b
. Q+ q1 T* W0 n$ Z
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
7 H: e1 T* ?* M# r, p) l - |7 F$ c- t' L) g; `9 `* W
6 C* D5 m, {8 w4 s1 h
' u ]6 y" M2 j" F
, k+ b5 z" A$ ^: B; x7 W
( R/ s9 U9 q0 |/ `! u5 _2 a 、 ! h4 _2 A4 U6 m. Z
: b, s+ y4 b) t& K4 C! R8 S
4 ?2 S$ L7 H" c5 ^5 T6 I % M( t' f; C) L2 J9 k! G1 G7 U
7 x, l8 O) r1 }3 u+ q% q+ z% ~6 D
8 m4 o+ w' U+ z) f0 H 权限信息 - N$ W, L( }( ?2 ?
' u; E; Z+ Q4 ]% n' O: y3 J* a* d3 a4 ]' f t
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
6 |5 j. j1 {$ A7 Z- c
+ q4 F6 U* M$ K8 i$ W4 y. P' M- j. i$ G1 W# ^& |
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
. }/ ~' n$ n' U# F
: } q' y0 P9 \3 R" l. ]; c0 j+ ?) L- H( C# i4 g, T2 F
, r/ Z( l( n6 r- q' ?: o; L! W
' N- E2 F2 D v0 D8 T( B; R2 o# R J7 a. y( i& L
" Z$ P' k* \8 r* b( Y 2 L9 e9 d8 B8 z- [ h( u i# f, T
- s" V N- P+ a$ e; L$ S 下面对这个APP的所有权限进行详解下: Y9 b; ^* b7 ?; ]/ ^
7 ~* V% @3 ~1 d9 g$ o
5 Q- h5 |2 D0 t; L5 } android.permission.INTERNET :访问网络连接可能产生GPRS流量 ; e5 D( q" E4 A t* S0 a
6 Z. }) k: j% F
5 z: W( R* N- N! `: a0 Q9 D: k
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 6 A/ G v6 c4 {9 c
' ~6 J7 L( L. F( T
% x6 ^9 m* z# m) {# L/ C
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 ! e; Z5 c1 J( A
7 J) ^, y% q E: |
4 c3 V% }# e$ z4 s) n, g android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 , p/ @# `- n3 x
7 {$ J, U; e9 w4 j8 F) g* O
z# s' S$ U( l" o1 [
android.permission.WRITE_SMS:允许应用程序写短信内容
$ i: F+ [, `+ C7 T* B8 H$ F # g0 `( `1 P4 h) B0 T, b. ]
, Y2 R: t; f, E7 s android.permission.READ_SMS:允许应用程序读取短信内容
& o! S0 K. _: S4 p! C9 }8 J & p" z$ ^: T$ b! C1 @" ^9 c) X4 m7 T
* |' [& @$ I$ _ d% h$ |! j! m7 l$ c
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 # A: j2 ^- i* [! K
+ m: K% G& q& |7 v- S9 i# F$ z& c4 M6 _
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 / t8 \+ v: F+ i. y0 F% o
& X; R* }$ D m6 x7 Q2 i* E5 W
; ^/ P) s; Y( C- e android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 2 M% @% X: L! Q5 q; j6 F
( w/ t/ f5 z8 H: r% _8 C, O" ?
. ^9 N+ ~7 \4 K/ U1 z: ]
android.permission.VIBRATE:允许振动 # H5 L% y, L) z( Y% ^( D3 r. ]8 w
) m7 h/ ~& g/ Y' D6 o
$ W; y1 _8 G# w( Y7 b) Y+ L" f android.permission.READ_LOGS:允许程序读取系统底层日志 2 c% A, N7 N$ \0 s
; E" Q6 Y9 \' O! ~
+ b9 u2 U: N( h' V. @1 c. L
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 / P% L% i# }+ B: e
- H% o5 V) i( P7 Z* f" O8 p; y; \6 S T, u
+ t& }; \ o% A/ Q# f! m. h+ b ) ]- y' b8 y0 G3 ^
- U! o! U& h) ^# K
功能信息 % _0 x: s/ y. {: W }4 T7 x* C
- N6 }0 S, T4 @# @5 \& w: Z1 r# E$ i
$ \. |& X* w! A+ {$ z) P0 W# T 7 I$ H1 \7 Z; J) S+ A( U" M
/ ]2 X7 H. j" H9 E# T5 J# y; n 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 3 r& K% P6 z6 J# B
6 D& s9 N0 N0 R6 c# X% q
; h5 D* y' }6 h8 I3 a5 G5 U) K Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 5 E3 u7 X% I5 G5 C- d8 O
# @6 w3 @7 @+ Z( z" l- `
) H" `. K4 v) F, f' h/ f
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 8 {6 R. T" q- y; b9 U2 N; v
4 L6 ]4 I |3 w5 h' K( l4 S
1 ?! U$ Z, m- G! p; A) K
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 % P/ ]9 a$ a5 ?8 C7 w5 |
4 D% `: l" G# ~$ U! m, r- s- h2 ?4 Y7 d( \% y6 R9 r; B1 g! ?
7 [2 i& z6 H; w- \
/ w- _' g/ c: U" x# J
, @0 Z; A) F- y' M, c4 J/ X) _) F
0 K. a6 [1 W7 j5 E7 R0 N% [ % f2 T2 l9 {% M) v
1 X/ K( A% }+ @( o0 B3 j
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 % d; q! E( d) S& W2 u
, l& m3 F8 U7 K3 a
. ?7 |: {2 z; D' Y# i; R5 \: B, w
% m' x7 j0 w( o- T1 B * {/ V& \: F: A; `$ B
! P8 W9 D* Z4 q7 b( h) b/ Y
- z7 P- Y6 B3 ^* P' {6 F! s
# ~2 R6 n# M) o2 o, G. J. l% ]- k5 U% x' s: s
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 8 g3 v3 D0 b+ b7 ^% R6 D
/ k9 ?: e: S& w8 o; G
* P9 R' T3 b8 r' F
. N% E8 B0 s' d# P# D
( z$ q) N% Q/ Q) y: c& f2 B/ @" [/ \& Q
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 ; ^5 K& x l: ]$ q4 K
z% J! b( y9 Q' n+ z! v$ f
; f+ D2 I" q; C+ A
0 T P* N0 C3 { w+ T. K* H3 ] ! K* b j5 q( P/ p
+ g! j( @& N% d0 o/ |0 Y 6 R5 h9 ?/ I9 i8 p
. M! |/ [3 `. u4 |! [/ }
/ ]& z/ g5 c* j9 U$ q4 c 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 . v3 x$ e7 U( c; X8 ~4 U
: K& [( p8 F, H) b2 L/ K# Z
% H1 x4 X8 h" ?+ X LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 % D2 z4 F! ~3 h& b& v( ^
6 h9 J) s* W9 F* Q( n
% }- `; M, d8 ^0 W9 g
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 6 t- y5 ~( L7 N9 c6 g( r" s$ o
% R; a( H! a+ M1 e. g; a/ j( q
$ Y- Y- }, Q2 Y/ h/ ^! R N+ ^ 开源的luasocket代码可以参考学习下 & ^" m' G7 W1 ^8 r
% M2 Y0 f" z1 a3 \. q( y- `
, ~' V& x" q; @+ _4 ] https://github.com/lunarmodules/luasocket 3 y: h' d4 _ z+ L8 x' C
s- j8 T9 }1 s1 ]9 L: V9 q; h3 ^, o
https://github.com/fengye/luasocket ( K x- E$ i7 w7 q
) P0 u9 z/ H. Z3 P/ B/ i6 P
6 A" l0 c$ |! C- s) `
( U0 N; ]* k1 n0 l* k/ [& n # \, k$ b2 a2 n
; o. z. M4 i0 t5 T* o: X! x5 m 5 X+ Z) y1 R( j* [* M4 B) k
" {$ a' q& B! A9 n0 V( a p/ E% E6 N6 s/ o& @! G- O/ j
0 ^# O' r: Q0 p; c$ f) s
; f W! d0 V/ z \9 M$ M# m
: ]; Q2 h3 X8 V c0 d, m4 A& p 3 w2 O G0 H& b; H! O; f
, z" f' H9 r6 U3 f2 r- K6 s# r4 @' K) J2 A% w1 I1 W
总结
- i. T* w: o. b4 J " c9 U2 H0 [/ k: }" ~, }3 ]
3 r3 y9 |! K9 U* i
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
7 S2 e# |! x! H
5 \# Z% k% J) | J
! n8 R" ], e( k2 j9 J- z$ _ 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 ) R3 E% `6 k: _: J- D8 j. Q
& {8 U5 J1 J6 o( ]0 P2 ?
( [2 ^- e& r5 i! ]
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ; l0 E& i6 }. s" e% v( b* k0 \
# O# G/ M! r7 d' B- x
$ b1 f' L. P" B: c; K; f 结束 3 m) H! h* x0 W' [0 o: g! H
" a2 V1 D5 ?2 L: A0 Y) |
B% A0 A! C6 l
【推荐阅读】
' k1 ?0 i7 o( F4 |: q) i- O( m
* b/ q8 v5 p+ o- ?2 u/ G
?& ^! t. X: \7 @7 `3 e 对吃鸡APP的分析 3 W- h+ d. e) N8 s _
: g! Z( z2 Y: c) B" f3 i, }7 n" O/ I
( D/ z; Q3 L1 p, f( E+ d. p
你需要了解的APP安全 ' Y$ N. @5 g( y4 q2 ]* t
; \) [8 a+ P# L' I) u* u7 d& |& |" d- O4 t. w8 V
你需要了解的APP安全 ! d5 n9 K! ^. ~$ T! |
( E/ r5 u, a1 e' H; E9 G, y
3 V1 v# K7 a, S5 o$ h
7 }1 i( i+ y' z/ o% ~4 @; R |