0 | ?* @( Z! p2 W6 P" y
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 5 f! O! H8 }4 c
6 g. `/ O% N) K: y. G- i2 P+ S' h5 G. z1 K) K# l
& P4 ^% |& v9 k & H+ q. v5 A/ e$ m
! b1 X/ y' n0 R. V; [9 W. l
N, S. T; ?5 z, _
4 I/ ^) l3 R9 h4 H; p+ {% M/ z/ X, V$ ~, u7 h
下面就以开发者角度进行解析下这个APP的功能的实现原理。
( v% n: H4 Q4 y' S8 l/ p: X, Y+ E% |5 g 1 {7 ^" B" i6 Q5 t
& d" e0 M. u8 ]6 q$ \
+ i# U3 C- s+ z
9 Z4 d+ K6 T) m* |1 [
- ]. }9 B! O: c' {( i& Z7 L: b 基础信息
4 q+ a: N9 Z3 J) T* |1 U' k ! u) B9 |. r7 F: ~
! N; f& Y e# L; R8 P2 H) X
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 ! W( ?1 q6 K& ~7 m6 y b
7 }8 D7 k: _5 l2 A7 e6 i# q) [
9 x i$ b. V, H \# d& T : d; x. e, x) l
. k" o. s5 N! E3 J x- X* P
- z; f" t+ S# Z
3 s8 j7 T6 v' U7 ] ) V* L% l4 L) W/ D# F
3 k4 |0 z! N0 W4 ^
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
- L# ^# @8 ^) P
* d. W3 f: g! l1 h: r2 Y% u! \* ?, d4 w0 U1 x- Z
$ p( q, f n n) Y/ b, l' U" d
6 x8 q, h1 S* F; c N- `/ p0 |; H
4 T! B H# }( ~
0 a3 r' T" u8 N7 m2 @
+ F" U, G2 }6 U; A
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
9 v: A6 m( `& P& s. U2 i' h * F! x7 H4 l. z" i `1 X2 v# u
9 y0 A! `. ~$ y
4 _) V; l# f$ X) K) x4 ^) y5 B
( Y! f" `' Q/ O6 t! j0 \
& u4 [% R! m; w" r- n: _
( ^& w- u, R' d6 _0 y+ {
0 }5 P' Q% [ m5 z* ^; n [, c
) X; z( `- J2 k+ ? 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 $ m! @3 k/ e5 w: P
, H) a% Q3 n; X
- w. h$ v( Z0 K
O3 @5 l; z+ c* e5 ?
3 {6 j* d. l3 Z3 }2 L# t9 K
: B$ V! p: `% d j( V
3 b; F# ?1 E% K
/ E/ d) J, U- T5 ~ a7 y2 ?' Z' u; |' O- `$ H2 {1 X" H
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 2 _ y5 B& h9 h( h
, J: L" _) p% q6 r& z" D0 S
& b7 D, v7 g' ?( J9 g) O$ N
1 Y% _1 y1 w7 s5 m K: U. D* r6 T
* c, X6 @0 H# B* @6 b) G
4 T2 A. m: Z: `; N9 Z& x# } 7 i8 Z0 W) j$ o i
6 R% @2 t$ H6 z
; |, W) z1 L1 Q0 v, E& p0 t6 V& e
' G% Y/ ^1 q& V
/ P# o* v- I0 w% u# J* S T; _# k! U, Z, J! C7 X/ e
签名信息 $ p" F3 L8 `3 c# o6 H
# ]( U8 ?$ s6 O( M! [9 ~
* f3 f. v( ~& `6 q" m( l: j2 [% U& R, M
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 6 H, r. _/ N% J4 E5 d; O
4 A+ @' m U) s" ^$ t6 X, p
4 f- N o8 M$ \: r) d
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
4 a1 n, x2 O$ y) s: D8 n2 | 9 q3 W/ F3 v7 A" c+ J" Y! [! e! l
* m- r* g2 Q. P8 h. V( b
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 0 s2 Y1 z0 ~# j/ Y+ K1 _
" v5 s8 p q' G5 r4 C. `" R9 h( [2 Y$ d: S* X+ Y
- l6 x0 C, d8 ~, G' I- S* U
: m! x. h4 {; m3 H; U% o. G) w' a$ n. ^5 d5 C9 f# x
3 N& s; W3 i! O6 A
1 t6 H# m1 H- \* R/ k' D6 g
: H: t. D; F$ d android签名的数字证书的一般都是采用 X.509的国际标准。
+ k, r0 S" U6 }' O5 I$ v " e4 f' X0 w4 p0 m- i
9 c3 h4 B/ Q: g4 d 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 1 m2 p. q: }+ |5 y
7 d: Y+ G+ P. T1 D! @4 g% f" z* N8 ^
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
& o/ a1 L; X. I% a* r6 d 5 o" x( i# k# [. W4 t K: F
9 n5 T+ r# w1 J ) y4 I& \: [2 `* I1 v
& y+ A x) a7 `5 R Q2 e
" A4 F* _+ X' p+ ?
_! x P* e2 j$ _ a$ D ' C2 p3 r( ^( V
3 g2 o8 }: o% j' c
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 + E, p7 K% `$ d) j* C) `
0 j1 o) |( X9 R. P+ c# G, c$ d
6 h# W" b: ^+ T8 l
. d" [- ]& Y7 c+ u+ v
6 V" i6 A5 h$ R* n$ c
' r" F6 Q3 C0 D4 {& y; K# x7 U
、
7 _, [2 n! T O ; ]& e9 d8 B0 e
* c1 V' E% Q- Q* f( c% v
8 x, {( i0 c/ t# L
3 x+ T: s% @! u% `: e* @
( O+ K2 O: a: }! r 权限信息
# z7 y( O( m- B/ f, { % {& G: U4 @3 i1 `/ W: W
* j, P( U' M! I
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
9 A8 [1 T7 F& | 7 w; o. g! w5 [: J2 ?! @
( U* u- I- P2 g6 Z/ O7 k android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
+ B) q* Y; u F. P2 g
I9 K5 a) c5 G6 R1 ?5 K: L6 L7 s/ d/ k: E$ Q V
1 d9 l: D) G* u/ G8 ^ ?
% C% x/ |+ H) V, ^) \' a1 o' s0 G. W
5 Q2 }+ s) ~0 l! t( Y) o% G 4 b$ W) v8 }/ }
0 {4 `! P6 h. j# s8 p6 |
+ |2 w6 P- W4 `2 [; W9 D 下面对这个APP的所有权限进行详解下:
" {4 m3 A$ I3 d! P! e" F# N
a" \& e O- r# O; y: {8 Y- }9 U
. C u5 q9 C- r4 L, O0 _! [8 T% q( { android.permission.INTERNET :访问网络连接可能产生GPRS流量 4 x3 G R6 a; _: X _: K
2 r" a# Z* G( T8 a; s
' b# d+ S* b2 Q' g+ f$ }- T
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
7 d, }( {# D; @8 b8 r : ^& G- j4 W n$ A9 ~4 j
8 }# I" N. i6 r1 y android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
@$ l) I- W2 Z3 ~5 E1 ?
# v" n( K- K3 R$ i; Y; T; ~7 x# p2 A: _5 r, i F
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 K: k3 {/ L* V, g* |" ]
. R0 U V- U6 P# S3 V" X1 C; m* w0 y9 A$ M6 N) z& c: ^5 F: t
android.permission.WRITE_SMS:允许应用程序写短信内容 6 @' s! \5 ~! v8 g7 y$ P
% X$ f c- b1 S7 E/ ^
7 m# t5 n0 K& P9 N# _! ]) f' V2 h android.permission.READ_SMS:允许应用程序读取短信内容 1 _" P( _; d: U ]/ ^- J+ D X/ ], L
; Z \+ N. F/ g/ W5 t
8 k- P" ^1 z8 F- ?; I* L( i android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 t8 A0 |2 v& T/ X, U# N1 ~; k1 |
5 t' R# ?3 A6 v8 ~
) }/ i+ n% U* p6 J
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
) S# R. R$ |% |/ a
2 N, I, c o/ `# h% X; z6 s- Y u+ N' F& j; a% v; M
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
7 X# _5 ], [4 m( ] / O" } f+ K3 H4 H0 @8 W- y
; x7 B; d v+ r
android.permission.VIBRATE:允许振动
7 C' X0 t7 _* L$ T$ ~( Y7 p . F( `& H0 v6 v
1 G& X x% a8 o3 n6 B
android.permission.READ_LOGS:允许程序读取系统底层日志
1 }% H0 \" o) ]8 J9 a8 V! v 4 ?, Q8 J2 d7 g% v" G0 z4 u
" z J' t4 |9 @; `/ x
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 & L) [7 n( w2 P8 s
6 W' c1 `0 E" \9 e% J0 h( f7 R6 t
# w, H) b, ?8 y4 L5 f9 k( S V& Q
% A. s8 a: u3 }2 c, Z, `
% \. p3 g1 Y6 ~. } x5 \2 t p8 @5 C5 L5 E* j( L+ h# U2 X6 i
功能信息 , w D! ~; ^1 H- v& h& x7 r9 M
5 j" U+ f" ]1 I$ z) [3 f5 d
2 `# ~6 c V3 I- j. S( g
4 n( p. D( ^! g. u) f
- d9 q: Q$ Q8 ~0 T V |' L4 l4 E
" g( s5 W1 b3 a& j( a- h! ~ 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 ! W* R7 [3 U# ?+ u
# [) L" J' l. q+ a, ?# X# W
( y' G" [6 p% X1 m; a
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 8 u: |5 i2 f p3 \, d- ]
& z% f" H& x0 }; J+ ~1 ` }
3 ?. `8 g+ G% y! T F) T 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 2 A, _4 u7 z5 W: X
# ~9 N7 C9 c0 A' s
8 I/ {9 _$ F5 U) t1 C8 \
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
- n6 H. ]7 n( T& t; |8 Q9 q
3 A# X$ |! ~8 ?5 |' {, d# ^; H& E/ Z- a) |5 i, u" l0 {! ]7 f7 Y- c' w
1 ^2 V3 x9 n4 N# n# O9 Q
O5 e( w; P9 m+ m
2 _. l2 L2 `1 J) `/ z 1 R2 u. P3 A5 k+ t2 H- @
; H: d2 K1 U$ r9 \
P$ V: G8 g& Y 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
! G. P; m) f' u y & Y7 t d8 p; [: f" D
" |& ]" m' v- C7 `. R7 |
; P1 m: q( F: i5 e$ k; Z" b% q 0 f: V ?! S# ?& q6 y
% j3 v' `" w# S# T/ S M4 R 3 f3 _# X9 B. T( V' i
+ h) W7 F3 Z9 Y" o6 c3 f
' G! v" x8 ]) k
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
& d% o$ H! O' X- y. a* n% e , \! ]( v5 z3 P% u, u
9 N" n- W6 o* [' i# l* K
, M# @- r2 V0 V4 s' |+ g- P/ {5 T
A5 ]+ g& H0 K( L1 P
) a$ f* I# _& _! q% v" Q y 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
* d7 S' n; I* p3 q
" f) b! Z9 m. u6 [5 U$ _9 Q2 P8 b5 P% v ]
. u+ e" [( s, |4 _ n: f
. X q8 z. P- R- G! d
9 @$ D: y/ j- p& m+ e4 `9 s! {1 p( V 6 j, Y( A- F; }* k$ s# K* w- `* ?
/ _+ }- @9 |& n i) `
, w7 e3 H7 }2 g 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
2 m8 K* `5 |# x, R% D7 J* R9 B/ b . C: d! M/ ~4 J8 t! o
6 x/ C" @$ m5 c4 O LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
* @9 D2 x$ z0 R7 H6 W* V* } 9 p4 Y6 N$ d3 c& J6 e+ W
* ? j8 e# B- h5 l/ Q8 d
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
, V3 a" c2 a3 W ; l7 o! w, ?" E3 P2 D
2 ?5 C' ~9 L' x7 q" L 开源的luasocket代码可以参考学习下 - x0 Y! l- C. X/ G) I2 g
; \6 ~( V5 S& B, {2 q
* B" Q# `. q" l, L https://github.com/lunarmodules/luasocket
: |1 y* Q' e% P0 ]5 H ' K$ ~2 a. G: V" d
% e3 m" t/ U7 ?) p* V https://github.com/fengye/luasocket + o! W, G* y0 `0 y% c" a9 M
& V$ L# l) y5 i& G* h9 R |+ \5 e& A. H$ ]( @ A: T
9 y9 G N4 Q: A) @" p* d+ J! t& K
- x- Y: K' F( @6 y
* Y2 S' j' H% `+ s4 i
/ h8 Q+ ] l ~& k r2 z8 b+ c8 |0 O
4 A" t: p3 c* h9 p
9 w1 W9 P! M. N6 c2 Q- g- r% H0 ]
7 ]. F" f3 V; l9 a; ?$ r- Z & I/ i8 W! G. m9 @- k
7 s. O. z' e6 }( P
) }: O' ^" P5 z3 k% P
8 B- a8 w4 @- h9 v& q0 t
* c1 `; q3 U; w/ Z3 A+ L 总结
- s$ r0 o$ G3 P1 L
, \/ Y2 L* n' O; O7 D/ a E
0 x) n2 k6 X: p) a( K7 m 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
# [5 W5 z( h9 p7 p: c" ]$ |' Z: e% ? ; i3 i8 `" \; I( U s' ? X
" C$ x/ s: z, l( F7 A. g 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 2 h; |( q. i( Q: i U9 S
2 y" Z- a9 [) h; `
3 j- Y5 z2 I9 N4 `- G% E 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
+ ?' N$ |, Y& S) w ' m# W# o& V: E, s
# ^. s+ j I$ }. Q, _ l 结束 ' ~" w! E# N& F3 q1 U
( c# y) C1 f4 G7 l/ l4 q
* k" a$ X! T5 A' H9 Z! I6 K
【推荐阅读】 4 L% H' N E; l
; F; H# c$ ?: [5 r
8 m# \. k; n4 F' G) e1 o P
对吃鸡APP的分析 S2 E! D, t, R( i
6 |+ n& N* U- f% N+ C" u
3 ]) L5 v8 K; W4 E6 C# L7 |$ q. E# M 你需要了解的APP安全 2 u6 ~5 Y! J$ n n& r7 K
# P9 `9 a/ v3 k
2 ]- v' d& Q! @# [: L- C2 L8 `
你需要了解的APP安全
+ y# k. D; z, [ k4 z 0 N4 `# `% l d/ B; g' a- X: Y( i
' c( ~! k E# h3 j, g
! R0 e& u8 q" L* s: ~ |