$ z( n2 U( Q( J; O/ F% d3 E 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 % F( Y7 g$ V' c+ u8 C
8 E! g8 E- c+ Y& ]
; E0 K/ m5 ~) y/ {; L
- K4 b: v: N: _3 n- a
4 f5 j3 P0 r3 h1 a* [) t7 a
6 V9 X" M' {1 ~0 Y/ w4 H; ^. }5 x
# K* A& a7 N9 E! ]' W9 ?5 T
0 V8 Q6 t! T6 Y% T. q9 w, x
* @% q0 K. D& n; `! B1 F! a) ^6 R! h4 J 下面就以开发者角度进行解析下这个APP的功能的实现原理。 1 ~, O5 P$ m2 z# ]& q3 v
9 L) X% t# C8 c" ?2 g9 z& m
! V; j* [% P r `8 N
) `3 f( `6 j4 _, m
7 D, N1 h- b6 v2 y N, r
1 ~ `( Q4 v% \3 _7 j
基础信息 8 t% T$ ?$ Y$ K" _' a
% G2 [) s2 K, U: _. p1 J# y
5 T/ v1 ~/ Y; c5 }1 z) J A X
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 # W0 ^" e- b! n& Q% }) X, w
$ x8 X. A; j* T
+ f: H8 {6 V8 c& X
' {, G- F+ c+ [: R" _/ n : \% t3 X0 f; l9 G ~" t
+ ~1 c$ |, \; u# t% w7 i) [* u+ t6 B
; ?$ Z8 N" C/ ]6 S) p: v+ y
" \( K' c5 G# O0 \+ H0 }
! \% F0 E1 {# Z6 c 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 8 e- S# x7 P' S
l% ^) ^6 [' ^+ H. K+ y" B- [
: O7 N) s" |% g$ h0 m1 I
3 I- x/ X. h; V; B5 G # s9 D3 L( m& G/ X
/ Z2 @% q+ c% u0 {2 a% O8 f
6 R8 x/ X1 v9 |! j
+ v4 B/ r$ ~0 e8 H# S4 G5 _
, \/ U& p' k8 {* d% Q# G* C 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
* Q9 s- p8 R4 E$ ~
' V( V% g/ G0 {2 K
0 d" Q2 B) a/ ?' s+ j4 ?/ t- L
7 o+ V) q! @- I- d7 v- @
* m0 t3 {5 _( A6 Q5 d. d: I8 R, p: I" v" w
7 C9 \3 `* N( y# Z. V; s
. v. x( Z1 V" r' v" P
$ S( g6 X" R% `$ Z. p
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
. Q2 x; z: V9 Q+ W# P1 a$ [
% E! l0 w1 s- x: M$ R3 O" @+ {+ F
0 ?* g' N+ U+ C# B4 _" E
8 i) r5 Q; ~: ~* V; E) s6 c! ~ $ Z( V, L! a8 p3 o8 W
P0 m3 G6 X" a, R( E5 W) e
8 ]2 J0 d( D; |9 |1 \
7 S; q4 v# R2 x" Z+ Y2 x! _9 w7 W% b) U9 w0 M8 f4 R! [( k
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 / j0 z8 F: O3 L2 h) f1 f
' c9 w% [9 }; E: U2 T
' k" r/ l+ B( v7 L9 | _- Q; v! n1 ]' @" n3 f
) ?+ }0 j9 W( T& L# p7 e: G n
# O5 K8 _; f9 I* m % {4 R% n$ F" F" W8 n& f
5 a5 B! \6 U1 g; y; u4 M" v* W- W! T) ?4 P
, M. [" [# X) U9 d( ~+ r + m( \" J2 m: m
0 }! o. e$ f6 I6 G- T) W
签名信息
5 o1 N2 _- A+ Y) S3 K9 @ c3 O7 z7 N5 u9 ^4 O; h
4 L8 I- x. T! e* u5 i& ?. j" a2 r
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 3 v3 p0 c8 k9 B M
3 M: f1 K# l2 y) v1 f
' ]* R. z7 G8 z3 c q! [& V
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
* Y8 [, h/ M/ r5 T1 k
8 a: F6 y& Q" r9 E; f4 K" P Q. v) c8 g
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 2 w) W) S7 W [7 m1 U
/ t, U- l/ _7 c
. S. m1 h! D+ i4 V# S : ]3 p' f$ j; X' v3 Z7 F
" d6 c& F# c# |4 {1 m
; u- ^: g# T* l: O; H
) Q5 ?; @8 J( W+ @+ j 8 H/ I W. r8 s& u* U8 S
- o4 ^/ I: v) G; b: u" a |
android签名的数字证书的一般都是采用 X.509的国际标准。
& v0 i/ o- V" b5 I4 {: X. }
4 T, q, i2 D9 K+ a# E4 M; y2 j* q! r
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
: Y' s+ ^ s, w2 c
! e0 j" _- x% \
& `; T% I/ m# ], E( h2 W 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 6 ]% p: |( a- C
/ V* C; d' V. Z, R; P5 P3 d# ?
, c0 ]( y( W" K 1 U4 I) `# l5 Z: ~* ^( U
$ `3 X4 I6 N( B ~2 U) m5 ~
! }1 [1 d- F% ?' z
" B2 @' M) Z( v
$ l) ]9 j" i( k3 P
0 F$ p$ g5 `# l# _9 j! t# Q 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
) H# V5 @# D# ^0 d5 ^ - H7 F) [; Z) V& m$ e4 b' J
% b. M, R5 q- |/ p
+ T, n6 @5 M# o ; |! t! C- r% w; @
% l0 Q( G7 g$ I$ ~& B# M8 E4 R( R 、
3 _1 x- \9 ]. ^5 u
: y0 {4 N& ]2 h! h! S: N" g" H8 ^; J2 [1 f& I8 n: ]( l e
+ p: R6 K3 n8 q) o7 R! p
# |) p+ c" E. {/ X" V! f/ L7 S
4 O6 a8 o/ [) P, c8 D
权限信息 7 i: ~2 B4 }0 `+ Y' v0 c
4 K2 }5 H$ J$ |8 l
" X7 Q/ v2 c' I9 l7 A, p8 i 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
" `* Q6 x. u! n7 X # D% S2 M5 q1 J: G) H
" W. e# S' ^/ a% Y6 n8 u+ x
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 9 k0 y5 M( B! w& E Z
0 h- H( o* y d% D1 K# y) U/ `) d j% Z# \& g J7 i- k; D
* ?) W1 | d; y8 u$ X
& z! r; }$ a1 x" ]6 n6 b3 x b- P# R+ x; W# y
- R% r8 j- P J3 u
" P7 D5 D( m# r y/ A
4 f ]* `& z+ j7 [* K/ c" [ 下面对这个APP的所有权限进行详解下: & b! m8 r8 S* ?+ [
- l- l0 `8 V$ n# k( }) b, j4 S! h6 [' D% l) |1 B. c
android.permission.INTERNET :访问网络连接可能产生GPRS流量
. H: J2 w8 Y, ? . j6 v O' d' N% @
0 H: u7 p3 M6 ~: Q android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
: U6 b' o5 T/ h+ o- V8 ~, D6 s& \ 6 ?- D/ x, U2 m8 b
8 e1 z$ d2 @9 i9 a
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 ( g7 z# U# k& C z% V) P
# l5 ~6 G+ E$ F' J4 N# L, ]
( Y( ]3 {4 e' `) M android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 ! l& ?' g/ E/ d% i6 u& O3 e9 {; \
' B' c$ a3 G0 O+ S$ T
" A( ^* R* M! f, P; ]& A android.permission.WRITE_SMS:允许应用程序写短信内容 E" @1 r! o3 C0 {) U7 q2 U
& ?2 {2 n6 k7 M
* U* B& N# U$ c! q0 Z
android.permission.READ_SMS:允许应用程序读取短信内容 3 y( o, o/ _, Q! u1 a
! h, z; ?! Q- t, `
+ l: M+ T, \3 p9 k7 K. Z# ` android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 9 B' ^0 F9 R& k) H( n& n
5 W: H9 ?" s6 t" C z% p
( D! ]6 Q2 y5 l' H" }6 U: ~ android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 : h: H: m% \( j0 a {$ V; P1 U6 |
5 x, ]' R, \: T& N0 k
( D J( h- e7 L4 s3 j android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 " K$ P' @/ |; u$ f' Y' E
0 Z$ l; f) s% Y! j% C$ K, R$ i
android.permission.VIBRATE:允许振动 $ i+ M1 r2 C! n8 X& }2 }
' u1 h/ o& ^( T, j- c+ H4 w( z2 A3 N, w
2 S# A; P& l. ?& z android.permission.READ_LOGS:允许程序读取系统底层日志 b% w* `* {- z! B
4 F6 P+ Q' _: w& @5 b
4 Q4 g9 G6 t1 u/ A% Q3 z. c; ?! }3 x: g
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
7 {! C/ t9 k6 ~( Z0 U* N+ G
. ~# e' z, f8 E0 |% t$ |; \' V! i" ?0 @
% B# v" g* e9 J ! q+ H9 T8 P! w u; K
6 j/ ?! o6 |5 e7 u* s6 x( V 功能信息 ( V0 z, w$ n1 {" a/ O5 `6 N
: ~. a" b N% f3 m/ \6 c G1 |+ Z5 U+ w' G
7 _% W* X& Q/ h. H
0 h+ B* R; |: p+ q
9 v/ T$ P% j/ V7 E 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 1 I0 O0 O6 W$ p9 w, k
; Q' |9 v# A% B$ Y
- t2 D- { C( r1 ^) H* I
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
8 F3 Y- C3 D7 z, V # b* u& x4 A4 F
% S3 @8 r, Q: x$ }0 w) }
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
/ T9 l: [$ A* B! Z" |
: h! k- k" f9 s! A
2 N3 q2 F9 t1 v- F 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
7 H7 ~1 x1 j P7 P/ m5 Q6 J 1 V# J% l8 D$ V9 N8 w
/ y" T5 U; J) z. q3 T
`/ |/ I4 s& A+ c6 l$ A 8 y5 A( l0 D9 y ^
. {8 [' v8 P$ r" L2 H5 R
' N: F" u# f2 ~, R2 s
# a: ]- w3 u: g% ~' f/ @4 r( v
- K/ `/ W G+ H' g' h1 ~! m 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 " d- w( e9 k- h/ ]6 ]3 G
, a; a+ N) g5 F% k8 z' x. r3 B
( s+ B0 b- J/ s" P2 d& k 5 P1 L: @6 Z& y6 j R
! K7 ?: v$ Q& o) D3 B+ t/ y- ]0 V! H: M
* d) C, `! P3 U+ h" b! j
0 u- \1 n4 w! [! ?
0 P& X* r' k% \3 K# p: E8 m C
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
( O9 X# r0 G0 K) ?" _' ?$ J {% f
) A u9 a4 z W0 A% b6 d/ q8 P3 w% y' u G
% d6 l" T j; [- ]6 v1 E- f( E
U5 z9 i) G0 V" G0 O3 Z' y) T6 r7 z# e2 ]) z6 e3 `
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
1 G+ Q; P, B1 D+ p# B; t 4 { f' D K; d9 C C# u$ B7 k
/ e, A# \* ~- s6 f( m
* D6 B. z2 F8 G( F1 r . u% q& X6 \; F0 W
! K6 B* x6 q* J% T9 p4 u
1 O/ ?3 F6 I0 m3 s7 G ; N0 e4 j* o+ u4 V8 K7 s1 D
5 N$ ^9 N5 {+ Y8 u 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 . X8 Q# M6 r' w( }
, h! a; N, v& B, V
) {8 y; l" i$ h" Q4 a LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 $ I; y- ?. Z1 |
2 c- u; S q/ P4 X6 {0 _; H8 [4 ~3 A2 V4 S9 x. Q, K3 L
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
! H9 y" @1 J5 t( _$ F
9 S0 C5 c. Y8 d( T: q& P% c/ z8 o7 A8 m+ @) Q
开源的luasocket代码可以参考学习下 ) j' `! P, D) n8 o
6 E* @% Y. n& ^& d* v' T$ O
& B. j& u6 X& S4 S* r
https://github.com/lunarmodules/luasocket
4 i5 Q/ G2 U- K2 r( Y" b + I# O+ h1 f1 e4 R
! E1 t' t8 m6 N
https://github.com/fengye/luasocket
' l2 ^+ _% J1 g' n$ E+ I& w! ?
' R$ P3 g- w) Z5 y, ]
, G/ ?. p* i, R# ?; I2 H* l, D 7 l$ c& a) E* D- p, ]1 P
+ ], S Q: E1 {- }+ ?$ J1 I+ q- y
4 w! C/ `: F# n8 n c2 ]9 G1 F
: B4 p) J v/ R+ H
8 B3 t' U3 r1 Q8 k8 G% ^2 c h% z1 y& P% O8 Z, ~
3 Y+ t. n2 q$ P
9 D8 j* A1 ^- S' z& b8 ?
; J9 @2 z& V* r0 o1 O : t# {0 T9 o* g9 M4 p
$ x! \! e1 F* k; p 总结 ) a, w& n) B; R8 O" A4 X
+ d0 b6 Q, A+ A+ I E+ G
0 U9 W! z( |- H t 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 7 o# I; d9 j7 l5 L. j8 H
. ^- _, N7 D' H6 W9 x! L% R# ~2 m t. A, q0 s* f" ?2 G" n; ~
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 / J5 a3 F4 Q I6 _
" J; P Z9 ]0 i+ a' ?. F) l
% s. i" s- M' ~( M7 v 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
/ m# i" O; C9 e+ g! G7 e3 G4 s
9 `: Z0 E2 h q5 o% t/ l1 I' \8 u! C6 U q) b
结束 6 i% f$ I! }1 M
8 p5 k4 A. s8 b# y8 z: ]
7 [& @$ }/ H) h# x' T
【推荐阅读】
! H/ h5 i8 K( a7 p( ]
6 s3 I* M" c: \8 \/ f: K. ^9 b( p( n6 Y! F# j
对吃鸡APP的分析 , ` P" s& N. n4 x& A; D
- [7 k& W7 S7 s/ ]
/ k' R) R' L6 x2 c+ w3 N/ Y 你需要了解的APP安全
0 n5 W' B t) V1 P# }, X$ n6 A ! `4 _% p6 C5 G# i) z+ z1 M6 ?8 X
* ?9 z& ^/ P# P0 q' C2 x6 S 你需要了解的APP安全
2 m( U* h4 ]" s: L" [ |
9 W6 p+ n- Q: K7 U: p4 J# T8 }6 f+ n! j b$ g
$ G; @& u1 g; n4 {5 G, O4 N+ d
|