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