3 r* Y5 c, f: t9 ?
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
( I# S7 J* c& }5 u, a; a4 T1 C
' Y3 s2 s m( k3 x% d
: z5 r5 H6 q# g ( C- z9 E) X( b B, E+ o; u3 S. b! U
4 t. E, F; ?5 g" `9 I9 k) n8 V9 `5 {
! s( R$ f& w: ^# b: O, i
- E6 n* V' _* x1 j0 S/ P
[5 L7 [) `4 ~3 s 下面就以开发者角度进行解析下这个APP的功能的实现原理。
1 J/ Q2 m2 x7 c- Y- { * G# n1 f4 r# p. w: X
8 s( o+ Z4 l$ q* F3 u4 \
6 @9 A- P q* h) l
- g4 Q7 @0 |8 l3 \% a
, j2 v) n' V3 e5 G' ?- g( x0 { 基础信息 " T; S- K" s8 e- X m' F' \ `
; h( E* r# [- I8 B5 J, c2 z
" H. `. Q; P3 b( @, ^" s) x 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
. A1 `6 d7 l" D& _) b& E7 ?4 | 5 E. q% G9 @8 K* C( L L0 T' \/ o6 C$ z
0 l3 T" l# U4 m+ c, K" P4 C / D4 R Y6 X) F. m* W$ F
- B0 T4 S; T, J2 @3 R: G
j% S" M. ^8 ]& n2 U6 j
! e9 |, R& ? W7 p
' i, ~- c1 W1 G: c! z* [, \
7 P% R2 P9 ^( b; q( `) F6 Q 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 ; H0 m: d# i% g
! I& u& F6 G& \+ I+ J0 U0 g ^6 S' V0 A3 T" h) ^
" h3 Z) y! S5 t
3 @8 @, f/ O$ X4 q! a, U5 u$ _* h8 F6 x1 L Z' r* r
5 G7 |% ^# ~' \% _( R! r
# C1 h; C3 P" g' P+ K( D
9 J/ D/ h8 W; b$ d 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
- @% `# N, u( [0 g) f " k' `+ u! Z+ H/ k0 o& \# d
6 D& H: m; i t5 _) ~/ @- i % B |. l- x9 \6 c4 V" D5 \ {$ [
8 H) ]7 q9 ?2 U' I) O( O+ Y+ e
5 ]" {0 p+ Z- {% B* E0 c
$ A" B$ _5 Z2 ]& A% y5 [$ q
$ c( u( s3 z2 z- b7 s( w | 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 + R& g B& C6 b3 A" H
+ s' x% T- G& h+ E
4 t* {; q) i! o5 @% t' U% C. I
; N0 H) I9 q8 J2 i. i! f; B
$ x& p% h+ H% [( n' @' E
$ g2 w2 A9 \8 b" p7 a/ i - b6 `; C" A) n0 D2 `2 B. s
4 g) |0 }! V) U6 F9 y) ]0 L
7 w) Z' O+ @2 o) V$ r) v 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
1 N0 d8 `/ P+ |3 c* \3 g $ l% I& d0 O6 Q y
5 A7 c- P& i; V; g4 a4 K" \' [
) [7 t" n3 D2 p0 D
- Z, \5 F1 ?- l7 C% E) d; t' X
w5 X" D0 y: l$ p, e7 R0 I
. E) B4 o! L$ T' N9 q - \8 t: C& T% J8 F
3 r/ i0 X, Z& e
+ |: B$ A8 k; q- J. u
) O. |! R( J/ P
* ? }# P7 i8 f 签名信息
- R# F% z5 J ?, [0 H7 ]
4 P' ^4 j0 j @% A2 T: A! `0 } |1 d3 @- Z# {
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 1 I, E& a2 }$ {4 \3 b
4 [2 ^. c! [2 X7 {, X2 |! `
1 C+ B! G2 s$ D7 W) a9 J 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 3 D. D6 Y" h _4 T/ o7 C
0 \+ ?# A2 V) o# F5 p+ A! [6 b
% e9 O$ D' `- L7 U 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
1 ]1 ^4 h5 E2 S' y, j" o ) R; {. T! |) n% p6 o2 r! ~2 @
g1 b. ], [9 v( k& k5 a; b
: T, Q) W& h9 M; F( Q : U% H3 \9 V( X# | g" h
9 v6 N. A, l% ~5 \4 ]# K
+ |7 n }/ ?- T" I5 t& W4 R
6 P. |; f8 m* w5 W0 I1 }
* V ]6 q* _$ w R0 L android签名的数字证书的一般都是采用 X.509的国际标准。 $ V& f- h2 Y' ]5 k* _, ~. p R, {
6 v5 E, ^$ U2 Z
T) ]% h6 w6 ]; k# \ 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
2 o2 U5 o4 s$ W$ Z) V4 ~' |$ q
1 J$ {: _4 y: t& S6 r2 V
v1 Z3 f( a w2 @3 ^. p 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
# n4 A2 |0 Z, f+ t4 g $ F/ X. O" ^5 S, w
# q+ K4 Y' j; ^- I
* W# ?7 A q) p, q
2 g5 R4 z6 ~7 Q) ]8 A; H1 ~) e
% X4 M S% {" U
9 s' _4 H1 B' Z" A " j- t1 y1 S; l
+ [ w; @) {* ~; h 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
- W( R% q' |( ? , r3 m+ m! \; s' _" e
2 z: B5 H3 ~) f# F2 A- ^6 N + R8 o. _; N; s$ N
H) Y3 y3 ~3 x1 u
0 }5 @* ~% |6 e8 t0 { 、 - @; A7 U" S8 r, Y' R" P* O
$ _- }& I0 S4 \& l# u4 g4 W* \6 b8 K- y S [# |$ E* {8 L" ?$ ]
2 L/ d6 W0 C) l1 N6 j5 N/ i
7 C, F; b6 }# V* `5 A# X6 |# _; L
; B; K0 u. m- j7 _/ x# v: _4 h
权限信息
+ H" H$ \* F+ o % X3 {; r! N8 ?7 Q9 R% B* v
5 s( I- {4 e$ D6 ?0 O7 A! r 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) 2 u7 m6 ~/ o8 w5 Z; u
5 R+ I4 B( N' ]2 q8 y* k4 v
4 _4 n8 W4 ?& A& o* p android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
: Z; z) `2 t9 O& S4 H
$ r2 Y6 V$ l) z6 V5 |+ Q% Q7 T
; j" u& |) c, i6 q* e5 c , Q7 R. y1 ^1 D5 s. a9 y1 T
& B7 G' a; U5 e* s* a; a1 ~
/ b4 |4 I+ N& x: r! J- r 3 |% r# P' x* n
2 b! B5 }. P/ b" {$ Y! @. Y7 _. O; j& |
下面对这个APP的所有权限进行详解下:
: V! M% M# v8 Z% S; f2 {
0 G$ g+ }- S; Z5 I! @& j' r: i/ k2 `
android.permission.INTERNET :访问网络连接可能产生GPRS流量
. k# E" S9 B w% `# L2 H) f
4 W! s. v9 _( ?0 c- Z1 A/ b* x, X, I# w6 a3 s4 d
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
/ D, R! Y$ v K1 \, ]+ b : p1 a7 U, N4 ?. s" P, \2 d3 C; r- |/ n
$ C7 J0 A5 ~$ Z$ Y6 |6 e$ h android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 0 o1 W- W" S. O; ]7 [( y" D
! }! s( s4 p- e" E! |0 j3 y2 S8 N5 ^6 A9 _
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 9 n0 S$ z; N( i- Q& p
, _4 @3 h+ o% O6 Z5 A& K( C: j7 g* s9 M
android.permission.WRITE_SMS:允许应用程序写短信内容
! u3 a- V' L# c& w- Q
/ E- Y p; i+ q8 W( d0 B" ]3 I& z0 Q5 H2 D9 ?+ W: o
android.permission.READ_SMS:允许应用程序读取短信内容
- G6 T* L( @: l* g% w C
5 r5 b" E* g- p. X8 x3 M9 {0 R+ {* s$ s7 W6 l% }/ h
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
/ Q9 S3 [$ Y2 _+ [8 F, x5 _3 V; g9 T, S j' v. k" V/ \
5 d4 Q/ V6 H2 H- G android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 ) d9 q5 J- F$ W
8 v* t) C: K' R; H5 T
) }7 z/ v3 w2 n$ r4 \& M
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
, k7 x% W4 Z- @% z! X, G. O3 O
8 }# ~9 M6 w3 c" l( A% @6 L+ ^4 ^9 Y1 I9 W; [9 [6 v
android.permission.VIBRATE:允许振动
! _. g; p0 j1 |6 v0 W! P4 ]/ | 1 g7 y. H2 a6 C. c/ J! \! R
! y I* L) M4 s& Y0 O9 m android.permission.READ_LOGS:允许程序读取系统底层日志
: Y$ [' j8 S9 f) S& t& x
) o; F: f. h" K/ Y7 X: o# U8 ?; ?, X* O; m" B& v
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
( O0 y3 A; ?& W9 C" g & z+ v( G% u! A0 Z; [: x
1 g2 {5 V6 x7 m# `! R
& G0 [* g& v1 |5 k
0 g( X9 |; l- l6 {2 _! {& F h4 _6 O: Z, K* W, T0 [. ?& }( R
功能信息
, r6 Q2 I: k7 I! ~. x$ D8 q
- z; M# B# l( Q3 H) Y
6 ]# c. P& i- \! T$ @2 f. L2 a 6 L; q6 B6 P I# e4 j
2 g6 V! ?6 J/ X9 G9 L f" ~6 }2 H6 ?
0 V7 f3 @! H2 V/ F4 d" u
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 ; [$ L9 b% {9 ?+ e
! O( f) ~: m' Z: X- w/ z- n: V; \
% u, x/ L W, C3 O4 V/ b; K* T Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
! t% ]) x _4 _! m: m! G q 2 G5 P! k b" ]4 A$ n% ^3 F" i
4 G& ^/ s/ j/ b 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
# o) ]6 E$ Y$ G! |1 Q" S
, d6 i; C+ p7 P3 }9 [) x, { t4 S( [ L1 ^6 e# K
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
; G5 f% C( P5 V7 k& a" R 5 b$ C3 V* Z, B" f
% {0 b! j9 w9 n0 J" b; ^
( j; J* j4 j! `3 Z j0 X
3 @: `+ ~2 X) V1 v7 z! G6 |7 ~
" p- Y0 N- u! k3 n# M" n& O
( m( ^2 R+ E- d3 _ n& P- W
7 p( x( c1 R! [0 O( f! O- _3 I3 T
+ g% o2 q0 ~) P+ v- H8 |. b
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
2 L" v* O) j+ ?. S4 j, o4 a
/ N* d# `, Y7 _/ o6 \% @3 t1 Q X, s- E
0 D. N4 y. P8 H* z% T
# l) y" q- w- T7 S
, L4 Z/ c) {% n6 g ! e0 b a: G6 R2 N$ Q8 ` A I$ `9 v
( U: a$ s! x9 {* s( z0 t* l
( y9 | b4 u7 w- ^ 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 + G r" S! j1 A- l e
" W" U* m$ E2 L' S. Q, L L6 r
$ P i4 Q9 y& L2 w, f# `
2 S4 P+ l$ x' s8 @4 o: L 9 }% p: v z. w+ c) d
( M9 v$ K$ L2 j. m
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
+ |- n- m4 X5 j2 {& J) [
3 q @! E- c& t; @* s; E# l3 J, _* {$ f' K K
: N8 M' B4 C1 O9 x7 ^5 \ 6 |2 h% w) f8 x$ c
% \* h0 p' m: z% H
4 R- K: y1 R2 E( C( J" z* `4 a " S9 j8 ~% c0 y$ |2 q! A" _
u. d. X [1 g8 G6 N, B0 H/ C 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
1 o, C* X" o& {" g# B6 `
7 I2 O* w! h3 ]
; Z# }* \% j8 k LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 8 T- f# C/ P# g6 W0 t' q7 W
6 q1 }1 v, |. M; N. a# C9 _* V- @
) Z$ a- U0 l+ [+ P 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
* Z5 E9 d( X! F3 y, h 5 c+ D/ d9 ]+ P, C+ r+ ^
; p7 U: e9 |' l3 m0 l2 X
开源的luasocket代码可以参考学习下 - {# n% P1 o* g2 r. f# R2 z
) R, {$ `$ o8 [0 [9 G- i
7 I$ v( I" T0 S# f: y$ q( [ https://github.com/lunarmodules/luasocket 1 M4 b6 a' C9 l7 r9 V) a
, _9 P/ v5 i+ e+ H/ C6 k z9 C# c0 P/ A
https://github.com/fengye/luasocket $ I7 w9 B1 ]6 e& Q/ S, S# D3 \
/ d% s& z4 o+ U* f9 v. b# B9 h) |; ^3 y, x+ m' h# l
3 ^; c+ M( j4 R2 @/ l3 E
/ Q$ [8 d: H/ a% ~, d K7 b: j. }1 H7 I1 V- H2 I5 P% S/ A! V: W
2 ~6 i# p5 g1 u: Z/ ^. }) t ( w/ P) y' Z# `/ }9 \& [: k
& ]5 ]2 H: ?' K( B
7 `1 ]. b2 V8 l0 b6 h7 u( H; r+ y
1 j0 P3 y1 {4 W( h- C. w. K1 o! N5 [' ]6 B* G
2 d0 W/ a. x& J! m$ j I
0 I4 _. n6 Y) [0 ]
7 A5 l" ~0 N8 A% K" b8 D 总结 + V5 ?6 K; U4 p* X
9 U9 b" _4 f) V. {/ L0 @( i' W
; r# A3 \- V# O# d$ O4 w- y5 Q 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
: ~: F3 u3 z8 G2 S 5 s) ?. e4 |! d6 ?9 G9 J+ n ]
/ L, v( i* s5 ~. G 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 & I" n$ T* \( E t; m; @3 W, ?
" W9 w+ y; z# [% W, f2 g
5 @7 p; p! ?8 |# r* t8 s: A! ~4 C; g 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ; _/ T$ k; M0 Y! ]" _
) {5 G* ^: l5 a4 c+ R: f' I
5 {5 Q( P+ _ u0 t) R9 X3 T$ g& g 结束 1 Z! l: S2 {' g8 w' ?! P* y `, j
$ v: d' `" R% H z" g, m; t: e; y
/ Y9 Q1 {+ @: m+ K) z 【推荐阅读】
0 ^* _6 u" u4 [) A, } ) _( S* _ I% E
: e3 z R# Y& K# H8 A" s
对吃鸡APP的分析 4 T) S& G9 R0 u
8 e4 N0 `/ ~( f; P) J* X0 P& ]
# L' q% _5 M+ I! {
你需要了解的APP安全 ; w7 I$ X0 r1 v
. s. j1 u3 Q' V! y% l& }& \& M
% i6 C2 A0 A% J 你需要了解的APP安全
u+ a6 v, v, s' |! S* D ; q9 h1 e v- G
' O$ h4 c, h. A' g ; z: `" g" J* W0 H) n' `( T3 V+ r
|