6 V! U; \! e/ A8 c+ {$ V
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 , k9 F" v/ ^) |' k( }; {. e, J
( B- ?1 P& E C( v/ q2 E2 F1 T0 E5 |* y* z- s
1 W8 k, }) r" @% I
" T: |1 g" G E# G$ e8 Y( E! w3 j2 H7 Z. l4 }
, r0 ~! V2 ]2 D9 c- z! ` 1 `; l5 {3 }. D( s4 Q3 b' O% e
8 {4 D, b5 X0 D
下面就以开发者角度进行解析下这个APP的功能的实现原理。 ) h' {4 [/ \. q# F( P
# T# v. r1 H1 g/ h9 a6 o1 A7 w0 ?
a! ?! F& k/ ~2 g3 N
$ x ]6 }% a" i7 w9 K8 {) ~- N7 _' y @5 y+ F8 L" i# H
基础信息
0 O Y' n( Y0 H% _; Z3 H
+ n4 v9 u2 b1 V) _5 Q4 f1 c* h& n9 b: S& M' c
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 & a3 N, H. d D
; @9 i. D1 y. K' X
& U& r; `1 Z/ |
' q4 }6 B! `2 x$ Z4 }7 j: ~, H 3 _+ m/ A( m) Q- K
9 x4 Y3 \, p3 P" m' q. J6 H8 u% K+ o$ e
, L2 i5 v) s, k% F* ^* [ - V/ I" A+ m3 ^+ O
9 O9 I3 j1 J6 U) H5 o& Q 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
. q# G2 K8 {& B
' V F7 K, ?1 T
2 Z9 w+ @6 B$ V
, R9 A0 u/ q4 c. T3 ] 4 z- M1 ~2 u( w/ E
) y/ A# D ~& ]: T+ F2 H# L) \! z k
* i0 g9 p( L w# q9 v; L5 c' Q
" l- N" y f& a8 s) t4 h" I4 A3 ^6 h! z$ T3 W! r
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 $ }; x# `: ^- F5 [
3 S6 H( y/ y( U# p; W
y4 L$ s. {$ j# }/ ?1 B! Z
_ z1 w {% T2 g; D8 O# f " L) z' j4 X3 j" |- C- D, ~
0 P5 }; V1 u9 T4 h, A$ w- j" E f" w9 T* ^ i+ H6 z2 h/ g
: @. T- C6 Z5 l1 ^4 I
% c2 t! G& q9 b$ s' w3 Y! M& v; i 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 2 ^6 g6 e, U' ]' l; | r
9 }0 p/ K! N8 C0 K$ q q
- b1 p3 ?/ P! X5 u* F9 s
, B" K; Z0 r+ o# c
. B: {( a, b9 q/ ~6 C6 R4 K
% Y: {/ Q5 K" I# P8 w& {/ _
# W0 m' g1 C' j$ w3 K
" \, \* v! `$ ?/ h4 |8 _! e( I' J+ Q5 M
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 ) I# w ]$ I# Q) K
0 X& t3 v% N1 r6 j4 P' y
$ {# V0 X8 y, o- B" ~( v: F 3 y: N8 `6 k1 F; i1 Y
7 e8 {) a1 G: g: ~! s& d2 Z( V) e; M2 I. j5 B t. Y; Q
" G7 K6 s% R4 |) k9 Z
/ U @3 V" d% ~+ R: \; d |
! m$ }4 C; N/ v8 ~1 H% e2 I# W + i# v8 P; U$ m1 W7 ?2 F: l
7 ^# P* |3 V3 q# ^0 s( F3 K/ H, x9 `
签名信息 # G) j: b& s0 l
0 l, A7 z, ^) h
) k8 X: H( O* z' r$ p- A 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
. W: U9 i- ~$ h4 l6 H
N0 l) m& |+ G; s2 ?% ^( T9 c/ L7 [/ [$ U' V/ @% `/ W2 T
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
- R8 ?4 K4 t1 ^ t1 o- @* Q; b& i
" x4 B& {0 E3 O l) V" A, u
, |5 q* ?' q& } 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
& u0 }5 |- j" ~) f" x# k
* ^0 y1 ~$ \( {* S
7 K% C, e4 g4 `0 ^% l, ?
c- z7 M+ L4 s+ M: D " P' K: E4 u" l
. _6 R. d0 A0 Y" ~
% g5 V9 A6 _ `& d3 z : K& V9 E+ b% s; r+ O
/ |& ^" _& i' R6 H' H
android签名的数字证书的一般都是采用 X.509的国际标准。
6 t1 k9 d) l% H; S; y1 X, g
% Y$ H4 E- ?& a0 Q5 t, B& |* s) s/ \* Q7 D
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
9 t* M. L8 G4 \- \) ]) u& w 5 ~" z! @* ?; n+ _" k8 a# N
L5 R' d, J& O) a 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 3 C \) [ }; _
8 ]9 J; @ Z! Y; y
8 T* m4 B1 Z! ]: U' B
/ |4 F. m( Z( w. T; Q$ T
* V/ F$ Z' t: |9 `7 ^1 B( D# E! s
3 `# O$ K% c( w" q
' \- w! X9 ?$ x$ `0 w5 B; X' a; |8 s* A5 p0 g
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 3 J# H- n" E* f1 h
7 Z( l; w2 [ Z9 w- |
; P: F) @, g% t. @: F3 S. G$ T% }! N h" m
: N1 l& g+ c' N# S! i
S( J- N" \2 V. L7 D+ \" R |4 g/ e
4 _. \" C: D. I/ e/ g k4 e 、
% ~: j# s8 h9 w# `
3 S! {- \# B& V) J# z8 n: \8 ^% V
7 w' ]0 U5 y7 F4 \ 4 _" C' h1 b# Y6 {$ {
5 T0 N3 Q' i+ w0 x4 S+ ^& ?9 _# w+ \) v* m( G. g8 t" h
权限信息
2 O* O9 [$ Q. ?5 K" L5 `) Y% C/ l2 B 5 |" l# ^/ B. ^1 j; Z4 U! m3 v3 v; v
0 W' i, h% i% r- ~' ?, `
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) z0 Y- m3 o- D* y/ G
' N. v/ U2 }1 {& }2 K2 B
9 D+ u) \6 M2 y/ ~+ [ android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
4 N6 F9 V: }- S+ B
9 D; t2 E# r- L/ F
2 a1 A# d2 U6 Y9 U8 I( Q# D; |2 D0 h ) v, B; D: A/ `# @; T
* d+ X, a2 c' U3 n B [1 ?0 @/ G& T5 Y& J: ]- y
* L" h! a( H8 Y: p/ ?3 a' S/ l' ` , I1 S- T, g0 V: L6 l
, V$ t2 S- |1 L) `' P, H, w0 L 下面对这个APP的所有权限进行详解下: * K8 h# C+ S1 c4 o
. x+ e* d2 A' D# U* i
G: r$ e2 Q' W" Y) V
android.permission.INTERNET :访问网络连接可能产生GPRS流量
6 |2 ]) i: v6 X1 m) B5 K9 \
( S" X) n* ]6 r& p& W( a1 ~3 L
+ W( X% Y0 e2 z& N4 n+ S2 w3 Y android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
4 i- \ v9 H# p
9 W: ^1 T! ?8 Q% }( l* @# H) h$ }! [. o! I9 \9 Z
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
3 Y' ?2 q' K8 K+ U3 z 1 ~; |& s* n2 N, g7 u
% k8 Q! O% E7 v6 J
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 9 ^% @2 j8 W; y) ]( B: M( k
2 g# T$ _/ A! g7 \ C
3 i$ V8 E: a, v$ [) y android.permission.WRITE_SMS:允许应用程序写短信内容
0 j/ R$ @# a. t1 v: Z 7 ]' ^7 Q7 w C; O
4 B" P s2 g) M+ O: v% O }
android.permission.READ_SMS:允许应用程序读取短信内容
& d) \/ |9 a) p, n5 b, y3 F5 R
/ Q7 X) A* X( Z* y
9 h$ {2 g* q% t/ N android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
, X9 o; d% y# k9 K: u$ w
' \: j; e. L/ v0 O! h* ^0 k+ S T8 g! C2 _
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 5 I9 r9 a- J9 p+ d. S
8 N& [( H, j- Z4 S3 m/ n3 j5 n& ]" R8 e- P+ A& k. A
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 7 _. C0 n' |- }
) P/ g# b) {3 Q" T- s
# h5 E+ z/ X: ?/ ~# f& o android.permission.VIBRATE:允许振动
- C7 c* |# i9 t# @3 e' l ' P% f1 t! X! \3 S) c9 i2 U( t
9 s$ P, K; F$ s. _) h2 T
android.permission.READ_LOGS:允许程序读取系统底层日志
, \0 q' b/ i* W2 X* E/ @$ f - @& V ], v$ C2 _* t) C* q
$ v e. V+ V: p2 g android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 ' D% n. ^( \ ?" _3 J
, P: l4 G3 s7 ], t( p/ `. f4 T
) Q8 D" Z6 [- E0 D0 L. M
1 R4 k$ E a* o" ^0 w0 N
; T% R* R4 Q+ Q0 F6 K& Q5 _+ h" ]. [% X% J/ Y1 c# ^
功能信息
# }+ N/ k1 Q2 q/ K; I$ t : ~- v( S8 |% E
0 ]6 Q1 v+ \+ |8 w3 C4 X
+ [/ @1 d6 k; z ( O5 B3 {6 o4 L4 q) u
- h+ _! ?# i; e- `) `
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 ) I- U I: r4 P( c
/ h/ z$ w; A3 S0 ?1 F; G
" G# i- N# ~0 A% w9 U( q( N Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 # D R, C1 q5 o1 U
1 @& C7 a' }" O$ O) S8 U
1 r, W8 J' ~& Q: D; E# g+ ]
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
# s# | Y6 y5 U: v2 H1 `' b/ D K9 Y$ D$ {! b! `. O% q
& S& c: p( ]1 s1 t; P( P
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
1 [1 M; J/ {7 h) o) o" S- p
) K' s' y! q3 L3 j+ y" M
8 K& _: V- t9 V& |0 x9 B/ e+ L
) e- @6 h& `- R1 ]# W5 B % k& F5 J/ w" k: S2 e0 _/ g
6 s6 R7 B1 ^% b4 h
4 l* `$ j' h- j9 i2 I+ \
' x( Q; \; f& u6 G& n4 ~( w
: T9 O/ @/ B0 S1 t) B5 { 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
" k& J7 g% V( L; A
' b- s5 G3 q+ {/ ]6 |" n2 ? h
3 D; w1 N; F6 {5 Q ' V$ I, M, }/ Q1 }3 `" a
9 v( a2 O! W! E: ^0 O: J" @8 ~7 E1 |
( m8 ^( N! X, O' v% N
; r+ Y0 u: x( S' @# X
; {, V3 r3 i* e, j, D/ o4 H 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
+ \( ?- f; F3 |1 \& h3 } , A. b3 A L) n3 |# l
' L0 _. e a) o8 J+ A" }9 g4 r
! d- {# S0 u0 H ]: @2 r. |
% A# e; n' k2 b d/ C' \. |9 K; N4 M1 V" o5 w$ v" r' u
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
# i+ J7 I: u& T0 F, {3 d6 w7 P . O) o5 r. v6 G4 i9 D$ [/ n
5 z- p9 ?3 O/ U. I, U & b( h" v9 N( x- m; {( g
5 q! V+ c: z: \' O' L
, [1 @- X2 L m. O . A; X4 h9 g B* i
+ k q# D* ^4 L) h3 g1 `
6 \: \# p+ w. B+ I( ? 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
6 ^8 V, A- p% X: Z" k& x
3 l) G$ G$ e) h' P
7 Y; g& j8 g0 B6 u7 L0 A: M0 I6 W LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 3 w% H& E9 M. X( f6 s. s
/ {8 Y' M: p' ^, f3 C5 o7 V" F3 ]1 E5 Q( m2 B
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 7 F0 y" z3 _' a7 @
& @$ g( x4 r1 Z1 ^" P8 {1 {1 p& f: f! f
开源的luasocket代码可以参考学习下 ! T) C7 G% P! V' I1 d
/ Q; y- g9 M4 e, e1 q
; X' W# C, o, S2 o! {6 \
https://github.com/lunarmodules/luasocket ! m) B/ L# a3 J# ?
! `7 X" ?0 g7 Z( v4 p9 T
1 D! f1 i/ z; e5 A- ]2 E# G6 C https://github.com/fengye/luasocket " H, ~4 w- V* ]
$ K$ p# E$ l) i
5 ^0 ?" |* C3 N! |; R9 u* [9 q
7 z0 b. }% `3 s+ `0 Q/ ]
5 r% ~9 d6 w6 T& b0 v5 K" L7 \8 M" f) |0 t( x1 E
- h0 W( {1 C0 o. }
3 {" w, y4 O. d$ p7 n) F0 G
6 J: o" ~, i" a7 s; U8 `, v9 Z5 o
* E5 s4 t; T0 u9 ]1 q" q
' O2 P8 `! A" q1 d1 Q, ?$ T
' R7 L$ G& m; F" F$ B
9 i0 z% G9 R7 }7 B8 ]7 M ' w- t/ _+ J# G6 c. M, u. O
* m- D! H- r/ c 总结 : I% y" a5 ~* d. Q6 Q1 W* v
% x/ q7 w8 a# s. T
3 x: B; b) v1 b2 H' y2 s
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
9 n2 F( B/ y3 H' K4 r. b2 C
+ ?& y! l |1 E7 a5 ^' X
) l+ D5 ?* a- Q, j, M$ I0 i* z 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 7 V- ~2 }' [, d- M- j- E1 n
- y8 C$ i) b) r* s# l: ^% ?7 F, K( F
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ( C8 `! }* |' r0 \) g# ~
2 x! Z( ?' b4 ^8 r2 T) k+ S
1 |$ U+ W, [+ `& O# L 结束 & W# z3 @1 n( L8 S
0 p8 }- E c% [; [2 y8 m3 u
, }5 @; Z' o# y2 D1 w8 e' `1 F 【推荐阅读】
; p) P- z2 y) }9 j3 c 7 T( `+ H/ P7 s& h! p) F) Z3 }
1 {$ N9 Q- L# \ e
对吃鸡APP的分析
) q6 y( S& V5 O4 b% B. F
X4 |& L) r: F! ] d
! Z$ ^3 C% e" w0 k2 o 你需要了解的APP安全
3 _& m* C8 e* p' n 0 a, W* K( }6 ]1 T
1 E* _5 d% l |/ ~0 F9 Z
你需要了解的APP安全
& _ c- y& F; z! A/ t' J y# s* e & [+ O; A& y: N+ U$ {( r5 w
. h, D- ~$ M+ J
1 p. p/ I J, c+ l
|