6 k) s3 U0 K( T 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 8 k) ]9 Z, n* y% b9 P' M
$ J. [* X" W( b! @
1 W/ I$ V- D( d, H+ s8 ]
/ |$ R/ q7 I' ]' X# y
$ c. W* t4 x8 ~8 Z- d, _1 M- p: U5 o4 L, U6 C" B8 n3 N
' w: @) g |+ Y1 O
; i) k& N+ j+ X) \, o- f
& W( r, E) m1 E 下面就以开发者角度进行解析下这个APP的功能的实现原理。
5 z- s" {+ z' d2 |- S. { " `4 y6 h+ p3 ]; h6 b/ r' q$ b
" f- Z2 ^) o0 E( y9 g 2 p! h. {4 s. |
& Y f* N6 j1 L+ r; X Z7 _* }. c
) a4 t: T2 N z 基础信息 Y2 Y2 ]9 Y- [* K$ a* H
- U z4 p( k. G, S/ H9 I/ h( K2 I- S* h* |. M+ }5 m8 T( k/ A
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
- O, v! [, Z4 _! h6 s% L( T 2 z& `+ Y2 n( U8 W# x
: k0 d" E' _, J6 k& r . U- o9 J5 s. c+ i$ |% ^8 A
4 {% o/ j& L! r" o! x7 } r5 X( @; q6 U1 r8 j) g7 @
: B2 s4 W: H9 T4 y t2 m8 S
% ]+ o. M, K4 w# \6 P
& r+ k. X) \( S5 F2 Y6 D
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
8 X' H3 A) {; R; A- k, T/ }; i2 d; W , |: d3 V: `& `! \2 \1 m
4 i+ Q& b# L/ L% C9 \
! x, J( Q7 ]; P$ [# J. Q+ v
* @1 z# ~- s- a5 s m$ T5 i4 n' h3 Z7 P9 L+ ^8 K% s
3 u3 e, }5 o" k, i$ F7 W7 c K
w- b1 a% W& R0 s) d3 N- w4 U
1 J: S6 H7 S" D5 M2 w
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
8 f ]3 B; N. r% w' Z! ]% M: O
+ U. G. L( ~* i: M" X: B X. P% ?. h, Q9 p; T
! U4 i$ g2 {( p+ V 6 n+ _! d' q2 h6 C
$ {5 |! h! Y+ ?) F
% K9 R7 h1 h; R! x z+ y 2 W7 u7 |6 f. l3 G3 T: P0 [# K
, c+ j5 Y& Y1 }- `# y1 M+ v
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 " F8 N" \$ a+ N! o% I
* D- m- W0 G0 a0 q$ U) @2 e
7 Q$ |' }: J& P2 }
. g, v* x9 [ u) J . R, B8 V! C2 f7 e$ W( n$ s
4 }! V3 e1 R$ i
& H% ]* Z4 w4 z: Y 5 I5 ?# E) }# T5 E6 }
E+ D! a' N8 \$ K+ Z
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 & `3 d. d+ g& N5 q
$ n7 I( B- Z) ~% y" R7 R- q' V! X% p( T* t6 l) I) a( Y! f* G
; M& \7 m3 k; f3 ]) d/ l/ `
* W- E$ D3 G* U! z6 c$ z+ r8 x! w
$ v; ~/ Y3 {, {7 u 9 {2 }# J; g7 G; e. R" v
- _$ F" c9 p( ?7 x. A
2 o1 x5 I, i$ K: x! R( K4 W
$ I* l0 D Q" G4 s
; Z7 V9 r* I! @0 J* b! c( S
$ [; o j; w0 O. n. }, H- O0 y 签名信息 / R. }) x' J- y" D7 o
( q4 V! n# [0 t, Q3 `
$ f7 \: _1 h+ a# e. G+ w 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 * M) h' O4 W) e1 W/ `5 F
/ v4 L- N* Z0 `# \0 ]6 m* @; B
' E9 g+ u$ Y. ]8 r K9 p5 a3 H
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
+ ^- }/ ^$ [+ x7 z( T - P6 I9 {1 I1 E1 H" ?+ B( O9 x
4 F2 p. I$ z0 @; H0 ?/ q! N 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
9 G$ p5 G0 h0 u4 _7 W
3 Q7 c* V4 v" U% c% m3 x- d2 r; B, d3 U- r! Y3 ~
1 b2 W* e4 m: B ; E, M5 h9 g) S: [* j$ {
& B, _9 s; I7 l2 v$ f* x
+ W; q8 a$ i8 x J5 P! [ ! t$ G8 M0 Z/ ?, g: h$ ]
3 c" s- x) v# L% r
android签名的数字证书的一般都是采用 X.509的国际标准。 4 p4 a3 c+ `2 \' i: A7 W `
8 c' `2 a" Y. ]0 E' N0 G& e; x9 O& k8 ~9 z) ?- b
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 + K8 @/ L4 {1 d, V
: K+ o& t3 _# @
* R- J- M% l; I) i5 R/ ]; U 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
7 w& S o7 R( y) q
6 _5 f4 @* p+ |4 R1 P! E+ A3 `2 N) Q: Y# j3 [) q5 ]3 [( \6 [0 [
, o4 r' Q1 x/ H
- R# k+ `6 p0 h
; l0 N/ S9 K) O
) n$ x% a( G) X9 a9 f5 | 8 U+ P1 v! F) l8 [! m) k) y/ ~
; A# t u# {& B# c' v 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 4 _# R& {) K8 E3 `" h7 e" W; b
. H ]) ]& J, T3 J; x
8 M0 p6 u8 D' J
. g0 ?% z9 x, }# t5 m$ Z! u* v2 g: R , `. U& X: \ L0 L7 f( g
6 X# P# t& T* b# U) z 、
. W% u( z: t/ P% u5 k, ^% z+ V( M
. o! Z7 r8 L% F! s6 L# m) J# D& U5 P/ i, {4 h) M
+ K' ~3 S, U( q- @2 f
+ q; o( ^4 K) n
3 Y5 k8 A/ S- f7 p" t2 { 权限信息
% }& F" N$ y }+ x i& ^ l6 g
+ d+ \1 v7 B0 A4 {5 l( E/ l: z( @. \' k7 U2 f S* E- ^9 [
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) " G5 G9 A; f9 L& r2 Q! H- s
% P$ r. h* `8 ?- K% k) E1 s+ D8 f8 b0 f- w' S) a
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 ) P. H+ r9 I5 S4 ^
* @+ ?* a: a" d7 }2 q2 ~- Z/ J1 d, \( |4 Y
( K3 I: I) g' M; J# Z' c
L7 Y! ?2 n; w: p2 t
5 V9 ^2 Y; N1 v; J: z& ?1 S/ P1 ]
. \( a/ O Z" S# t7 f v
" y% c% z: P* l/ w8 p
# t& V* {# g* P! K) z 下面对这个APP的所有权限进行详解下: ! q& [- Q- _) l: Z1 h7 Y- I( T' Q
# k$ Q% J& x8 s2 E0 D7 e# t
. u! d+ |2 J3 j: I. n android.permission.INTERNET :访问网络连接可能产生GPRS流量 / }6 h! x) m) j7 ~6 H8 X
' r' p# b: M6 n8 Z# q$ {
. \ T1 t: [) j! j0 R7 Z android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 / f$ Y, X' i; I: P9 ?' ` t
+ y( V; _" {# c% ?8 w: p
! B+ O( C; O L, M/ E
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 # o8 v/ V$ C: T! v/ s
6 j+ F. h6 o7 Z X6 K9 k2 E+ l
4 C& J1 G3 e4 M' i
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
5 O) ~# r/ O k& |& p9 ~
! {- C3 Y. G) P* L$ M2 ~4 N
9 n7 h1 [8 v# [: X7 t android.permission.WRITE_SMS:允许应用程序写短信内容 7 s$ h6 a* _6 e: V4 b5 Y7 E: \1 i$ h& ?- m: c
+ \+ y( X+ v" R6 f) b
$ ]5 |4 x; h% Y' X4 A" u3 o- ^; I- H android.permission.READ_SMS:允许应用程序读取短信内容 * K9 p" ^8 v6 F% }% x
& |* d. P* S9 [2 l3 P% ^/ c' c B$ W- p {
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
/ m8 k+ i, b, ^1 x# @3 n # {# G" \, Z" g6 ~/ J
1 |7 w# ?. o+ u5 A android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
: F) y8 [ \7 @3 D- ]
, ?, L6 Y! B- g3 \9 u7 P6 @7 \5 u; g1 ~ J- u/ X9 G
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 * X& y1 {, A9 B
' r! U% j* ]7 V6 a
, S& ]0 I7 T2 G android.permission.VIBRATE:允许振动 3 P$ m& H: g+ s) {
/ i2 [+ _+ Z" C. u& F
' }/ n5 `; r/ t4 c
android.permission.READ_LOGS:允许程序读取系统底层日志
& ^6 d$ k+ A% S 5 x+ u M# k \ i/ A# {
" c* {, C: x; U; |4 q1 R8 l7 B! ~ android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 + C a5 q1 @! J/ ^
( F/ q* I5 G9 Z8 o& J6 X
" l) R7 H% J$ e# v* M6 X1 h# _
8 O) Z; Q0 x! c8 {" l
$ \2 g4 Q' f5 D
9 B9 g7 }' ]- ~& w 功能信息 0 l5 P- [$ H4 f. j! b
$ z2 B( U; t8 J
& t8 x* m4 ?" L7 J8 Z0 Q U
3 U$ k! z, J4 H+ c3 y7 z- y 0 r4 ^/ a9 c5 ~) l
9 ~$ j# j3 }2 L9 z# [ 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 3 `- k* K. r) l$ P0 u
& w% F1 b/ X( o. C p3 e/ I$ V- w6 K; S- A
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 5 D/ J0 Q T1 _6 _
% G$ |' i* A6 z) x3 D0 P9 u* z# E0 `* K# J$ o; h. G
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
' k, I9 i9 A' A ] Q) R, l6 ~
X* b8 { F, G/ f9 V2 d$ F1 Z( w6 n# I k! i! o0 p- b# u
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
* u/ P* E1 ?. [, x3 t2 d2 |& X % o( A- Y5 S' F5 v1 a( {% \
( m8 W, D# z. H, B- n0 G& a# z) X 6 |$ O9 a! r3 O7 w, d
& e- r& o5 _! I6 n0 ~1 w8 i+ o! M7 L: U. X8 M7 [7 o4 D/ D
2 ?* l7 e: {( s4 D" q) j# I9 Q+ X
' ?5 ^! P2 z. O% H% Y: B
1 {% d; U$ G7 j3 O 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
* q7 p( O$ p* ?; H% A: C/ Y
/ L# ?0 c$ i4 C. U( J; g* p* `/ M0 b' x; o* T q, P
9 p$ Z7 o8 c) C" i
* q6 o" M! S* ?6 i6 ?3 Y/ K, R* c
! Y+ T/ E8 I7 e- e. B
% C1 A7 _3 B' Q9 n# N3 X- }5 g5 q 8 E9 [% M; S" v2 V* U" M* |1 \' b+ o
4 r0 `. z8 {1 f( I+ u+ I8 Z' |; K 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 " u5 ^9 @9 ^: M7 ~$ m" n
. c z) h9 F3 C4 P2 d; h5 |
: t; ]7 h5 O5 V$ e
+ F0 V5 x" ]% ^ W5 S( M% T
4 b: d6 W9 e) t" y. r( H' ~% X* d- c$ s
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
' m2 {* l6 W1 X) e
+ n' ?$ T" ]& P' V3 Y+ Y8 ?/ v9 x i/ i6 \' ]( Y
1 Q' Q; Y1 V( y: B7 V4 m
$ H0 K5 X( M/ Z% J
( V# j$ T. {8 J/ B) i3 \5 M; h7 |
M) ^& Q }1 F; a $ j; E( I4 r; ?8 ~8 N7 _
, E% g5 M6 k2 S2 x, C; q/ @: T" K
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
7 B6 M9 x/ a. ` , K% `9 U6 j |
7 R5 g, \% S$ b& y/ v b LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 0 ^- c- R) f- E/ M
9 m! I/ }& Q8 `. R3 w% Z
5 E" `$ o% K9 {6 H" f1 m4 m# C 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 " v @8 O$ ]- C7 P5 ?
; S j" k: s& E( b
4 a. R% d- A3 q% l 开源的luasocket代码可以参考学习下
4 Z! ]9 q* x2 a! m T. o; o ( d) r3 n& h8 U( ^7 ~7 f
& Z8 P* C' d2 s9 v: L
https://github.com/lunarmodules/luasocket ! s" a& b3 f: H9 T, S b! Z% ]- P3 Z
. @: r6 J' R$ I+ m7 M
" d$ \& O$ V# \8 j2 o5 X https://github.com/fengye/luasocket 5 K- O& u2 T0 X/ d- ~3 B
: {2 u$ z8 s" y! R" s
2 }. v) _0 [) \* H/ J9 h( e# Z
. l. R* J1 m0 F. G2 d; c! U " T- F, X m, l4 ^& r8 N
5 U1 f1 Q0 l( N8 V6 m ( M: N- P- M& `2 _- ]: O5 }
7 D+ o) |8 O& C q; ?1 d
; @7 X' J! W3 L
' b$ z8 D% V* ~7 {. c ! Q& O& H. ], k9 Y( d6 A& ?7 W
2 A0 J3 @0 o3 A( p8 M! v: L8 v ' I, ]2 R3 W! G# U6 n7 W- W0 {
' h1 `' A N$ i" W9 j. I/ J; e
* I) n* _* i% e; U$ | 总结
0 _. B# [* {7 L3 u3 H) q
' h3 ^* |' }) d
) @! Z) P/ l5 s 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
$ A) A9 D% q9 |2 [
" @( c; l2 h; i9 Z+ p" z$ O m1 U
0 G3 _% D5 i4 ^. a2 x, k) S 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
2 k5 K* }1 k) m6 U: H& H 7 z. G2 t/ o: T0 W- {) T9 F p! {2 E
1 h% P; q2 S+ F
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
( b# f1 P" ^+ R$ M, V$ E
2 m* a. x9 \" k0 e2 p; T, B& B, D) ?0 D
结束 1 X* ^1 _4 K% ~' t$ {
( V" v+ E3 i6 c& O9 M2 U) J# R, K
; M; G$ Z* @' I: U' ~: n5 ~ 【推荐阅读】 . C, v: ~ M; c) w4 \( K" V
0 q* j9 t+ N/ J2 [; a7 G
5 s; A! J# {9 k! ^( ~
对吃鸡APP的分析
$ q* B+ d u6 k; b: Y$ r5 O# H' ?! t
5 J- ?- S. X& ]% q( Z( C6 \$ B1 d
你需要了解的APP安全 $ k, H$ X3 s$ v4 I$ c, s
# y7 b4 U v6 m* I/ [4 W, V
! k. x) ^, n5 V$ l 你需要了解的APP安全
: n0 l- F6 G' b8 n 1 Q% D" h6 c {* k
' _1 M; a, p9 a I+ T
, u& ^* Y$ h, P. U* w0 G: `4 j |