' V1 q0 _5 `& R8 D# }
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 7 j8 h& G0 d! O3 n, O8 B
* m$ U* g3 e6 O; X6 s, _* S) Q+ a. F
/ l* q: I% M/ f8 Q: R6 n1 b
7 w( w& e% i# K
' [9 u ~& H, d: h$ W: f0 T, y& n8 u1 O N
$ q& @% u: B- d9 H5 p. j
; }4 V t1 a# p, s7 m1 G
# i! u( ]8 J/ J' d 下面就以开发者角度进行解析下这个APP的功能的实现原理。
7 I9 M: Q# t5 l3 B% ` . w0 Z; I |& N2 o0 I) c ?
1 l/ \9 U' \, w+ y- z" a) _6 | 5 o! O. a j6 E( G& ]' q2 }
8 E" O+ u6 p2 {# ~
6 P: N+ O% r! p9 u
基础信息 6 s& D) \/ C6 ?
6 c+ D( k1 C( v
- j+ E- w: Z6 @' I' [4 }
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
2 H5 T* b3 J6 {# S 1 [8 b- m3 \- w2 C+ ^
+ [, l( f3 U6 N, T
8 d/ P P& ^0 { H% e( ~' E $ q/ N6 s* O; S9 R( Q1 N% T
3 D& b% \3 }) {) y% b
& H7 C S' ~# A' P- S2 J* d X
: K0 y+ [( r; l6 ?1 {# I+ U6 F* y6 V
/ X% L; b& ~3 W0 w8 v' ?1 O4 f 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 $ T9 B$ u3 t6 C2 ?
6 T; U/ R, \7 Q6 }- |! M! X9 n2 L% @
. I8 B2 X/ P- V2 ?
' l6 i1 v8 J! t- ]6 w
& l8 ?2 B7 {" W$ P/ ]9 v / \8 z/ X& A% o& ?( w
7 _6 c2 u7 c, X7 L5 s! w! F7 A+ O+ I; j" [0 R. j) U
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 # D: g/ u" w7 k d" l
6 Z4 s* A* m* o
& }% c9 n7 x6 Y8 X7 A
: [1 K6 E- E- j) \5 p
6 t% H8 w1 K- a/ \' g2 }! A+ N/ F/ x" u4 w, y5 E
0 W1 p8 ]. ~* v
0 I0 i9 K/ z; p9 n7 k( i- k! |; `" T# R& C+ W
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 ; O" e& u0 T$ `6 s" E+ G; P0 N+ b
5 l) g; w, K0 ]8 y; b7 U/ {
0 |& D, Q( y. C; z7 I
1 c. K9 R- F) J! d4 Z/ o ) b9 K8 _2 i; G8 i
0 r1 L9 [ U7 z+ l
: q4 x) ?+ z* _4 k {. j1 E
8 B# d w6 ~$ }: n
8 C1 M4 @ {) D* v# s; @6 F1 ^% n
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 " O* k% B8 _3 |" m D4 E
8 O5 f6 p6 v0 `( ~
- t+ a5 A: @# Y6 Q. F; E9 n+ o: u# g
2 h8 n# p: z, b. o4 f 8 m/ F4 o) y/ H K
% k$ [7 _& `* T" M # l8 @+ I3 P& S: o7 w5 l
1 q1 O2 N' g; u. D) Y
% S, o1 f' K2 p6 b7 O
: u i' l" x% }+ L! B1 {4 X s) F ( m' C" v' h& J1 @: \$ _- c
' e. g7 N7 M- P2 L) t. v
签名信息 ' X2 t# v! G( R; C6 P9 f& j q
5 o/ P% G+ i! U! ]" @$ s- z) K5 o c. L
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 % O1 t: S) x: r
2 @) C( L! x! N: x. f. u( u
. H/ `; A- v. n7 l+ f+ l 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 : W* s9 j1 S/ z7 t
3 v' }1 k% m2 H J s7 d( ~8 }+ e8 Q/ v2 |
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
" N) I. e, o3 J" N/ ], I( A & q- r, K/ \/ ~- L, Q! i! a6 v
8 \0 H; F8 f3 u
9 m2 Z, L O! A 8 h+ `" R7 K' K( x' X; O
5 M' {1 b: k$ x7 g8 ]6 r/ B! X6 z
! F' [+ E( e: V' I* ~ o * L; g4 K V' ?" h" ]0 L
$ \* f& W0 u- T [ android签名的数字证书的一般都是采用 X.509的国际标准。
; `9 X4 ~) q: E6 |5 u; l4 {: O( S % F; n7 D9 s! O( B# o6 t$ ~) K
( m4 s L1 v( u/ i# c" w D
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
. W7 Y$ S. w. k 9 X! j4 D; P/ z+ [
3 j( N! K3 d! G% w6 K6 |" C 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 , j, e0 M a) W& i$ g. m9 f/ H
% D$ [& t* v) ~$ H" N2 `6 F* C
" w# Z, r8 h$ E; g ( D6 w5 i: T9 V' [2 q
( j7 f$ k7 g- \5 ?3 P4 y8 B# _, T7 J( `3 ?* X2 @. c6 o- h5 Y
$ m, T# L, p; c% i; z/ T: F4 f 9 d' C% x. g0 X. R/ ]
0 w" @ W. W' N: E8 r! A 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
0 E) R: b9 E2 A
7 E1 y6 t1 R$ u+ W+ P2 I' j8 `- v$ c: E4 e. V3 r' z
6 ^& R) j8 X4 r1 G* Y
8 z( P+ \3 e* T9 Y" f5 ]8 S8 E
; C1 \$ x" y: Y- p' h, C) b! s 、
7 Y( U c2 |0 h6 E, |+ O# Q; b ! v& s1 P7 j9 F
! A. x( @. _+ d 8 x( b* {/ z% Y- M
8 ~1 h3 J5 G/ K6 R: F& l5 K, R
# Y3 L# K' [+ Y( E' b5 K$ ^ 权限信息 5 M+ E. J: b b% w* K
0 O5 s0 `' Q) q2 ~4 Y% ^
( j; h/ M K7 E, G7 O( d0 F& G 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) & u+ }! P- x* ^" M! b8 u
; E8 R: t7 x8 D/ o ]! f9 w* N x! E2 y! r8 L
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
/ y% u k V. _- K2 ]' h/ e
3 Z8 G; S' R: q. Z+ G8 ]* N9 K- z% }
2 T! t$ i& o2 P0 H# w) X9 J, H. e
# r' Z5 n$ {# f
5 L! L1 O, [+ J* `" j" ]
h9 A0 G. Q0 p) Q i: k
9 B Z }9 p" d) A, Q$ j- F! E% c& [2 }; n! f7 E% i
下面对这个APP的所有权限进行详解下:
6 M+ m1 o, q/ ]! v6 T) M5 ?
: R0 A6 a S; E* G* C* i$ m
3 M# v+ L5 i% y% q: m2 ^ android.permission.INTERNET :访问网络连接可能产生GPRS流量 1 u/ P* A) R8 s, H% S
- A& n5 C" t D: F7 r* J. K2 g' N2 G# k% J; _- t3 q
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 $ k9 h& [, I* n! G5 S
4 n3 M7 |0 x" u% Y( V7 j" E# [$ s" p4 p* o* }* f
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
" B% r; z# w3 D" D' C& v& }/ [
5 a: e- T9 j% [1 H# `4 p' `# d
4 v' ]& _. m! f- i android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
- }. F% E, ~6 D5 {0 k4 m$ i
* i2 {# `" ?" p# V! k1 A! J/ H- F; U+ y9 m; u
android.permission.WRITE_SMS:允许应用程序写短信内容 * | w: t' \# F3 P
9 X1 j; u& w& y: U; t$ J1 ^3 \4 D* w, \9 A1 _2 H9 w" o( k
android.permission.READ_SMS:允许应用程序读取短信内容
) y1 e& P/ z; |. K1 n+ j: l # g9 r$ a5 @2 W, d7 s; u
: v5 i6 L5 P6 M& p: }
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 1 S- M8 f3 s" }
! n# I: \$ D5 A2 I1 C% {; H# q2 d S8 [
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
5 q' n# `7 u# l3 E* U0 j# ~
* U; b* t. h3 V5 f0 U
5 x1 j9 z5 b# X/ \5 e android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 + w7 x4 \' Z1 |* [ a5 l
; f0 r$ u) f! G4 Z- t/ o) ?) L3 j' ~( ^$ s1 v2 o+ V5 S
android.permission.VIBRATE:允许振动 ! ~9 Z1 u) A* @, G; J" V
" ~: S+ u9 g& `- \# f( \3 L
" u( L9 F9 Q# _% S7 q! [
android.permission.READ_LOGS:允许程序读取系统底层日志
o/ k) b) m, I+ u, `0 r: V
1 d4 |4 [- z- |6 Z' F2 d( \3 ?: Y1 ~) X8 h c3 c, Z
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 ! m2 J8 g7 l, ~+ M
" I& K- O0 Z% m2 `
2 F9 F3 U6 R6 R7 D
7 A2 w8 c% j/ M$ O
$ a4 q/ q3 Z$ j+ y( w$ ~! S/ Y! z5 p& H; u; e0 M
功能信息 3 ?7 H7 Z L* t% h b, b" s
( Z( q, u, z! U4 P8 z
; s0 D* Q1 q1 V! S6 X 2 j3 O. c- W- B+ y1 u8 ?% q
9 b( N" @5 Z% ?8 W" y& O$ v
, F1 G) d Q8 ]3 G 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
; s! {# Z9 Z4 u2 u
6 j: ^6 J& J' A3 [8 j" Y" h3 U9 ]8 u! E: K, n
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
6 L5 p; K+ e, v ! Q7 y3 o) N- w u' {$ B+ }# r0 S! U
, [. ~" i D" s6 m 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
$ j: S4 p9 ?; K6 i7 s% T9 g ' _( n/ E1 a" ]3 u) U9 @
% _# }8 M4 N! m& Z8 s 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 0 `! k% r' r# \+ w" [
4 G3 E2 _% r* N- p, F
8 x7 F! P6 E$ \/ u) w& F
% _; c/ E. C+ T% z2 x
3 Y0 F: t6 z0 G: q! V
7 P' g: G* J+ Z0 p# Q; j2 `9 V % _6 T' N$ j" a, [* l( H) D
) ]- `2 L. m; e/ ^
% f8 n3 [% v% P$ h 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ! o% @2 y* B: f2 `7 b
2 v7 w% G8 W& S0 s+ h7 C2 {2 ]8 ~9 R9 i& X) C+ ]+ M7 b5 a
% F" o# U# x( C8 V% F6 c& E+ i3 o
# h3 b2 S# V R! b6 g6 |) w
1 C, S( l2 c" |
8 b' i% z& M7 D
. y+ C. [3 j$ D# X4 @. ]
- \0 \* A8 g7 y+ h: D1 w 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
2 S! h4 c3 }! K" v- `2 Z5 F8 `4 Z
" l9 P( w: L. ~" M: O& ?
, b4 R) u) J* R ]6 u! H3 H 5 a. t* X T4 F# I
0 h0 K! m- B( ]( z2 o; |2 Y8 r2 e& x
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 2 u; j7 m+ O' I, {3 C- r
/ @. J' V( p# d
6 B- _2 B w( Z0 B5 b 9 P1 H8 x. x6 a6 K' |( o; h
/ g6 G6 v4 l0 O& N9 W3 p
% F9 K1 f6 B% x6 Z) @1 S ' k: S$ N7 @6 R3 L
! b% r2 c8 R+ `$ U9 V4 V# T" H* m) N1 Y! k9 r4 M
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 % g$ B1 f2 u, s) u# Y
+ v& _+ k N; u5 K# z5 y" I# {
; j! m" ]- O1 Q LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
2 `3 w/ b" M. R: u+ V
* W0 s( N% D& @3 N; S2 \9 J% s- j6 i8 T
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
3 `: U1 l# }0 p( p" I5 V/ |
; p4 K1 x, v3 L/ `" h7 l
/ u- E1 q( u# U 开源的luasocket代码可以参考学习下 : p" ^1 a$ U5 i+ R- D# Q8 m
: n% [) O% C, E6 Y
7 W6 m3 G7 k2 l! v* ]& v# D https://github.com/lunarmodules/luasocket
. L' f. ^4 v/ p3 w$ f( ?% R; ^6 g O- Y. o$ I4 s; I; [2 c6 P2 ?7 M
b/ r6 `% m1 p https://github.com/fengye/luasocket 5 _4 n# M3 d0 C4 b, Y. ]% h
! P2 v9 X/ o% ^: y" A! c1 E& \
+ G, [- S/ _7 _3 E; n( \ % c5 D5 K; i5 K2 q
: B* s5 Z' ^) v" _$ r. g4 K
" ]* b; b/ ^" b- h& L ' |! t/ U0 F2 Z8 Z. B2 l
/ a$ O2 j3 g) `4 a g# e r
- A; D& l' [& W
' N4 J6 t) s Q' o& q7 ` ' O- q* H; ~# z3 [) m) R0 m
^# D% j/ J) `
, T' x7 I2 S, x" F% I+ t& o: L
- H7 _+ ?1 l" H; o
& b4 g2 ?( r4 c6 z! [( ~$ {
总结 1 K. n# G2 P, |# @* c
* R# x- a' Y2 |5 t! f8 V
/ J c- D5 s3 S! A1 k
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 ) h1 C( x* _. \ O
$ r7 s7 x: w& `7 u4 E6 p) k
6 f" r8 R- T% ^0 { 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 % W2 Q- ~8 n# i$ H3 |: u J
: D+ ~0 ]" l U! X U! F, c
8 d3 L4 e! i1 @' o# p u
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 . s* G5 d! ?2 x% B( E& S: T
x1 _+ Q0 R( m2 R. K: Y( y' O
$ g% x' ?9 [; G0 A( O3 _ 结束
1 b1 T+ l* v0 O& O. b$ a5 @
c! i( W$ G! L) d" d# P n
- o+ F+ {3 D! _7 `4 R$ j, z" L 【推荐阅读】
7 ^' y4 t5 S o+ B A . `: x8 L% O& }2 f/ a1 t+ I! ]9 L
, k+ J% w/ w& k3 p2 {* e* o
对吃鸡APP的分析
# n" |8 B" ]" B: x! V
8 Z% {# m; k8 g# S
% q& A9 g1 `9 ~0 j 你需要了解的APP安全
5 T8 w+ m) P% T/ a5 @* }
- _6 `2 G! H6 Y8 v/ q5 Y: `
" }+ R4 O* r! a! q- b. p 你需要了解的APP安全 6 I, L+ Z) K0 S$ U7 g
/ v$ Y4 Q4 u1 ~/ X* V
/ @5 U: B" {, m! ^6 ]
7 f V+ u& e% s/ P4 q; @' c6 v: G8 L. n |