- Q0 {4 m3 e/ }$ o" u
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
( |6 C3 t T/ M' i
% e7 j" O3 v# f" S! U
: L$ w" [) ] u, G" y, _, ~; z. F
# D- W# y: g$ C6 }7 W3 J ) i/ p* P5 N1 m' B: y6 E2 w8 K* F
1 g1 t6 ?! i. n5 Y$ v+ j3 D' E7 r
( u' i% y E1 r
- U4 v" D" d$ {1 M: n/ g$ I3 B; b7 W, a* R, P5 F) Y3 F# Z
下面就以开发者角度进行解析下这个APP的功能的实现原理。 * r4 m- W% u) P1 y1 E4 ~
0 }1 L6 j& `) S: ]! B
- J; b9 Z& v( l' Q9 `4 P
7 s. J6 t$ b* e$ |% T3 ~1 _ 8 }, b0 q" ?. f* C4 c+ s8 G
1 f% C+ L1 x( m/ \* R
基础信息 7 T% I$ w# [3 x- e
( j4 |' f' w8 L1 _. w% S* y& A0 f
) D1 f# k+ x0 M: @' X- q 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 . s0 l& Z4 M, ?/ A1 o. u2 J2 Q
' f- X) p: ~! ~6 U( R( O- i
1 M. L9 r: t$ T; E& d! ~
3 ?) l4 I. Z( i& r' f, d n f 7 r5 O5 k, j7 g' g' {
/ u" w/ s+ e3 B5 v$ {
+ ~. L- g8 ?9 i; }4 K " P8 z4 U6 \( c" a+ V2 \8 G
% Y2 f3 c9 u# n- I4 N3 X
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 ) s3 e1 p9 H" K: a/ _
$ u3 g; W, c5 e- I
4 \% f, ^4 E3 `" j
( u( O. M* S' j8 K$ x: i7 v' I( Q
8 z3 J( G2 O9 B% T- d$ \" U
1 Y4 w! P5 N7 m
5 D8 u: |6 I% W& Q# Y% |
+ M- y% ^8 S/ v! v. }4 ^$ I, z6 `# j O, e
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 , |: {7 |4 I8 [: ], r9 h
) k' g& i9 e9 n' }
/ u, a1 l$ U5 |4 z: P
( V, { @( @) L' @
, ]3 a# j4 w* s
! W7 Y$ M1 d+ Y/ E- c
8 G& S$ e7 p) U: L . v+ b% ^* C2 g s+ x) {9 m5 g
$ ?/ g! a& v" w 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 + j% Z' n3 G! S0 i" i
9 d% y8 U# T, ]: O) u, t' Z" \
P; K& x0 t0 o' e
. v8 n9 o3 N/ I* e
2 i) C& o, W3 o* v/ ?3 ]) P! Z
* b0 @3 F. \. F# k * B& ?9 Q R h& h6 {
) r; x$ j2 z" L
% C9 Y: G/ Q- d8 v3 t5 v* x9 A 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 / f' k5 j6 D+ z# U3 K- l% F
' a8 \; v$ R6 X6 B
2 o. L- U" v+ i& D" W
& k- ~# r& a3 G - P+ D' b5 k9 S" \$ d# }
w" j# P( J- d( d+ l: U
8 R3 P4 l+ M R, E% t2 p6 H
% J6 T7 V- y8 [5 u) H! v! F1 I$ P' k1 G
# J$ h4 j$ g3 R8 x) r9 l7 R: q
8 ~, Y6 q5 V. J* P9 d6 N! S3 D/ V/ o; x2 u
签名信息
4 t' u8 t, y! I! A, C
8 P; l0 r, j% K& O* [
0 X3 v- T I7 P/ |9 E$ K 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 ; v/ U/ }8 d& r, L5 D
+ E5 w$ J; T& i2 v2 [
* E4 D+ C/ X8 E 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 ( b, |7 G5 x& C- l1 s
9 \+ x0 T/ J+ K( X N$ v9 B
& p* R6 n$ b5 Z' u0 V" t: f- v: }5 w
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
0 ?4 ~) L/ N5 s. K
/ p Z! \9 l7 d3 N7 M% T5 t2 y
9 w- N. @% z; T$ z# f' }
8 [, i/ T( [, h4 E
8 d7 Y7 Y3 m5 U
/ k _. D& a& y9 {/ ~ 6 }+ s$ u* z7 F, J3 L B
9 J$ }6 z& {$ @' D# R; l. f- x$ x+ z9 Q
android签名的数字证书的一般都是采用 X.509的国际标准。 , C% `$ s( U$ l, b
8 ?) s0 P6 D# w8 _0 E
# @; `! u7 [0 G* S 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
' p" [9 D3 x d* }' @ 7 S# A5 S8 f L- x& y z4 ]8 R! m9 A
6 j9 E# K; k3 y6 f( I 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 1 U9 m) @0 A. [, Y i8 j( w
: H: s$ z1 g- `
% T9 Z; g5 j, _$ ?& k$ b/ E
) O. ~4 t$ D- D* ?* s # f8 d, j% N) r; H/ K
, T% N6 y; p' ~1 Q) o
: R, P+ _$ P. g: e4 Q
) Y' {# T. f; f. k5 n
* h7 ^/ u6 F0 ^) f+ Q* O- s6 C
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 ( h1 P' F5 H4 r) P+ c' M+ Q
) k" @( L, @- i- j7 l+ o- A
: H7 m+ k5 C9 R% C2 `' v l 9 J+ g7 s4 ?; W, e
- c( ^( ]2 @) t* Q+ t: m
7 N. Z. c# y: z# C+ ^4 U 、
: {' k! b. Q# M4 B7 U1 p$ p @4 M. j9 m) Y6 p
x @) \5 Y1 } `. u
! A1 ~3 V/ v( u$ I! u4 O# R# `
4 {5 f9 a5 W5 w# m, u5 r7 g
" g+ ]: G- c* s% Z ~: y
权限信息 % q" I- \$ b( [7 G
1 a# s- K) m# P+ q& f3 M, q
6 [; E1 ^# `; i/ t 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) ( z1 T+ R& p0 `# Z$ s. t6 G8 ]; q
. \9 Q# D" V9 i; V6 f& h& M- @2 R5 Z" O9 X- x" Y- P0 f
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
( z0 E! W/ g2 U9 j9 l$ D5 { f" @
4 c. @/ d4 w' F( W; l- \$ u0 u# E/ X2 G. {, B
" h% Q' Z$ V }* C
: Z" H$ ]8 k9 E- a- R& r
' t6 u( b3 f0 w
# L$ H o! `* a- k! x( [6 T
Q; N1 o! E. X+ L
h9 t. K! |6 U# r% m0 K1 l 下面对这个APP的所有权限进行详解下: 7 d. k0 v. F% s- W q
8 A7 j' z) U" r9 Y% |. q
2 m$ D4 h' I' ]1 A0 i+ V android.permission.INTERNET :访问网络连接可能产生GPRS流量
s3 f0 q+ A, b; ^: m0 _8 m
: L- r4 ?! }3 e0 L$ ?0 _9 B! M3 i- {& A* K5 |. s
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 ; i6 k' @3 L1 X8 ~ P! A
( p |- R9 Q( b6 `1 s
- i1 m4 n/ C* j5 T+ H3 K7 ~5 [
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
; d: Q+ {+ m8 v; l5 }# v
+ ~2 I9 h" F% {* ?3 y8 I/ x1 f. B3 D5 K* M" ^! G. F+ R) c* o
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 0 M0 x8 h+ L i! ]( z2 B
% s1 m% E: o/ K C: |) o) B2 O; `3 r: Y
; W4 \$ D1 W0 k- I) o+ z3 V android.permission.WRITE_SMS:允许应用程序写短信内容
7 m# y" m8 ~) Y% R: a; r0 n
' W" T# m& y0 i& Y8 R4 D* {! f( u: |3 D. T, W% a4 s4 N$ Z
android.permission.READ_SMS:允许应用程序读取短信内容 : M9 k5 Z) u! B7 B: Y5 i! r( l
" a. N* o/ Y* E# i; f9 ]
# |) x$ H) g* }* D( J6 ]
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
4 K3 M* j0 i0 m. L ! b4 E6 I7 D+ c. K9 o
7 L. q, I% {" o" S2 D android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 - z( G" Q0 t' X( T. g' }0 v9 C5 p
7 u1 I% Q" ^5 `# X3 {1 h# k( Q
8 X! K2 ]7 E, e0 z android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 1 p2 d* N2 f. s! g
6 b7 j" f* b9 Z0 T5 s: P. ^ p- q' k
5 T4 ^1 _- F! q: _( H
android.permission.VIBRATE:允许振动
6 e, _! J+ {$ [0 u6 H( ~* Q
4 y3 E2 `+ f$ f6 u# }
5 N+ W7 \: B+ z android.permission.READ_LOGS:允许程序读取系统底层日志 ) y% r6 n0 F# m/ z+ p
" F$ G: ?9 [( Z
1 R# Z; D3 G# Q( O
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
- N& d; l5 W" T& G
/ f+ `# |- D& o0 E" a/ U
# Y% N; g F, U: r 4 A5 p$ f2 w% j% V1 |6 | F, R8 q5 t. L
, `/ \& z5 e7 H9 q
& ?4 T. @0 s1 Z0 k$ v 功能信息 * q; G _1 w* j' l, g0 _0 c% f+ X
" s2 g- i/ _& i9 u8 [
; I. f S- Q" P5 p
& A- I6 _' ^% ^ 3 \8 @: W: }6 q) T2 l5 ^5 B
& S4 \ P" u5 T7 H9 i
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 5 V0 q+ n$ ]8 @
( s( J. ?% C: w- L' {+ A' j7 Y! o1 f: `2 x) [' S
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 6 r9 ~3 e1 h7 J9 X+ B4 t
; a W( l. V( d1 a
7 ?- T' U; U5 C9 y1 b" L- x v
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 4 Q7 L' o' H4 H* |
5 T6 K' F5 j3 b7 ]3 p
8 U1 _$ t2 ^) _' X9 B3 c' S 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 $ l: j- s9 B' p/ ~# Z9 G- K+ O* P/ R
7 n4 Y2 ]( \4 j$ N- f9 g6 j( W
* ^- H6 ?* e/ z* u* q s |4 z
) f6 W B7 \( f4 O+ A* G
$ E5 G2 D9 Q4 U, S( Y& J* c) J$ t \5 ?8 U2 {/ S6 S+ L
# \0 u- F3 k' }: c8 ~6 w
0 l+ D" w$ i9 z7 l3 W4 L. |6 e
. V0 w" X$ m q7 q- } 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
# r8 e6 }5 Y: x6 F/ a9 C 5 S6 t B, U m/ _! [) y& e/ o' v
* }/ e; u7 r( ]; O
2 G [% i, f" [' ~% S : p/ E+ c) I4 ~2 z5 D
$ t8 Y& q! m6 O% T ; b M& Q. x- G
/ F( M* v/ s0 ?; i" F: E' R
6 Z( W7 E, Q U' { E4 w* @# F 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 % T/ F& Z, N) |) P
7 Q/ { p5 _7 F; A; I# C
/ w5 q/ n/ ^5 P' a+ B4 {7 H
+ H5 N, N0 E% k$ n. c- O3 ^6 u
" i! r: X1 W7 l
- w$ b: {3 g# ?+ K) x 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
4 ?/ F( C# n5 e- ~5 ^, Y9 |+ D& h " d3 W' j1 p$ s, }6 n8 v" A& j9 P
8 H! z& C6 y1 H- h2 A3 S8 M: @
4 ^3 w( F- \5 ^' b" A! E
_# u$ V2 K6 J* F& I# J& k% _- k6 }9 ^8 j* W3 f. k
8 E6 j$ Y2 M, w
' z" `# M* ~1 j4 L8 U0 V1 Q/ W. q, X
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
8 R- a; @" T. v% x" M+ `) m " q# M8 N3 e7 x& n
* K4 `0 H/ ^) k LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
8 p" L3 w. `4 v9 A
% S' l- g0 K- S8 |( Z, `+ m. J
1 N, e) ^3 e- H8 C) X/ |) o 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
0 ~, y. J7 J; k/ l/ e. W. O 5 Y( T3 P( i* O4 A! l" V
& G; J6 \+ n3 v& w8 h7 n
开源的luasocket代码可以参考学习下 # G: l" q" A* ~( }
1 j9 i; A2 w |, z
. {1 R6 V* C3 J. ?4 Z0 e https://github.com/lunarmodules/luasocket / v! T, [! ^5 `! ~, Z) p' ?# Z: J
9 l {1 b( B+ g5 @5 b" J6 e
! x3 f$ z4 h: e https://github.com/fengye/luasocket
/ b/ v4 e" b+ @9 p 3 r: r. q% L3 Y+ \4 p2 W
7 {9 _) W( Q" c: a8 P" D % s1 ~0 C) n- W2 q! M( |" ?8 Z
+ |3 V! z# n3 ~0 D8 Q' P4 `% {: P7 l
) E% i% G( v- b# m* h7 j
# T1 x: g- ]' k$ O
+ J0 r9 @( {5 b
[' V0 q: ?# N: l
6 n: f* ?+ a" |8 w) t" r# Z 5 v% v9 ?5 y5 C7 H8 \
3 W9 I/ l" f" k, h" h4 A
' u! w. \0 g$ g' p
. A! H' {+ }) X9 ?( H) u/ s ^$ y. L h4 P% n# i
总结
' l( y, E) z- ~ . Y: g; u( S9 l) V- r
3 ^# c! v) h+ Y
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
0 m" r4 {9 ?" b: R8 i: ?! y% m0 X 0 Q8 T# y; ~$ n7 p; d+ V: j
/ y; F- @9 n' }* A) g! ?
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 / R# M/ Z5 l8 E" }
# J- \3 H3 t. H. m5 `; w$ h+ a) y8 y! u6 G+ c) v6 P; `
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 1 U! ?9 R6 U1 }1 w
' f& a6 L% V" b6 U ?" W8 T$ V. d' q( ?$ t5 j+ C
结束 n* g) w# w; i$ W7 I
! k4 K& Y: j5 ~6 p' ~) }1 e
4 J6 r5 E6 w; y3 z! w) _
【推荐阅读】 8 H9 u0 D' }+ ~/ x9 L
& w7 Y# I- F c' l# [4 A! v
$ q7 ?: }* x9 V
对吃鸡APP的分析
1 r ?6 W, u8 T+ ]2 r/ q; G
, s* ]/ O' d+ z
* c+ N* f G' m0 k7 J/ d4 i 你需要了解的APP安全 2 t( d9 Y* |0 ~' g( P
6 Y6 t' u" ?6 \$ O
: Y/ a! N! E3 q; k 你需要了解的APP安全
/ [7 h# ]. _, Q6 X4 P6 ]
7 r e& u7 L$ z2 G! k Y! p$ [& ]: k& Z% y h \2 v
. f7 i1 \# G7 ~" S; R |