% j% O1 l6 P0 @3 W
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 8 F, Q. q+ E4 v
3 a, [3 h! h" P" ]3 ]4 x9 w# a
: c. _* F+ Q0 H% n
0 H. n* [( r4 D" E- r7 I
; N" {, T- V- N5 ^ ]/ j; m
; x/ H m7 M# Q+ u5 V
/ U5 o5 T) w# w% m( @$ P8 ?
" V- s; O+ V; G- f; c, r1 L# t$ z2 l0 `
下面就以开发者角度进行解析下这个APP的功能的实现原理。
! F" N1 A* m4 Q 4 U! d7 ~2 Q( B
8 ` k7 h) E+ {5 H
8 r$ F5 x+ E/ E' k* N0 Z, ~0 k3 X
, Q- J0 \; Z& y# [+ ^# W m# x' Y: H! L* X, b3 h
基础信息
6 w: _5 U8 B+ U; Z* o2 G3 g1 e : C- f" I m8 H! ?0 @; n$ w
" C1 L/ Z; t( z6 h3 h1 x4 f& p 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 & h* p3 m1 I/ I4 t- Z3 N5 I
& Q0 v7 {* u8 I# z; e" z) T0 B; j+ Z& m" j ?: E
4 Z( D8 K0 P# k# f8 |
0 O% R4 z' D: K0 g- M1 f
6 d( L% w& o, m7 N9 E( h - d$ Y; ?5 g2 k2 ], g! m* ]
5 K& I8 V9 ]( T* y1 R5 X/ h- y" C0 x3 S `1 N
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
9 `$ }" U* s/ g. p, }
9 P# L! O& H# M7 Q! ?; |1 S, q w8 T7 {8 F$ M4 i `$ Y
: t8 |' o8 C$ H5 R: O5 t7 J% A" T
) J$ Z$ a. o3 O
1 c1 q7 h& k) B + P: o# G8 I4 v |
7 E7 e: z" O! j9 O/ G
( A1 A9 z3 w4 p9 } M, w/ ]" | 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 ( z8 d5 W( G( B# D
) }3 f7 R& \! B! ~. s8 D
% L- V8 A. ?/ Z5 d
% j: m% {' l' x# o9 X/ F/ ?: z
3 u1 Z, X3 I" K& k6 q5 b0 P: `' B* a# U" j# p# n
+ q9 h$ v, I0 G5 S( f( M7 F
+ C( m; c) Z8 H, S0 a$ }! U! i( J& g- g9 P- B
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 ' y# `% c' Z4 Y4 `- ?
# s8 h+ H) O U. G
& Y9 p% t+ k; M3 l% C# b; h7 \ A5 a 7 o9 H6 V$ a$ h: i
$ p0 { m3 P, X* p9 Y1 m
6 }7 T! ]0 y1 `* v
/ z! @% {& k8 G4 F# Y
# l, ^1 k$ W# e5 L8 {3 \3 t
' h1 R- A* o0 } m; d9 u( M* W7 r 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
' P0 c; u1 A6 u; l5 P0 q
1 c1 @9 [7 N" y# z+ D! S. c7 L% @5 M/ H; M- A/ H
0 z$ A+ E: f( F9 M1 ?
' J! N3 {1 E: i$ v& q6 a5 O7 e( \- v' Q5 L
" ^; P2 L; s1 r2 z/ J
2 S: B k/ r7 h* b; y
1 b5 s4 n( [/ @; l& v4 V) I; u
1 L' S' \* h) `& |8 Q, f
( T9 H# J+ q7 Y) ]
% N( ~; H0 k- r; g+ p) X, k" q
. d, u7 d6 u2 N/ o t 签名信息
A7 o0 H3 ^( V0 e, O- v. B
: u! k7 b* ^# B/ H/ b p6 E, T
0 f/ F/ x9 F1 v) q$ Q 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
' [0 N; j' q9 [ Z! ]- \# e
7 S* M0 M7 f) j2 L- S2 W6 E/ a2 A2 P8 u. o
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
+ _' u0 i/ B/ _. p# @! u
' S8 F( ?" \0 q
0 w3 t8 Z h2 _. e* s0 h9 o 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 9 O' D8 _" C _) K; C
# B y, ~; X1 x9 q) p* ^5 v. e
[ B+ l5 @' A* w+ z
4 E+ F$ v. o+ q0 `! \* |6 n3 w7 R
7 X& | r8 D7 c4 F/ @( Z3 a4 N z$ ~
/ _1 j1 Q4 G3 [
# U: T- V, N1 _: t; Z9 j) r
! o a; w2 u) H' X8 T { android签名的数字证书的一般都是采用 X.509的国际标准。 6 Z, d! Z4 K2 z4 i7 w% N! ^
) }5 Q) g, h- j+ W z# R+ ^- P7 `1 `/ Q: u% }9 b9 G
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 / n0 H4 c7 f3 A5 R, q
; X9 _7 G0 Y8 R+ i/ {# Y- a7 x0 M5 D" O+ E8 a" U" |( M l
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 5 u `. Y3 D2 ]
7 W+ T ]- l6 T- a1 t
( D0 a+ R+ Y. j; D
- `9 N# C! J( M# C+ Z7 d
! C1 Y* o. a# A; ^, b' B8 `( r
2 i6 E2 N4 q% k1 J
2 S" L/ E; i" p* c# I ) U: p5 }% ^! r* Z
. w6 D/ j, c0 E 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
# O& G5 M9 W& M* c 4 ~8 R9 H. u8 k9 j. g
4 l: j/ \7 x4 D& M6 O+ _# c
* N! I3 P. T1 R5 j, L: s
( y' [, m* [1 p% y1 s( c+ P) r6 S1 i2 \2 f: W
、 ) r2 O2 j+ _( e9 G- O
; V; B, R. }3 A8 O+ y
, R: ^9 K. P% {5 e L
; D& s3 T1 t2 s4 |8 U
6 y, `8 f0 E- M/ R8 E0 ?. J- k9 L, L8 Y
权限信息 ( M0 X J# r, N0 T: h( `
6 x6 V5 V/ y( r: ?* i
2 H0 e1 d. ]$ j( R& ~2 i3 V
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
% B) ^/ P) H; Y& d ; y- E' P3 R8 [' o6 G: f- Q
7 V% n' g' T7 B1 o android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
$ J* v* o: W& M5 D/ v9 J 6 a7 K2 ~# l. h0 a3 @3 z
5 ?. P" W1 g- L
4 }% c6 r) N3 d* i4 D5 `" O0 a' h- f
- w0 V1 t$ u7 A1 j, a4 u
: k4 q1 H1 _& D* P |6 \, r9 _4 y
8 A* K+ E$ k, F, p; b4 x$ J
/ J* e! m3 H3 v I2 B: j# V9 a" P( S/ x/ z, L3 `
下面对这个APP的所有权限进行详解下: : c2 W( P" O9 V5 T, j. S) E
3 `/ u5 J9 K0 q( v
% b% ~+ n9 I( M0 _# U3 N! q( Z android.permission.INTERNET :访问网络连接可能产生GPRS流量
' w( d, D5 {$ g' T3 h
1 j" m7 `9 W# N
% J. Z B0 j6 y$ E" q4 l6 f1 [& L android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
: B& I; k% z: u+ X+ }* ]6 h " H* H8 Z+ i) C- C8 h
0 ~1 L; c! F8 i- z2 h9 p6 T8 B android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
1 c4 R& x+ H1 x( ?7 J1 Y$ P 2 a8 y& \4 I& D _
: ^% I* R6 Q9 `* x0 F, e android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
7 p4 Q: k _. |/ q# L, h& K
* f. |( ^+ q( q. B# p1 M! {
: I- v4 b3 r: d4 ? android.permission.WRITE_SMS:允许应用程序写短信内容
- c; X- B! }) R r0 U # @# H! r) e! l1 L3 Y! R2 I
& v1 @1 Q; q% @% t% m android.permission.READ_SMS:允许应用程序读取短信内容
5 B$ {/ ]2 m* y: k: I, g + Q) C9 t+ w- d" x4 M7 @7 o) d/ v. e
' t7 x4 p" L1 z# Y+ x1 N5 |/ d; j android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 8 L# h2 j( C5 E5 L: F" O
k- r% F7 h6 y* }( i
0 \& g: q( P, l' R android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
2 f- B. G4 h) c. i) @% d : V3 g, J( L6 H) F) U8 H% c) A1 K
7 i/ d/ h7 m! [5 w3 G android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
8 K" v% p8 @; x3 `. o
: B, W/ h' C ]& e/ c4 |
0 @* ]/ \ u; i9 n$ F* c android.permission.VIBRATE:允许振动 ( f" J2 q9 l3 I& M% ]
: S+ M' }% S1 Q& O
) V4 ^- C) M2 L2 ]
android.permission.READ_LOGS:允许程序读取系统底层日志 9 N' n) l& ~3 d! }: |
% x5 v3 I% t: k" _/ s) n( @
3 }7 v( U( @+ ^ N" y6 }
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
4 T9 p# Y5 ` M; c+ z
' X, [' t3 \0 Z! q5 G7 p5 h) c+ A# w# k6 u3 A% Z, E/ H
/ W6 B3 `3 G( _& K' ]. u) K 4 Z' A6 L. g8 d' c: u( ] g
! @ h! @" J# |) h1 c
功能信息 $ O1 s" H5 N. B6 H
" U( e6 P7 ?, i. b& G0 f
% E/ F) ~0 d" E8 k# R6 V" K+ A ( L1 V2 g# j) h7 R0 f0 O- w0 S
) @' ~* K# Z8 }' C
! V+ J; ^% W1 H' z3 D
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
( r6 d u+ M! E9 G) C) \4 x( v
0 U$ y) g q) T0 p) W
. H* H8 C& K# {4 l8 c Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 ) w0 j! I, s8 l, R
8 L( u7 [. H% s
1 T: a& m- O5 G- ?' P- i* B5 z
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
2 h2 T- X% W, a
- I/ y9 {+ ^: l# m, E3 m5 V
- N0 y" J! f- r3 k: M7 L) i 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
2 r- ~) K- w2 {; [2 u. |
$ z$ V) v/ T7 c+ z7 K5 N, a% M; Y5 ~9 r& E8 C
* d* t& W; D2 x
1 b; Y; k1 P3 [; v Z' c h
( V0 v1 W0 @' f2 Z, X1 t
4 ?8 K, X. Z1 [7 ^! f, H# v
4 i6 |2 i6 T' @9 u! c0 C& K+ g! e6 z8 ]; z1 P% c' j7 l' A1 m
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 3 m1 [& P/ L$ m0 y, d+ s) [% o
- R! D# t. _ u2 L$ ^# V' q" B; f& U3 P; u/ J% C7 k% A
" {4 j8 p9 w* w; `* k, p7 R/ g
$ ~3 o# ?# V$ I) l9 R; A, A$ m
0 }$ ~2 j7 ~9 L3 d( P
. z$ n. E; D& u% I5 F* _6 F, L ; H5 Q4 o( U9 N- o; @; ^: o
$ i# x4 R4 Q& f- ` 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
) u9 K5 {: g+ q
6 C5 K6 u, L. {; Q- |5 p Z1 ~
0 f5 u+ }( Q% A* M# d1 b # c% X! B3 t& f4 P9 N' H
* c+ u# t) d1 F+ n: ~+ b3 l& c
5 V4 S2 h- w5 v2 }; N% o" W; s
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 # r% h2 e2 s2 o* _5 @9 ~% k
- o! ?6 I' W2 ~2 [. r; h( i& \# W( V
, @4 R, \1 p2 l ?( G+ T$ S % `$ y( o8 f) N4 @) w" ]
- A+ H* r8 @. K, q. l* t0 e
6 A- x8 }0 Y3 U# }- f
7 {0 |1 m0 v5 E) W6 z% V1 w
0 l% x# K6 n% _
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 1 I% f! H6 c& t9 ^* k
6 I1 {8 T) Y& g7 a" z, P6 o# H* [3 z9 d; K8 ?& V/ x( s
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
# T- e" S: I. x6 Z* n" R) j
: u* h8 X6 R% O* X# q8 W/ n( C0 b2 v2 C. e
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
; U, \3 V' N5 X6 k7 K# e 6 B! {; E! B" U
+ N! M5 t2 Z0 F* H2 T
开源的luasocket代码可以参考学习下 7 Y# z) o, V% w/ x: o/ X
; R8 W3 z$ _: M2 v
7 F! j' ]; l; ~8 R1 ~. c https://github.com/lunarmodules/luasocket * }2 d A7 m4 R- L
4 p. U. k) ]' f: W4 m1 f9 G
; K* O* c. v7 g3 @7 l/ c& C https://github.com/fengye/luasocket ; M" B1 |# @6 j9 x" Y9 |; p: J
$ [6 e3 {' \% d
* b! Q9 @1 w; ^2 z. s 8 K. N* E2 S/ v( e+ Z" C
! H+ e6 |: ?# ~ E
0 c- j. \5 x2 U/ j
" ?$ l% u9 m+ |' B1 L
0 y4 t9 K) e% k# `* C' {4 S' C- b0 k7 O7 ]$ y
7 j8 i$ _9 Y+ \4 }$ Q . ^! V& @" u9 d) Q! u+ T# T
6 N$ p$ X" z/ o t7 U8 m7 {7 W+ y& E) \
! X7 v: G A% ^ ) x$ O' s: i5 r* n4 z( ?' s
H! A% M& k* F' r 总结 : t( {9 k3 c2 C2 b
( I2 D+ K# k! D: q& e y, f
/ G5 d! t* k# e+ K3 |& s 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
$ T5 L3 l4 G; w( _/ z9 i& X! ^5 D
/ I* Y3 \7 j4 o6 Y( H4 J
0 ^* m |6 E7 {$ F( { 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
" B% a# o" ]) i2 s, C9 H
# n; i0 |# m. l3 ~
( F9 X |- a% d 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 , E0 W. I t7 k! }: | B4 N. i! S: F. n
7 A- h2 {* T5 C! B
# C$ x; x9 J6 ?" Y
结束 $ S" m( ]$ A' J2 ?( w; x
! t: p* e( y n v W2 e
4 {2 J3 v! ?' l/ T, F# J
【推荐阅读】 : i0 c$ ~! B. U; S& ?: }: T
5 H7 C+ i! U# h7 Q0 i% u4 _. R, i( A9 A1 R
对吃鸡APP的分析 + ]8 p+ Z! d6 J# Q& D, `
$ T5 F) }9 p1 X# l! f5 B' x0 ~5 R) r
你需要了解的APP安全 4 V5 _7 S' r. H- `2 v6 i
& d9 b- A6 }9 j6 `! ~5 M
P. N3 [$ y2 u+ v! b Y9 X 你需要了解的APP安全 J5 ~# s) E; w7 A3 B6 n7 Q6 S8 ?/ l
+ l+ K+ R6 m2 E4 }+ q) w
2 q2 Q1 O; }, e# {, O @ 8 L4 v# T. R& {, l* m9 [
|