3 V2 n) K4 L# a. d' P 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
8 @5 `* Q9 a$ Z! _, s9 A
, S0 l$ q) X0 T% v8 M5 M0 Z1 S- | k2 r' Q2 |8 U
+ U( d' ^4 g3 _ I
) i& A, z: q- i& a
: _" O8 p4 A9 u
! S4 U, ]! F; v% b' I
& F% B- s8 d# [8 Y* n$ Y8 c- t4 V# M! N6 b
下面就以开发者角度进行解析下这个APP的功能的实现原理。 |" q8 P0 X* }& R/ q3 B9 j0 Y0 j
% z. h$ h! g" y: J+ u
. a0 g* |/ @/ Y* }( s 6 [" J/ S2 f6 L1 d, J: I/ F V, O+ Y
, F" ]9 q& }8 d5 e! O' t6 o$ @
& R( t3 c; W" w/ U# B 基础信息
' P' E, f7 i: B; @6 d6 f
$ f, @% U, X+ | z5 a
! C* R' z# @, B6 j5 ~7 r! _ 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
S: X+ j7 r4 J- y p- Y) e ! d( z- X; t. G) U
X' M: j. ?' M% P& C, N) h! }' O 4 Z+ B: z$ v5 x/ d
8 {7 ~1 V9 N. m- I- B, D, L& P! ~7 \5 P2 A
% W1 y3 F ]) p2 o3 B, j
) q3 F% C# O9 `' X* h' p) i
& D( E8 H4 \" M; k# b6 {" }1 y 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 % l) Z" M# ]. V6 B$ Y; x( l! T/ x9 H
+ ] }( {- n- G) P9 k
* E! ^# W7 w( [$ O( a, d 4 p% S8 q+ W1 m
; A4 Q1 Z( }6 N- M1 l: N! i$ t
% d& ~5 V. i; k9 y" K2 s! u; v2 i
2 O! `4 ?: L* c* {8 r
# c( Z' }) p0 \
6 L- W) \6 b( H6 e K7 Z) B 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 |$ \9 x- J0 M
, k0 ?0 `" N7 O
/ L( R$ e# l4 A5 J 6 M2 j3 S; M" C+ _6 u. s, S3 H& E
: t- z% u" Y& K0 d$ `. O6 y/ x9 P; u2 |2 w2 X0 K. T4 c0 O, k
) @, \$ h5 r- ?# q0 _7 D7 N4 I
" I0 l! l/ Y3 I( p7 \: o
" d. ^" W2 d" s3 X6 s 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 1 q: y' d# s6 z) V W& f7 ^- Z
% i$ {; A o) w' \+ g0 ~6 Z( {& e
+ @* V7 @7 Q9 P8 F8 d! v _& a
8 ]1 h- R. X5 z6 i1 m- p
8 d% A( d; K7 H; j3 U- e1 P% X( u( g* O5 E2 q, d4 c! G+ r
5 I, Z4 {3 K; I4 v6 ]$ l4 Z2 r
) v" [! ~( T5 L. k( x3 [9 t ^6 Y+ j9 q6 E H( g
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
# R9 A9 C5 i+ [- R# I4 n: ?
8 \4 T$ Z' {5 ^9 v2 U% Q1 F. l
( o$ h1 q% `4 S, w+ Q' X " q, O9 I8 t" W6 N
7 f; F' O4 U) c. d8 e( I6 b1 c7 T
# `4 \& ~6 D- m: Z/ n & D- c- k U. F8 a
9 r% ?9 u4 l8 `1 `1 ~
y; k2 l% a% _: Z, I. }1 F
3 X2 A9 Z' U/ m) A, [' j: [ 0 ]/ q- y# a0 Z2 A' \3 G
P) V! V8 p/ k4 F
签名信息
; r n* b) M" W: V: R8 _: v ; U6 B- e* U, C b
5 d# Q( |( X/ n) U+ D& w% v 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
, S! t0 ~* o9 s8 {0 D6 s6 e
5 Q8 y! D4 B: V; T
6 a3 `- R0 A8 H 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 , e D( W4 K$ a: @/ l
: A n9 S9 x; P8 E6 l+ Z; U9 N8 V8 {( I3 L* U9 [* O3 k5 q
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
. f9 F* p7 }( y
$ n# R! L* Y$ ^. g% ~' _# q; i- _ N7 F) g$ R
/ ?* p0 i2 n% f" | 3 l3 c2 p$ ^3 `( c3 Y2 e
( W& j9 S- O% `9 ? 5 P+ ]+ F2 F, x) [+ t- o( z% o
- J) {4 F& k6 K: ]% B7 |( m& R7 d9 F' W: J5 c
android签名的数字证书的一般都是采用 X.509的国际标准。
+ v, x1 P7 A- Q9 ~2 {& _
# h" j7 Y4 m4 U# b7 a& X7 n* y/ c v! G
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
7 d( N) T8 j/ Y$ W$ t$ [7 t9 u - G" Q4 J1 r+ K M" i0 l
" ^* P ?) l# ?3 ?. c! `! p
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
y8 F4 x, c) N) V' D) }) ]0 y 7 w+ R/ N% g! p2 U6 G9 o
3 ]- f) y" t& M; A% n; s+ ~ K" `( r" s. e% d0 g7 E
( [0 {. _: _ L3 K$ L
6 U. g, M4 s1 X8 i
4 w1 a0 O# i1 T2 T8 H
9 M5 u& B3 {: s4 V- O, ?( `/ o. k0 z" _& Z H, c7 l1 A
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
9 g' D2 n: W: s l' V* b- j
2 a, a8 \) f- E0 I7 Y) Z
" k$ d2 n2 k8 j N! h& O
/ B# r( O) I5 P. }) X$ J+ _4 E 2 W/ P, x4 N+ Z
: A( Y0 c( h% j; U2 J7 A
、
+ C' x) V3 w/ [7 R- I
. J% c, \# h7 K, r# R" z% M( _9 V! Z9 X! Q P$ S
1 ^5 b* ?& u/ S% s R3 G 7 _8 T2 g3 {1 |7 i+ r
" b" Y5 q) i" {4 F
权限信息 4 s0 ?" V1 ~' R- s* ^
* M% [# A& N& l' m
$ q: N& k1 e* Q% d5 @/ { 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) A. [/ {: U: i# \( `
* `( O) [( t) Q$ s8 S' J
& A4 ?! U6 A, |; b
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
: i' O: Q0 u/ f8 e
- t! X. t5 G4 I2 p1 G* Z! W9 s* i5 n6 R3 p5 V1 @* t& }" i2 \) B" x
, j, { ]2 T7 ^+ g. }: a% h
p3 u5 h$ E( ]1 _0 b5 b, T
! U$ Y" C h" Z2 D# w' `7 N5 C
6 ?0 \. x& g- Q, X* ~3 e% S; k" H* F
6 o( Y& [( u5 S" q+ `3 g) m5 F6 @9 Q6 }" P5 D* b" P& E
下面对这个APP的所有权限进行详解下: 5 U3 H, I2 B7 S% D& S0 N4 q
! @- G3 B6 f9 ?% n6 r
& @# {, P; r* `0 K O3 h
android.permission.INTERNET :访问网络连接可能产生GPRS流量
$ t( S1 w1 z7 s 6 Y+ ?8 a8 t7 C' i
. N0 W3 Z$ ]5 i$ S/ U
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
+ |0 z& |* z3 U: @
- O7 f$ l, k, ^
# ~/ V- x/ L6 `! @' u8 V" \* J, ] android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
1 _2 I1 b$ O# t3 X/ m3 h% J6 Q
9 J) C! R9 [! v, I. F' f' A% x. k5 S5 d! J T
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 0 s' N5 N6 r6 U
# a# g Q8 P" e( ?/ P7 V
' Z. k& t+ X W% O3 w7 g' V7 N" A4 L android.permission.WRITE_SMS:允许应用程序写短信内容
* \# p; N! s$ {& A% T; v6 Q
% l, L, E* n2 {! f" B! |: K
$ H2 p" k# F: @+ N8 \ android.permission.READ_SMS:允许应用程序读取短信内容 4 ^: X$ O! _3 |& {
, p( u0 a1 l. k8 i1 A
8 |* i! Y/ p* R
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
: p0 P; O E5 l- L
6 ^7 Z1 Q6 G' @. I3 O& R1 Y7 f
3 l' P* a1 X. Z9 Z1 k X) | android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 4 @! _6 l9 z% G+ `7 z( s6 |
) {5 r. l1 ?+ |/ w
0 s# l' w5 E. v* R android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
% @6 h5 X% I/ p4 I9 d
, L8 [# B7 }" Z$ E% j1 a3 l) R: }0 h! L* D3 Q
android.permission.VIBRATE:允许振动 , l9 a# X$ m8 |4 p9 l+ V4 }
; D. T$ V8 `" ?+ w M) y/ p& G7 }1 \+ I
android.permission.READ_LOGS:允许程序读取系统底层日志
* x0 J# e8 K& t- G; X! o! B # e* P% [1 |5 U0 |$ y; }' y' B$ v
# {# W3 @. ]& w3 {5 R0 ~ android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 ( P+ e9 w% k# d1 {5 v
$ Q4 p6 c* g+ G( {5 O7 b& W3 m1 o: v! n8 c; U0 q/ s0 @
+ C- \; m7 \, C* g
4 A% x, Z: b+ P o
! O7 J% }, H) {" Q$ G 功能信息
1 u+ L7 u3 X3 m" i2 D # M% G$ ]9 Z% Q. g* I
& ?4 z: E3 b& h6 S( r. [0 z
7 O8 ~. ^2 g. R9 _) m% s, o# \& {
+ h' C+ d. Z! j0 G1 c& f' ]2 C. s: k; y$ G" J: ?
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 & y: J1 L" |& h) w- y
* R7 \2 _. V, `3 D" h2 ]5 q$ I( Y V
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 ) O# M) h; Q9 P w7 y. T6 M( k
' `' k8 W2 ]& Q8 N1 Q
; |9 Y$ }! X7 h3 S$ q 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 ( g) R; I) M) V9 [' I
$ a1 V K' b' I% g h
3 O% p9 z8 y5 A8 B 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 ( P+ x* }/ q! c g+ m8 @7 ^" G
( l4 ^8 g" b- D) m- M3 B3 q1 B% ^/ |8 k0 Y5 k: r; F n: N* S
* L5 z" A( j" N2 Z3 V ! W5 h8 [) T2 {8 J
: k: o) P+ ^4 K/ A; K, f% G
4 S$ q4 m2 K, K# X0 m 1 G0 Y" e/ W' F, y: \; \( B
7 G1 N& Y/ i2 ?3 H
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
2 |5 s: G' g9 M J4 H
4 y, F; h2 U* N$ E; C8 f7 }# T$ J& C# B
8 u/ P0 S S. E% B- l P0 W: J
1 K9 C7 U* u* a: r) E9 `% `6 Y0 X% E7 X8 ]9 U
7 J4 J) R% [1 r% ]& H# l% e7 @- A# }$ r
, v0 }. W4 i$ Z) k: S
3 I2 T! T; }8 n0 X' M* x
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 # l: ]0 [7 W9 a$ ]
# ?2 s% }5 N& P/ k/ U0 L3 M/ K- S: o( l- L0 b
: e1 ]7 G+ E- N4 a; w8 O9 A0 R- S
- q4 N. a2 {7 q- b: l1 V% D2 f+ T. l2 W; X
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
& K/ H- ~0 A+ F2 J
4 n- B: T- W4 p& z0 V; q8 s
* F5 [5 [: g6 L$ f* O/ E/ |3 {
8 j- g. x( n: P0 \: }/ p
0 ?/ h" }% B# j2 V1 @( b @6 L! I7 u0 T |
$ |9 U/ g) Y3 z+ c" r. x0 x: q : u/ A5 E0 h. ^1 w5 {
8 p( f2 \0 ~; a: d 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 : B7 Y e- m9 B. m& R. ~' u
$ Q& I8 n# v- D- q5 `
9 d- b5 t( X9 t) {5 S t
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
8 P0 M0 z' W0 t( ]' n3 U
9 ?" z& I, s, }7 R: o
, X5 R# z9 v/ s. L 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 - O+ I( @! R6 R- h% N3 w2 U' j
# y9 c2 \0 B2 t; X9 @/ F
% n/ Y: l. U0 }$ u
开源的luasocket代码可以参考学习下 : m" U0 g7 [- l* n/ q5 p
0 [3 p k1 k2 V# e9 Z4 X& t
, L$ g0 X+ V$ J' t https://github.com/lunarmodules/luasocket + ^4 y+ f* @2 t) H5 y; C: [$ |4 C
. D! ^/ k/ s% y3 v
9 V+ ?% \6 T3 [+ J" D* N https://github.com/fengye/luasocket
5 [& p# R- `; @( R; R. d- [4 F
; X+ U4 Y$ U' D/ F9 W
N# p6 l1 m0 {7 P + x: Z' Y" a3 L' N2 r- g$ L
( [( y$ {0 x* N3 S& J& U3 Y
# Z [& o8 r! Q, y* y
' [8 k# a# i% F* P; ~
" f2 ^6 j: D! }7 x; M1 i$ i
7 {, C9 q3 f1 K3 g $ a. q" E, Z, \( Q w% a5 `3 l- l& j
B# ]/ B$ l4 S1 e9 {9 Y7 g: z: o3 Z$ y* L
6 W7 Y' r2 C k3 a
* \! m# E# Q6 Y- \1 G
. J7 B7 ^: K' ? } 总结
: I5 b: ]' v& z3 F0 l. V5 f7 x& L: R % d) M, A: v1 @; E+ y
7 I! c4 q# D7 u% b- q5 r2 c, b6 E
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
. w7 I( M1 v- y: P" D; p
0 U% i: z7 O k& N9 L+ l- A4 F: w
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 ! G5 D% I' S( v
& `! b/ k* ]. B. M& z; h* }" @! \* @- @4 }: v
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 6 H N q# a2 \/ H F3 L
1 x5 [" q2 {* A
9 `8 g0 z* u4 L0 h2 Y' _ 结束 8 r7 a3 J, e I; b" F: f l
, e* r! V7 G% o% P( U3 ~* X) k/ d1 K1 u
【推荐阅读】
2 U+ Y& B* x L, I! P5 w* m # z9 |9 h- O& [6 n) H. }
: K$ X7 d" a; M2 ^: K' o& @
对吃鸡APP的分析 0 J% |( \9 O/ G2 L! X1 k5 ?
' N7 `" h* Y: m9 E1 A6 D$ l& ?1 c& f# `0 f7 Y
你需要了解的APP安全 : d9 B9 D/ q3 B; d# D
7 o( K& P& V3 K0 r. J) f: e
* k4 O! g( Z- }1 W2 @5 B# c: p( ^
你需要了解的APP安全
$ K9 N/ w' r K
7 m! m7 J4 G' e7 a% D4 l$ t8 ^" w
! ~! h) e1 w5 l# ~5 E- [$ E: ` # ]! Y$ r6 R' S+ S( q, v
|