" S( i# a+ ]) y( a- y 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
L2 g/ s5 w& W8 D
( H* b2 f" e! n6 e; _
% e8 M' m6 D% r! E$ K9 i6 ^. e3 b * v" n# |3 X0 K+ x
0 }4 M; r5 w z( p' S
5 T" x9 C- }1 u) `4 e; c
' U# w; z; L4 w7 C $ l% h& f; _( O
: }, ?3 ?. P3 A1 [5 a/ W 下面就以开发者角度进行解析下这个APP的功能的实现原理。 - B% {' Z7 H4 a9 x5 |9 [
% i7 f9 n0 B9 o8 B# B) M& X
! \. H: }' n) b2 v m 5 d1 _; t: X/ F! J' E
4 S% x" [+ l6 T' F, S g9 `9 m B+ p% h. r
基础信息
1 i2 \3 _3 ]- i, u
. ~3 ^- f9 ?" u4 ?
z+ W, i6 k d0 ]4 X" H% x 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 $ O0 Q8 u1 e2 O% P
; f* Y: E( m5 t7 K7 d. ], X. `0 w- f7 I* t$ m5 s% [8 ?
+ P3 c3 F4 M/ }: A + j& E- O. i& |9 I
5 u$ n& @( S; p M: K % d. X# l. t: ?2 v, s2 Y# f& d
1 ~( ], T; a- S8 ]. T; z: C
4 O _( B O, P T8 D6 E
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
8 t* S9 \2 C0 }9 _8 \" H- W
) Q9 h* z4 X3 v. L0 |/ K
7 r, E9 U( u2 ?4 L+ s, I" J 4 h$ n9 W+ p/ z9 V
( i! ~" i' U* k6 y- u% K5 }) O, {/ \5 d2 V6 f
% j2 N( m/ Y! S r/ @" A
! x: Y) U7 _/ O
) x0 N. x# e8 R/ [0 |. v
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
% g, F a; V. B* S ; x; I( P1 P6 H( O9 P) H& u: U" G: K
0 q% i5 X& V' T. R
5 h; g) U+ A# |. ?
, b8 O v' [% {* P- d
) S( T: X x5 h2 v: _) W
]9 M5 \& x8 e8 | % i8 b- o- @) `
) h* R4 _4 t3 ~3 [& I4 p6 J
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
' m& {! E9 e8 F3 j1 K
! m" G- z6 d( H4 c$ k
1 n* F' O, ] ^2 r1 C
* M8 S0 C" w) R( _) y q* B 3 R. N- _4 H( w4 b, F1 t) R
+ k: k! L" z& ~
?8 p/ J8 I- I- c! H . i( v. ~/ R2 F! w. s+ n2 @& I0 \
! F; r9 {5 h' k0 P7 y! t8 D
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
8 f* y. M8 z, e: X+ J! ~- O
6 r% J5 y) |' ]9 R9 \) W6 @0 O( @9 o. I. R2 S6 s# B
: Z2 t' K" C p! y
2 |% A% |6 I5 j6 u1 [$ X! }9 c0 P ` K, f6 f2 I3 W5 f
, Y* _0 j& e7 R p ! y8 K- q4 t" J% [7 R
$ \. _5 z6 p( m5 o
; v- w# f) s1 P
* v. d( ?$ {6 `2 n) O# p
( u `5 p, W" Y7 K 签名信息
4 D' W( ~# }! B6 G
8 O: z8 W/ \# ]* j: ?" C, |! U' ~) ~- E5 }( C9 u7 B4 s
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
5 ?4 J! ^2 R0 Q$ A
2 d0 N P' v! z$ q( C0 [3 H# t3 `% j4 y: s. d2 b
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
S! I+ J0 G, ~2 o- r
) R7 \( \( p7 j* a6 H1 W5 ?: z, G1 G2 O) o& y$ b
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
6 k% n% F1 P/ M9 n; s
! l) j% E) X5 B) u
- w9 _' Q" e3 X0 ^/ V % \$ s8 p; e- ~7 l8 G% C
6 g- W) _- A! \* g
4 _+ g# [+ ?4 a `1 p
# A3 Q2 B; j7 z5 u8 S
2 A9 |& G! X# `9 t7 n% f! V4 S
, Y2 P, f" @! T v6 P android签名的数字证书的一般都是采用 X.509的国际标准。 8 Y) T% m2 \& r2 b- `2 w
Y3 _5 u+ D+ o$ I3 N( @) p) R/ _' Z. `$ [$ t3 h* J
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 ( u2 y% ^% ~1 D
$ z3 Y4 A$ _* |6 }7 n; o4 f4 t/ j2 h
" o, q& D2 G. F/ k" l) c. Z$ \ 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 7 J/ g' ? i1 Z3 L& d% T% ~" ]
1 ^5 W3 q: m( b$ y2 y' F" r
: j v) `8 _0 n, A7 o4 j- a1 O
, H+ N: ^! {3 J, p7 S+ \ / B( a( R0 r" J4 J1 l# v
# j+ u$ |' H8 o/ l5 n; e6 v 2 ]5 ?1 f* M5 I% y+ f9 l, i0 P- Y
5 k7 a4 n" c+ U) c. j9 n; g3 e; q o
. I) Z& f) j% Y( a# n: _
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
( [" t, K# X; C ~3 b. V6 q
/ }. t* E L* a6 d
: j! E3 ~. n+ B
5 h- Y9 |9 Q! O6 z y
+ w3 \8 G9 @, `. x: B$ s6 x G
" V. A8 [9 R# ~- {- X3 x$ @ 、
1 k) V' _1 Z& t
7 V) R/ W3 Y+ |$ B/ U' U- ^2 o3 e1 z
0 J$ T1 E6 R% O3 G- U$ k
6 X' C' e$ E/ S+ S / D* a4 a' A0 f- u" B0 X3 G& }1 M
! e$ d5 d/ P. K% D" N1 n( v 权限信息 : |) ^! s! W3 m- s/ N6 b
6 t3 T+ a2 R3 {: t. Z+ @! @6 D4 _5 U2 F$ T
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) : g& `% v4 |( G2 L
# e5 i& J7 j, n2 f) u7 ^- N- P' j4 P; p' @% r0 N& d ^% ]7 U, `
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
" R7 Z5 j3 M/ e& K3 t5 Q; F& K
0 e: K/ ~/ J- R: A; f, h: p4 P p7 m) c1 j
) f! A- i6 m: ^* ]
: J- W- e! ]4 b e" Q I, V
7 w, j6 _" {! ? k- Z- d/ V
6 w6 i# M" Y- A! G- f- J3 ?
. G8 e. Y" y5 y. U3 b+ L# p" {2 R3 n9 a2 p
下面对这个APP的所有权限进行详解下: 2 s, b9 }) n0 @+ a/ f, }
7 a) N6 X5 ?: c' P5 m2 ]) ^0 `( u
android.permission.INTERNET :访问网络连接可能产生GPRS流量 / s. I( \; s" T8 F% a* ]
* q; d U) K a/ N4 A2 x4 Q; T
% H: ~& Y( y- D& c6 v7 C android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 ; m _, e; u- z4 c& w2 o1 p$ W# x
5 b2 M! \. [- [+ d
& s7 f7 P' M: j android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
1 I# F6 [" b& U
8 v+ w D3 b! }; q, E/ N! d% \
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
3 n, W9 G4 r: A1 r4 h
4 M$ C/ |' D* W0 v. z* r' T* H A" Y( E" g) Z8 Q0 Z. `
android.permission.WRITE_SMS:允许应用程序写短信内容
% t6 p; M! r* G3 V3 f2 N7 g
& C0 K/ `+ O. t# q" p6 F3 [* `% O; L" x3 N+ v9 l
android.permission.READ_SMS:允许应用程序读取短信内容 4 f5 @5 |. J. J% b$ u- O" x7 N1 I
$ B: J' M7 o; }; }& p
4 H8 x: a% \4 M* L0 S4 Y: _ android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
4 c$ B* Z; U8 Y
# v D% _7 l7 G/ D" H7 j$ E/ ^" C E; s1 G4 @- J2 W
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 . ]* n4 v5 M+ Y4 w: Q: j9 @
8 q" x9 Z' {7 R; P' Y& c* D1 P1 [& U. {3 o2 m1 w, {
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
* l0 s0 T, i! @- W S: k: D
! B' a/ D1 \& y# k( `( `# X+ ]) @ S1 k, B2 a. U' @
android.permission.VIBRATE:允许振动 " |0 I# V# `- W" \* ]
* O3 m& u. s0 A9 S( j/ }
. N( g& e8 J) H android.permission.READ_LOGS:允许程序读取系统底层日志
) [! t4 I+ w& R* P' I7 c . n9 }! b0 i6 `3 N0 j& P
! o7 B' [$ R7 i7 X
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
& N. i# K2 p6 S, `& q2 _# s: [( O
0 R+ E2 [- _& i
5 c# q9 F: h* H/ _6 ]- N
7 r2 y* C! y: q& l$ l" s+ H; K + S' \+ e3 }9 z: }5 A# R, n
% w0 [+ ?- C$ E5 b: J8 ]
功能信息
, X3 O. [5 u3 t+ ]) q7 a s & R' Q1 \$ p4 c' `
, Z! h* X6 A# A) V6 W) X6 B
2 U* p9 }- f, O$ K6 v( k& f $ S; N' v5 ]( b( ~! g
/ Q: P3 V8 `1 B& @# t9 E8 W
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 ) t. }' Y- Q# w* J# E6 P G' s
, c! @! b& f2 Q. O) P( x8 _4 t, r8 y, W% s6 E
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 ! z. o- O, o* k2 S# i
% m6 u3 `$ c' j
( b& S5 w& p* ?6 g5 V 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
2 f& K' p3 O% p8 ?, r " m; j4 O- }5 s: r4 c& S6 ^
( G- e" Q3 D5 F4 o3 c8 h 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
2 V2 ?* x' b- w- d9 Y: @/ w+ }
9 `6 l6 {) n0 G# f- r. k$ m8 _) c }; H0 T/ @/ _! l
. ]. @* r& E, c 9 s3 O- J2 P* t$ L0 @- T
6 ] a4 z) _, j4 d
0 [. D& E' b. x5 q - m% G# L7 C- P" ]
" Z2 N0 J1 ^2 V6 m 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 * {5 j- A0 j6 }* o
% Y9 H) ~. u3 v
. I r7 y6 {* u' |: B' }* m
- N; P1 U9 Z4 S4 t$ s; o5 X/ Q
: }2 c3 d/ O# [+ f3 E8 S- ?0 `0 u6 G% i2 K* P7 P2 q$ ^, }
0 l' q* }+ z2 k
) z8 }3 s) v. B' v# P
; R1 h/ m! V' Z# ^( K3 s* N# z8 a7 b. C. H 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
4 ^+ [# p! T7 U. ] 1 ^( Z" s; A6 T8 F$ C/ `
+ T- d. ^) V- n% @
- `+ ^- h% D$ N( w ) u+ q" K( q, X0 O9 M8 x
3 x' X, ]: N+ H
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 % m4 i4 D. I/ M0 Q% }0 {1 ^( {
: g% I9 Z8 W2 k+ k
% k# W4 R T2 S9 L& d4 V
3 m, F- B! k% }# f
! d% W! |3 g8 R/ a# m0 b/ Q2 [' A: P! K; k$ ]8 a; b
( [$ Q ]) w7 }+ q9 r0 T
) Z. j( }; r* d6 H% Z
, v: L0 g7 h0 L 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 6 Y- z- P, J# u
; |# o: d& P: h
+ Y2 i& Q- \- p1 I9 i LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 6 p; g- X4 A4 G$ ~1 U& X2 N) L5 U
) G7 @; X' `* J( s" |
, l8 H' }3 [. z, Y( w' ` 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 % A* l) D3 i5 E6 t
0 g6 f3 j, c$ m I+ }' e% b9 k$ E+ Y
) v- N; O% H8 L) @ 开源的luasocket代码可以参考学习下 ; q. \5 T8 t' g- x# t+ s
, ^* F# _" c& ^; p' c& ~
# j8 O+ N! d. s# i; d https://github.com/lunarmodules/luasocket 6 x8 q" a, k3 g9 t: j1 ^
7 d( X0 H7 l9 I# i5 g7 D
# F% C ~0 z5 j9 T https://github.com/fengye/luasocket / K7 Q \5 x2 [
, Y' A" H5 }, V* e z1 `- H! Z9 X/ \" }# O+ G8 L' g- b
2 H* f4 c6 u' G" h& K
d* v% a3 I9 G2 U" E
+ [' \) Z7 z! {% c
, k- p; w) g4 t( D" Q* F9 }: y. K - U- T# ^7 u1 {; j6 i" _) k; B
- @) w3 M6 n5 ]. ]- ~+ c& ~) F
; Z( }9 O5 G/ z* T2 E0 N
# Y5 }2 k: l; B+ [& Y2 ]- [* c
0 f$ o. _9 F4 ? * C/ q& `+ e1 [
1 d2 G) r* E: ^8 b4 a
+ L* e+ l, _9 F8 z' W 总结 7 G" ~ Z K& w7 S @( Z# a
& X4 D* ?" J p; e6 S
$ v y0 s/ `7 h5 F
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
+ D; f& y3 X) h- v 4 {& g& R- V: j* O
) Y! |! Q7 J% U7 m9 a2 l, O! n9 l
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 / x0 w) Z" Q6 E! N: G: v& ~6 Q
+ r! G ~9 ~2 [5 L$ N* i
8 r( { g1 T! K4 r& B# l0 R, W
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 7 F* m |/ Q# P T4 {' E
/ D9 `" m# T: c% l9 \4 }7 W6 N; G. d; w, G
结束
+ a; \7 S" j: R9 J
: ^$ h4 y* c( [6 n" y7 h
$ W) `& M6 A7 v) T# r, Z 【推荐阅读】 7 r) y9 {1 [. h, M) W: I
% `0 d8 x7 ~! j& Q( ~ S" x
+ ~- n) \5 l. z 对吃鸡APP的分析
0 \; e& B5 J- {' c( W. _ : Y2 d% N' E6 X/ y4 e7 [7 ^/ z/ O
2 W$ m5 \; C8 n2 [& L1 s
你需要了解的APP安全
: ^: M+ s2 s4 [8 \+ b
/ |# i, q O, b9 [6 {+ P
+ T. ~ J2 @; y! H! w 你需要了解的APP安全
* d( A* V6 a; j6 T1 t) N ^ 7 h: M/ b. j1 H" M& z( ?# N
$ L+ G' U0 `: Z9 m# c1 S4 Q+ E $ r& H8 S2 |) T2 d* C- ~& O3 S9 ~
|