+ a7 z* ?1 I( m% Z ]
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
3 K c4 F1 O( ^* G8 W4 o
! K: ?5 K4 v5 U' q" H" Q' l- r; D
! ?4 T6 K: z' [2 K " }7 @! D" M: q: w* ~0 j0 D
0 w# f3 }3 o" g0 A* K" M: }% h2 m: W) E2 g% e0 q. }, z! A' s; k
7 G$ o7 _4 e/ n: F. Q; M) N8 b 3 j3 n# u# {7 u/ w; t' k
2 c0 w+ u& v) g" I4 T- b, I0 d6 p, v1 a: X
下面就以开发者角度进行解析下这个APP的功能的实现原理。
! V" Q* a/ Y4 m3 K. `3 _ 3 ?& F4 H( L9 S6 G
^- f( b% y+ k2 V
" \1 a- D$ G6 U U) ]+ f h0 M 9 A% N0 t8 v9 U& D$ Q
8 \. A3 m" ^/ ?( i" k5 x
基础信息
4 F; Z8 Z& n* ]2 Y. |2 r ) D+ a6 r2 d! S F0 x# N4 @5 P
& \3 D7 J* b, Z/ p' y* d& m. _
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
' u/ K ^- v$ `: A
H, O( P- n7 s, s: H
# W/ S9 G W$ A3 |9 M9 a# M # d, I9 b# ?, c3 N9 G$ h
3 ]5 b6 Q2 p2 ^ i) j" F
2 I) ^. x$ Q5 c2 { _5 o9 @ , H& N) C1 K( [* k
; {; |: D0 h: r
a% B7 Z) l) ?4 [; c+ x 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
. B5 G3 j$ T$ F5 ~ $ ?# q! m; A; w1 v9 c* q0 l6 _# [
3 x& l) e2 { w: u" }: [6 k
4 L1 c1 [6 e/ R1 L# C4 e/ M
( B+ x7 B2 B5 B; w# I# t& U9 J) W, a# a# }
1 W, R0 [& S. v& T+ ^5 E, ~ - M; x% Q; {5 U9 _4 N7 s1 ^3 d' a
) }% S" s/ v; B6 s+ v 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 2 e/ c" {' w& a$ S5 ]
& r8 @& H2 a6 r8 @' O& H% k& v! r2 z Q# `( Q. C; b" E8 p- Y8 b Y. F
8 t' V% t6 I/ }
$ o9 J. p6 a* J$ P
& Y# H" g A# f6 \5 Z
$ _, K/ w0 t1 q/ K5 ]) Z5 A
5 o- U# r: O) K+ e" f
7 x9 R1 ~1 o; ^
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
4 l! q9 V C7 H
. z* G# l* j6 A8 Z
& ` ]0 n6 `" B
! W2 B" q% U0 z& w J' N4 r( c! B ' ]. K; A: r% u n
1 e# E& _3 U# ?& g 6 m- W% i; n# Q4 g8 H+ k! R
4 j* {; M' ~* y, v% E; M% ?. z: x* d; _$ z+ {
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 $ D# {) K2 Q, ^/ V3 |, S& Y r4 q
" ~& s/ y& q9 v! L
4 Z( ~0 I z3 b# R z A
8 V; l8 v! ~, p% P! i8 y1 V
$ l3 h% [6 X% ]0 F2 ]$ \" d0 D2 y
) v0 }% I6 {" C
9 A: {: C- ^7 {! \
7 C W# h* c; }: ?5 h9 ?# y4 X# E
0 d" r( b! C4 A2 T! T1 A' d2 A
5 K8 l( v1 L& n$ o: M, j: ]8 }% \) U( Y6 ~
签名信息 ; z0 M6 @2 Z' |3 Y6 r
% d G9 T( l/ D4 z0 f
9 P; ^9 w8 K6 X" R/ w( {
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 3 y' r: W+ @' s5 |0 k
$ U6 l% @4 k. L4 K- H
9 D! w2 d% M; m D. v 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 5 h7 `- M/ d! b* r l" _
w9 Y: {+ U3 a( q, D) |
5 J2 ]( T0 C: o+ S0 j 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
7 X! e$ c# L+ P, @7 ]/ f0 m
4 \$ h; D+ y( G( s8 B/ _! Y7 _' J( n; b6 j6 N2 s$ q& Y7 f' c& i
$ u2 V1 X7 h9 T1 x4 z2 r- K' j
& g& V" H6 s3 p e% L" G/ E
; `7 _9 c# e$ f
' W* w9 d0 f; @8 [5 s 5 |6 U( I( o3 |( g7 {; Y
! X% ]* A* }" i
android签名的数字证书的一般都是采用 X.509的国际标准。 $ S( G# I c3 J8 i" H1 S8 {. C
+ _) ]+ s; j" X5 ^0 T: `- A# }5 X; l* k9 n! x) |8 n
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
n+ v# X7 i1 r6 z+ z5 \
, [6 m& a" X6 Q+ u& G
3 W$ _: ~1 p6 u 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
9 r" H; b1 k5 ~8 H. i8 R
, B9 d* X+ B& u" y, t5 W$ |0 B3 T* n5 R* r0 t2 S3 L
( |% s; y& b8 |7 W c7 t& ?$ g4 s+ v6 w
0 t: F0 h# H/ `' c
6 ]7 R: C# O, I5 Z- F* S1 n; l; |. d: | 9 e% ^7 `+ B0 H3 y
* K0 r) `8 J) V/ u3 e3 i) S5 c% S
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 & o! t. |. m) Z
& v8 I" E( | U4 e; s
$ _" A7 c& }0 `) D2 {
7 e5 K( h. Q3 v! [
9 u y0 `9 [/ H
, w, N3 A! z- \) I7 K8 i9 ? 、 0 f& `( T; L1 h+ u
, L W1 u6 i9 ~% z X
) R& j$ [$ O! _' \' I
0 K& |! d$ b. p8 W
' F U8 B' B1 P% l' ^2 d9 h6 M
& f* B3 D n6 \0 | 权限信息 8 x0 {6 V: t# [; J: b
8 |4 R. ]3 }% @
3 A Y$ b& a! p: Q. @ 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) ' W6 G$ m% I: k& A( ?2 i
, c3 J+ X6 n1 r" i: G) k3 P" t! ^" u$ }; z* o5 T7 W4 H7 a8 Q
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
, U" e2 C7 W* b
$ w& }. {* F" g! I7 o
. V! f( ?8 ?* ?
# x0 K, Z2 j7 M7 e/ M; z
9 e6 l0 k6 G9 M5 r9 e0 q" U) C5 H6 A3 k9 ]/ S) V5 X) n1 I9 g
8 L' I6 j! u9 Z, Y+ Y: z8 Z: D
; t7 o( \, H9 ]- ~* W
5 C) ]* }9 {" j, P. R* O: `6 z$ l 下面对这个APP的所有权限进行详解下: + G- Z: w$ m3 M7 c* f: c
) ]: R, O4 ]; J. S9 F
/ \* m Z9 q1 W5 B6 `4 K8 D+ J) z1 n android.permission.INTERNET :访问网络连接可能产生GPRS流量 0 Y9 H. [- }1 Y3 T) g8 Z4 z
5 M) b8 k# E7 U: N$ \% g; n+ O+ P
f1 k y+ j, \3 {: U* h- k android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 ! I1 t2 Z; l; ?+ L
* W; A1 p, U& W
8 m( Z" E, l' V, `8 v& w) G android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
7 l$ v5 S4 \2 N
6 B! z& [$ p& M4 w, O
2 E% c! ~4 b3 W' Q9 B' d android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
. s& I/ h v0 L: Z4 z
8 a8 j h H& g; }- r% d# ] Z$ Q3 c) B r: x5 c H
android.permission.WRITE_SMS:允许应用程序写短信内容 ; P; B2 ?, g B6 F( K
# R% K( d' q6 h! O2 J5 @* P$ K' [/ c% h; Z2 v$ \
android.permission.READ_SMS:允许应用程序读取短信内容 0 S0 @+ o+ ]- X w5 a; d
2 {) @) w% y3 ~6 \" b3 w5 u. W+ P( I
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
/ P" M/ U5 R" \! t) C
5 o. s+ n5 g; c4 j- y; f- S. o7 A& R( d* W6 @" a3 R$ ?6 t' p
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
$ R6 G" [; x$ }; W$ d+ W , m* m! `, B! s4 p
' ]1 a3 `5 x2 {4 y+ q1 x
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
9 ~* T, J# A: n/ g' c ! p$ H2 ^' @5 ~. L5 n7 o7 ]
5 y) i% S0 J: p; k# C android.permission.VIBRATE:允许振动 R2 J. E- A3 k, @' b5 b' M/ O# Z
5 P( s# R3 r( n9 W4 g' U- [# y1 X
3 a5 k9 n' V5 G6 [' W- ?# \
android.permission.READ_LOGS:允许程序读取系统底层日志 . b2 A& T7 _ S3 y
* i0 e8 m* S6 x- @* J7 }, ^
% G. A( [/ w6 Y1 R& s android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
- R7 V% S+ J% P6 L. B : B4 H# ] S+ S: v
# g5 k: n6 J$ A1 q* G
' O' A v' k; ` c( {4 q/ Q
; O3 K- Y7 F: B8 @0 R! q( @; f! I
) T% Q% k! v( s8 M: x( e1 J6 ^' n! l 功能信息
7 j* i0 \3 t: k7 k4 E4 h C5 e# P5 S
, x# n1 b I1 d, R# w5 q9 J, p5 i% O
0 B0 x; S! C! q' w- y, C$ ^5 j, K
6 J7 p7 o# F& ?0 n6 Y6 C$ Q
6 v3 e$ z# c4 z! l9 e- B& R ?! Q
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
9 k; q1 s" q5 z4 f, ?: ^ 1 ?( T+ z/ r: j, H$ C; l2 L
# N' b( L ?$ G: U6 g Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 0 b2 i$ q ~% P; |( {) l
# g8 }1 T" `2 V( h. ?
8 V) V5 d& r3 e% m. k) s2 f 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
( Q- C4 u1 \( F0 Z+ \' O- x
1 g8 U$ i5 i ]0 M+ W3 d# H$ }, w: d( R# \9 r) I* x
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 6 b& m: ]& a, r& M9 c. K
$ l: w1 O5 F" H* j- B; }" V }8 ]$ l
# r1 f! w( X1 O. I/ d
" C. a7 _6 e" Y! H8 T! P3 q$ q8 A
6 [) X1 E% G& s4 L% g! G0 J4 C, l% r 3 ?5 \7 h% Y! r$ a6 W% G& b0 `
: v4 v1 r W! S; f8 r$ C% q6 x2 v
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 + e# E" n9 Y" V4 i+ M
4 y. Z( [; R$ ~8 }7 f5 f6 }% q8 |& w. y
- ^; v4 ]' Z5 c
) N; W$ f5 x& X x7 ~; h# {( j0 p5 G* a Y1 V
1 h a3 x: H6 M* Y! c
s* |0 J) d- a! q9 ~
$ m! L/ b! ^* F I) V1 X# b# H! Z+ W 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
- k. X- G& G" t# ^ I, y + [ \: l3 y3 R1 V. }1 p
* {1 @# t: o, b+ m
% F7 b1 k1 x3 W( B: y7 x" w
1 m+ Y, n0 [* s% v; B, m/ S- s; b9 j4 Y4 R2 ?! m
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
: b& s9 [ e* b& {7 i v0 K, b& N ) N8 C( c/ i5 Z1 x
2 W1 u% O3 N! g
* P, g/ I6 F* r4 f) V7 n, }# F
5 r# `" n6 v. I p% H
$ M% v& z3 I y+ K6 G' e. i
' a+ f' g# E# Y1 [
* @2 X1 v7 g' Z- A) R; ~' z% g: e+ u8 v
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
( m- w0 T6 V6 s0 q- Q% G% f
# d: i8 L% k7 ?2 P3 u; y6 \& z# a/ w4 [+ ?5 t; `; D6 t- @
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
; O4 N# z5 {9 Q1 y
' i( ~) T5 f9 g4 h
: F) e* ?/ M: c" | 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
* |. I. i J$ ?
9 \( T7 e7 b% o, u6 G Z' B5 f8 r+ j7 F9 \- J Y. p! j
开源的luasocket代码可以参考学习下
# |5 ?* @3 e* ?
: _) w% a- [9 T a) d! ~+ }% Q5 Z1 N8 i1 m
https://github.com/lunarmodules/luasocket # f. K3 _; m& o) ~2 _/ ]% l
2 y2 X& Q0 p9 N @8 f0 D# E) C5 W0 ~1 @9 A
https://github.com/fengye/luasocket / z0 P7 E8 c& x* s! X* k y
+ F8 r, k" ^" r
7 V, m, W& {( K
1 h: p4 S6 J' i: m ; z0 {5 M* k4 o q Y$ A
! F& q, G u+ ?' E. \7 t! s
3 y4 }% o3 N+ {6 n- ^. `/ F# M
& [6 R0 M+ g4 ]4 t/ Y, V
" X5 R9 a4 z& i2 b 6 c6 i; N6 k' q4 W% @0 s# O
9 h6 B8 I% j3 n* S0 F7 ]9 D
4 N6 T/ L6 B! G6 X4 a 4 ~+ g/ U7 i! `: p3 V( y I
* T; R) z' l2 V* ^+ u2 A9 L8 G) M9 ]
3 Z6 l" F3 i2 n
总结 5 D) t$ v3 @" U
: p9 A. T2 |- j) p
- u9 p2 [; j8 G6 Y 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 : g5 X: x4 b% h" a+ M, f& ^
6 @) f& O+ j s8 w+ Q" C: y
: V" n! t8 L( @, k$ Y 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 4 }, A; l6 d; z& b4 a8 v
9 T) j" W& r0 q4 j+ l
+ [4 N9 o* h6 Z" h$ a/ a& W+ }
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
9 n9 x. ~ r8 p" R0 ?* s* |
; Y% S) z& e/ y/ E: L+ z
+ y# B4 s) ^) w% Q$ _* C 结束 " d) I, F! c; |2 R- {
* @6 M2 B; [+ {7 e% N. i1 U$ @- v# u. }6 }
【推荐阅读】
1 L6 c) S. c+ K% M& N, s2 V ( Y6 I2 D4 B; P) I* v
) p5 d- q3 ]3 i0 i1 r' a 对吃鸡APP的分析
0 f& [; w! {0 E3 x5 x! t% |3 d 5 b& T* i" |/ i5 I8 Z
: B, N9 ? B F" c, H' V2 L 你需要了解的APP安全
. f6 r9 H F5 N3 F7 i& X
1 _" }% u, M: M( D$ \$ q7 Y9 e& I8 o( X7 n
你需要了解的APP安全 $ y( N3 E( v; ?5 f2 x4 s" K
5 b5 R$ `1 L2 s5 Z
4 z1 l+ ? H$ {$ y5 n1 u# u# g
- B( c- a' d' n. a z1 a
|