3 w' s7 d7 ~; n( D0 r1 W1 ^" U# I' d" F
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 9 {. S% l+ ?! j7 d& L6 S; A: Q# e
$ A& K# U+ |, H2 u1 X, H
5 S! y! f/ p' Z 8 }' k% s' G- _4 r
3 Y8 o0 I1 ^, n7 W! ~( `+ x* c* U2 m) y. [
( D' a' A6 F: H) A5 H
' e" ^8 ?) u, W T. H( k
6 m& L; D2 R; A" |5 [
下面就以开发者角度进行解析下这个APP的功能的实现原理。
* @1 ^% ^" N# o( W , p& J6 H- J: N9 W' q, D5 B
6 m! \, P7 a# X% t
; H% @: a" }7 C# L4 O0 T* B
4 ?; @9 x( m5 {0 U+ n$ u: s3 w2 e* G& ^% a% V0 g6 [0 e
基础信息
3 K I- k; K% k+ d6 g, T. I ! O1 e( l3 r+ f% d; e# M( h
+ @4 u3 K( Y' U6 b t& f& | 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
! j6 J- r: k; D* ~& G
6 J; {3 R2 q9 k9 v
; X% f0 E/ Z! j: u
. o' a9 ?. r: \5 i6 \
4 [5 @: E* W' u/ @4 R+ D
8 k1 m5 k! [9 |7 I4 X R) F
0 H# j8 k1 H: z* ^ 0 |6 U3 U6 T. q3 I" J. }/ h0 y
1 o3 _6 {6 s" P2 D 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
w! h. L; A- G* w' w
/ {& x: h: A3 \# [% u1 G6 R) ~% a/ ?4 _
% ~5 ~1 n6 T! ^# E' E
' i+ l1 O2 V6 z/ J3 z/ q- R8 c3 m
7 T6 n6 \, ^; G3 I7 y! q: y $ U, l2 m( t* R* J6 r# F/ k% n+ J
/ A! x+ ^/ M% G 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
7 a0 @4 ]8 R$ n: x% t6 ^% x- N : M0 u: i \ [) D& L- R
" n: W; M% g% m2 G% F2 M6 \1 f ! G2 P( ?/ b+ E6 [ O
+ _0 W1 L% r7 e3 K; p3 {9 ~: c! K8 [. j E( s$ U6 O
0 ~, T! s) y3 l9 r" {+ Q, `0 ` 9 X' P. q |6 p# w7 Y) @
o s, ~9 M2 ]* [0 i; s 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
% L) W4 a7 s/ b8 Z 9 H. W6 ^! S5 m9 g% W3 k
' Z3 a m; ^$ z! J/ q$ X9 e5 H! Q - v6 s) P. s5 V* X* P5 n/ `
# _0 L9 x3 t" ^' d$ _
, g$ D2 D9 |% p3 f
5 i5 C1 `7 m* t6 _2 M) j$ { - K, {- a1 G- p# S, A' j, e; I' O
* H* F G8 u. S+ ]
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
+ V, m9 g. {; G f1 X7 F . |6 J; R. W$ V* u) s
2 U6 C9 `/ ?; Z# b( t) |) c) r; P
% e. B7 ]" s& v 2 D, g7 @9 ]$ \' }: v" m+ |
9 s1 M7 Q% Z, g" ^( G9 E/ f
9 O* r( T C9 M$ \) ~: D7 a; @
7 a6 T3 L6 D6 E4 T
+ [# W$ g- H- r. ?1 C6 f
- U' l' b4 q. A& F
7 n9 U7 I3 c7 |+ ?% D+ S& k9 A6 a, T- G- v. Z2 C
签名信息
+ O1 H! f X/ l. P' j( h! U% ^
, f, Z% x# W0 w! Q- X* m& X4 }; {1 K
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
5 P. G# c7 `' ^' v
" ]0 @; i3 q0 b
$ e; Q! ^" c6 [) N0 |" K0 { 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 ( ~- y3 i4 x8 `3 k
6 M) {& W: R8 g3 {+ t4 w+ @
- q) n t! {: h( c; a
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ; G& d. F2 x5 N* U& F# e
/ H+ F" |& r' ?" u
: v2 s; E, \* u" D. t" G - [, \ K, B( B& S, j X' p$ g- \
5 L% }* m- ]- _/ z2 Y
6 g9 U# X1 a6 F7 |0 {. I. x ! s, w) E- M D8 G$ p
4 y, F* b6 f, T9 [ l, I' o
2 K9 p1 O: j P6 C8 Q s android签名的数字证书的一般都是采用 X.509的国际标准。
- B" G0 j# @- E# H% J$ s * g) [2 l/ l! ]( q
3 U3 M- @: q1 {* s; E; ^ 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
1 _6 u' ?3 W' s7 I5 V; S5 u
7 x4 D, B+ |5 V% P- }' c9 q) B8 o2 t* @8 b, A$ V& i I3 J' u5 n; }
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
' o- h: e- Z; r; x K* N
1 g! M/ E" E( Q6 q8 b% i" f1 y g4 B
: r/ W7 [# Z0 @/ P5 o $ ^& B+ E5 {+ u! u5 z2 D; D- h2 B
( ]3 ~* |$ v* ^' u( l. p
6 f8 Q$ Z+ B0 Y- W" L 4 C4 S6 T: o3 N! v7 x2 I
; s) y9 a7 O, g9 Z. \: M ~9 k* H6 R2 B
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
$ I, Z' G+ U. y- Q& E 0 c* i! w) }+ H- L
j+ a5 N0 V8 s$ P2 p" c
3 Z* S- Y6 ]6 U7 }
6 ?5 X! t/ N( [1 b- ]) E3 Y F7 P
: Q4 e" `# V: H+ k4 @' A5 I 、
/ ?* t4 o2 S2 P1 m8 m 3 l3 R/ N$ p4 f7 F% f* v. M$ M
% ]+ V7 C0 Y* C. N9 J9 G8 E
6 F1 F( d" V2 z) D 2 |3 }# n F( |! P+ e
; e% A4 F# i: U8 |
权限信息 2 \2 Q' C1 F8 Y9 C, r
" g# Z; P% ~& b
# J6 h3 T8 Q5 T* G) s: G
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
2 C; K5 v. S6 y) Y3 B% f3 v4 { : d! q5 b/ X+ ]- b0 G
( B& q6 F" X7 a+ n
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 2 p$ n0 z: H9 ]( Z
9 c, B* e* V/ K, z9 a ?: A4 g* v/ O5 o: M4 d0 w, e2 x
8 J+ Z5 x9 f" y( @4 M
* H9 S! g- Y' H' o# |
$ j, E' F: n8 r
: w% ^! y$ m4 h6 b1 u) d3 y / h/ E# M1 g: l: k. @: E* _' r
* @; U% ?. c: N& _: K4 W 下面对这个APP的所有权限进行详解下:
" M3 I2 W {# B3 J 5 ~" Q" X& W* z; ^1 w- r
, S3 W7 w) B! N: j android.permission.INTERNET :访问网络连接可能产生GPRS流量 ; [4 T: `0 J' k* j% n/ u- V7 j
/ r: R% H" ]5 R+ T0 N1 f5 s9 R5 T9 E# r2 P1 K3 B* c
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
- K: Q4 d% _& N" ~ * @: m6 Z. w. C
9 h" A8 [0 m7 ?1 i# f$ \/ t
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
; {* }0 e: f- L7 J2 q. |1 _ * ~0 Z* t( ^/ E/ ~4 m; V/ |. x+ c" x
( w9 K1 U( e1 I. g android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 - L, b3 d! r$ h- Z+ R. z
" j1 P, P% ]* d! X" |
& w- Y8 y4 n& Q' N: Y- A0 i- ^ android.permission.WRITE_SMS:允许应用程序写短信内容 ' m) d9 Q' o+ n- U
1 `# N% h: f/ D8 P1 ]3 ?
" T9 ^ ?: Y" c
android.permission.READ_SMS:允许应用程序读取短信内容 . G I d! w' h7 E
. @* b$ C; N* O; F
: t9 A# T- O) E1 B; B android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 % N3 `9 f4 `+ l. X0 Z
, P* O6 s' N" A, P6 X# X
4 [2 n8 q0 b3 t0 F+ }8 o: R android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
6 y- H2 p" m" W# B9 c. @) o . K+ G6 J0 b- t6 x( ?- [( `
7 a/ S* H& K- `! V H M6 \1 S
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
# e2 i i! ~$ F. D 1 B! s/ [" q; A. R+ O
/ o- g" p. `3 P& R: H' G
android.permission.VIBRATE:允许振动 4 `1 b# j0 H& d: ~# F b5 V
3 ]. M( L5 @! O. W e( r5 i( m) {+ N( `+ v( W
android.permission.READ_LOGS:允许程序读取系统底层日志 % w q Y0 ~ s; ~; X- x
- J8 J; _3 W, o
* \" L6 l- ^% K Q- [9 N
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 $ n7 m7 S$ G& z
) `1 r) s2 u: a5 l( h0 d
+ ]5 V# w. z; t + G, a( Q2 F" \" Y
' i0 h& Y; r4 O+ [) k1 ]
6 g4 g8 {, b+ i+ K4 U 功能信息
& q, I9 ~' z9 t, \- D6 L
+ @8 s4 `2 x* ]" g2 ?2 {
, q) V$ F$ I B1 o- V5 | 9 X: ~2 O, H7 k2 G2 U9 f0 s# r
% E6 |( x) |8 R! d4 }* T% Q! [( L3 Q0 G
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 5 \% x4 q" E6 P% r3 D
5 x0 Z: [3 u9 S+ s" e
1 a l' g. R( D7 ^/ V) R Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
2 X0 B: O" h0 g, z
/ t! w* C. Y; u- w: R2 _4 ~5 X$ |- t8 p# {
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 9 V8 D0 ?8 e$ S9 v
K: F9 Z V% y: u+ e. H
# h3 A5 i2 w9 u8 i$ B- a' L 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 ; [! x4 U8 [3 ]3 O
0 s7 S8 Z3 X9 `" ^- g
' h0 x1 U& r) I! Z' S
% S" T4 f% W8 [! m
7 i* t+ C% J, N( k3 B; F# y
4 [) a& u% o" I) b* L
+ [5 A% |1 s9 P# v* o 5 \5 k1 j! q" l+ Z2 y' I
/ k& X& X; I1 p; N: d 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 2 d% b% y0 @$ M
% o% j' A3 R+ h" B, F' z& `! x
$ ]$ i. c+ g: f+ P- k
, F, a( @! ~5 ?9 K" {8 S
' G1 A/ ]5 P3 m! f1 e: D
, s- V4 O# w4 @7 Y- f- J$ `2 L ) S* k9 X5 R* D6 |2 K0 y8 E) a7 Q. ]- i
/ s) ?. B$ [0 L3 |
$ `* ^& ^2 L5 s3 h
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
. c8 l# w: e! H, h: I) \
2 P8 n: i) p4 m9 @; T% k% V# m2 t7 V: d3 d
( \' T/ ? p% d7 d8 f
1 }4 a& h9 o! l1 ^
6 ^" _6 S- a. Z, D2 G 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 5 Q, f/ F& }! W, J# u: h0 j' O2 Z
+ i( ], q9 O5 L7 h$ z) ]& Z k0 t# ?4 Q2 q5 ^+ I
; a$ s/ {) X' Y& P 6 _3 M: s; g* W0 B* C
$ `0 z& h3 G8 T5 S( ]
$ e. e- \# l0 Y0 F, o, {$ I+ k
$ S+ |9 ]9 O: M/ o C: Q$ y% z! a3 U1 o6 { O& y/ A
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 ! Q$ x% \- Z# z: J8 |9 `6 i
% f$ t3 Z8 O( F! g0 {) i
. @) o& J$ R: E5 Y4 D( q4 o+ A
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
9 F% O- `# J8 k* S) f [- G, w7 ?: P
! E- m& [- E" `4 t+ f `6 B 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
8 i7 f9 M1 P. y9 ^ # D _2 T0 n7 J7 B
8 p7 Y/ P# k/ @! g. U 开源的luasocket代码可以参考学习下 ; p: S: S: @( d; n/ C/ I
" p* m1 q! [- L- \
: U1 H* Z$ A9 R @" _
https://github.com/lunarmodules/luasocket
! F" Y3 A- h. ~! p6 }4 h7 e' e/ V 8 B% D8 j( B1 a$ {
3 A* t% x& o" c4 x5 Q! H
https://github.com/fengye/luasocket 5 {/ I% [* f( q! c1 i
+ G# C# D5 o9 Y: q) Q
8 V$ s6 @8 t, ^ 8 C) _6 J* ]4 k3 H7 w3 i
+ a# b* n) J: m* I8 D
; {; `+ S' O" h5 O. J
; b2 r" k4 `" _7 n
* g7 F8 {# c; r H/ v: e1 o. f
2 n6 x0 _, e/ F; F; _, v0 T0 S " r9 p3 q. r4 `. E3 T7 g* o
7 D% B* s- z, p0 c/ I0 I1 c
; ^* {; P. ]2 _
c! j# u. q, h 2 i4 z0 F4 V$ b# V! O* _
! H. `1 `" H" m! I' U; Q
总结 / u6 | e2 e! n$ @
& e/ s J; G1 K# g# s) [
8 u2 G, _, q" \3 o, w+ W
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
& X# Y Z# d0 \% y 2 R9 d" Y% g% H4 L
9 c- B+ ~( n( S
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
1 {5 s2 }( s" W * W3 R1 L$ i& u
+ U p' m, J, T2 Z4 @; ~ 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
: R; b ?) K. [! A( m! O# }
7 x+ v6 J" _; _ x% T- x4 d" b% @9 f4 x3 T3 k, \) c# D. e1 i' t* x1 v
结束 7 e" M, J& |, e/ d! B
) N* k) h1 G" y9 x4 c1 [3 ?# \! y0 ^: Z# ?$ ~# p
【推荐阅读】 ) A# E* ^; o# z1 H7 E' @( J
9 e7 x: U& I5 A% e' ]$ `
" S: F/ q Y( u
对吃鸡APP的分析
: x, a# W: D$ P
9 _. k4 n7 |4 F i/ ]
; m" C3 p4 P" O2 z0 [% a. e 你需要了解的APP安全
2 ]- g n8 N1 d8 d- h2 I
. `" a. N0 K, \: [* N8 E
5 {$ ]! t& T( G 你需要了解的APP安全
+ J! ^4 q5 d- U9 {3 _& Y. W. y% U2 ]
9 J& ` X. w" G/ j+ \* j3 i3 D# s
$ g( ~ l4 N' n 4 ~+ B: F( w* m5 k- w" q+ K
|