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