9 i* V* [6 q6 d4 ?
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 0 H4 {- L4 W5 Q4 R" I& u
# u2 E1 T0 ~" C
5 D* f& N9 F1 Y
7 J7 m3 T3 V& z7 x! z( Z ' E0 [& T$ ?. p7 h4 r6 Z% b- r1 E
+ |( S( W8 {) Q& J4 I 7 |! ~* z3 r8 I6 Q: x9 K
" P2 y/ M( f/ \$ c8 L6 X1 `3 }' B) k
下面就以开发者角度进行解析下这个APP的功能的实现原理。
# @1 I8 r/ ~1 p$ H: s' k& o; Q ! {; b+ K1 n8 ?# ^
) @% Y& Y, @1 N& H# z$ Q
" z: i9 f- @) q5 Y* U
) T' L) [# t! m+ R
# @8 Z9 J% V* _0 [% w7 w$ C& e 基础信息
6 Q6 u7 X4 l5 `. Z3 u7 e2 A
8 _. ?9 m9 P; J3 N6 p% C
$ r, O+ R( P* I* E! Y7 S, l 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
* q6 U, n+ i, y4 X
* h; k) _, w+ P+ K. Z5 p: b
$ x8 ]8 W% D' @: q X' Q& h* c
9 `8 z2 y+ R v" Z0 i n
' V; s+ h7 l- S: |6 K9 z- k) k, k$ ]( W, R6 ~5 m8 [
, e8 t5 X( ^3 {
. ?; L! H5 |, `0 a5 C: H7 z% ?% k! k) n0 w) m, g7 _# M3 I
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
' _! `% {% P7 i ' r {1 n$ P+ g- v; s1 }5 m* w
# F& N$ {! U' J# Q ~: G2 K/ c : T% v: J+ _$ n6 F
# c1 t' `# w/ m& _6 \( A
$ ^$ Q* _6 C/ }: x
h, W* w6 a+ h; U) O% l " g/ |' i. l7 J1 R' x) e
, A+ o4 D4 O5 K' Y 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 " d7 h& y& z' ]' [5 N. e; [
# N' k9 i9 k8 E" a' [
; V# V0 u" }- H3 y- d 0 \$ B! n7 ^1 X
7 a' S1 q) k( G1 r
0 w4 q) g/ ^& t3 L 7 J, ?* n) d) |3 f/ K6 r
( i8 M j& Z& w* ~4 r" ]* N: N$ j, ]! h
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
) G% \: n4 I/ |$ p9 n4 ^ ~* q( R
" u, B, q( U/ W! Z% E6 @) ]; q% \7 K7 H' {1 c& E
2 e; q# [& ]: R5 C- l
9 F# {: h! |* e3 T7 T: X8 }
6 N+ m! L8 N# `' a
" R3 V' Q: s4 f2 d( @1 P & G8 Z% @- @; B- T M9 j& z
! J- e2 Q7 r. S# j/ j0 ?
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
* `0 d, o5 i8 g0 Z0 [5 M' C8 i * R& E2 M1 X1 e- d- t
' n0 I! f8 p8 x: L9 I
, N8 y' D. O$ a7 Q9 C0 B' n 8 V1 C {% i; H% E; `
5 m& U. q, G) @8 Q) L
2 ]8 O( F" E, i0 { B1 c7 w! y# f! \
" @# g8 a% u7 o; h- k5 P
& Z7 u6 l" M/ I8 g( S9 D
+ Q3 x/ B7 {- w7 f f: g0 J! T9 h/ z- o, q4 t$ c
签名信息
2 L, S- R5 z( T* c( p ]
! E- C9 n# O$ \/ s+ `! B9 T3 C- Z. E; K/ s1 j+ b2 `$ A1 N
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
: k2 B, H- T. L6 r" Y6 j1 Q $ v$ R$ r0 R7 t0 y; l9 A
& i/ \2 N& T; K. ^; z; I9 I
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
: X" H' X9 \. @- x( D3 k$ y
' U4 |5 V9 \, k' T' p: e* S8 }; e
: C$ h& Y$ J4 W! K, C/ y 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 1 r* p- U+ h8 V: Q& a6 }
4 o( \- G: K+ {
, ~2 q& _3 ~( e: N8 O y / M6 E2 t8 w5 S
! h0 A# A' o" x9 P- t7 ~
! U- n. [, m$ }
6 j' K5 w, M$ ?% }0 Q# M/ p/ K
4 ~0 Z/ J' q) k4 \; \, a |6 C) H5 Q4 S" U- d- s" y1 j
android签名的数字证书的一般都是采用 X.509的国际标准。
; e+ a. `& C7 J1 J2 `
! k5 Z7 l9 o6 S* I- g& t
" @2 n7 c" O3 ?- b! b: s2 M$ P 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
/ Z7 t2 }2 c. r" p
" c! ~9 Z2 K; ~: T
$ n" V5 R4 D" w 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 - u! }& Z+ R: M7 {! \5 o0 u/ @8 k. S. }) n
* y+ p7 @ p, ^. b2 }4 m1 @+ l2 o" T7 @: E# i( g
1 G+ L0 G5 p% {! b1 n: `' \ / F9 c5 T* z" {
0 `, Z. x2 y$ N) @ b9 H . R {- a3 _! A5 l. D) l8 q
( a8 B" }6 x3 j: l/ a0 W' _: r- m' X
9 X8 N! z; v, q) c$ ~& Q/ ^& d$ a) E 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 - k. I+ G4 m" r1 P9 O
6 R) `6 s3 {+ Q. |6 m: C J8 S
, s1 t5 u, R& i + |% }# a& {7 K G! a1 A! X- s5 K1 R
1 ]" L8 ~ @+ s& l( }6 K$ O1 `* W8 I m- `/ [& h
、
" H* A' [' D1 D, k. E) r. y % Y1 H4 X7 o5 W/ U3 t- T6 h. ^) z$ y
/ E7 G( `3 z+ m+ y5 b- p$ V 0 C; D. l* ^+ y) D
- g: i' s0 V/ }( Y. N
U4 V$ I. q5 q' _! x3 L* T8 r 权限信息
+ M! P" Z z7 T0 j4 F% }* Q . z0 q9 D5 B! @: Z$ J
/ u3 F+ {' y" T
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
1 ~( T& m- y6 u$ f! L |
: z4 f0 N6 ~8 w! z/ s! I; h- ^! ^7 D2 ] ]- _$ m" r
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
3 V8 I6 |8 O7 z* J" _, A+ \
" r. p! ]! C' i- b) O0 q) r) d/ y
, [. ?. s( j4 i3 }( F
% O5 a8 }! M' ]9 A& ^ $ h0 R. A0 E- B: ~! d
" w/ T# v% q. s6 N# A \: ~4 L" A# k+ ~ `% p& z Y
1 d$ m4 V+ S* p
( T4 X2 d1 K" z6 P9 T; w 下面对这个APP的所有权限进行详解下:
7 A3 I; F. D# _* c7 [
. \$ h& W4 k: @* o
z$ {' h- J, ?. t; ^6 d q android.permission.INTERNET :访问网络连接可能产生GPRS流量 ' ]6 [* @1 V4 X4 D/ R. |
- x' A' `' u) Q* ]
, ~1 J; i: a3 s* K1 O android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 / N& C6 F- G! c
4 X) b0 q. o1 _
+ q1 B. _$ I6 X1 R8 q$ J android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 5 o# W: S, L3 D' @7 ~
; V9 v, W7 B5 s
7 j- s4 }( t( K* n; b android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
3 s7 w2 _- ?0 Z) i1 Q
" l$ }% N9 C- w% Y; O+ Y0 \: U6 w2 F1 n
android.permission.WRITE_SMS:允许应用程序写短信内容 8 @( G/ B E; W' ~! M
0 o. B3 s4 k- F c& b: n! y/ H4 {1 W
( i- v* D' K1 b/ V. A1 t! G% q android.permission.READ_SMS:允许应用程序读取短信内容 # I6 M; a" h6 U# R
/ ]; y s6 G6 J
( F9 S5 s8 a9 ~% e; ~" j! |; Q8 Z
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
! L b, ]: s9 E, E+ u* P
1 `( j! `4 a, c& j; H
& s2 V% V+ D+ [7 K" y+ ?; ?: y3 P android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 % h. P1 _+ r! ~, h {% b) m% o9 G
) F4 `+ X0 x! w; Q1 h
% T* F- C( a, w m% G3 x android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
1 o8 ^& m7 Y: J* O5 J: }3 |4 O' T; g5 V * m# c8 ]# k+ `$ A/ D! U& F
4 d& t/ M- C9 {; z" B9 g android.permission.VIBRATE:允许振动 * u# M2 D" ]8 o0 T/ z. Y' \
/ e5 R9 j* R+ Z- o$ F1 E6 ~
8 h2 x- u, f2 w android.permission.READ_LOGS:允许程序读取系统底层日志
9 D+ m7 B0 |0 f6 A. g - J+ {4 n1 u$ m0 V8 s" ~$ [1 {' y
, ]8 N' }; M7 _# E
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
7 f, d! H& [. ~5 }/ D$ r. U6 q7 F
) y) u7 q4 f! B, C
3 g3 I! V4 e9 D9 f - b8 D( l) R$ v. R* e( j& r4 \
9 m8 M2 p4 ~: G+ y2 u! z
0 B5 Q' h- ?- O4 |/ \% g
功能信息 & C- f- b0 P, X4 J9 i
5 S: \: J8 C# {& ?+ \/ ]
# @# d* q* |& F, E) G4 L9 {. ]
$ x$ M" h! F4 B# E
1 q3 D' o# y, `& O4 T! F5 R% O' Z T
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 $ a# f% D! S5 X6 |. o2 C2 s3 s9 G8 }
( ], y- l0 f: X3 L9 K* a% P- r
4 ]# Q( J1 m4 m# l2 e% T( x8 d Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 # g; E2 Q0 a) f8 W8 e
: t8 i7 O8 A ?6 Q8 s N. M4 X
8 ^4 h( @# D' b9 y( | 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
) ~; ^! Y8 z' x3 j
1 |% c+ n9 t( ~! f6 F f' Y! `9 x0 C7 u& ^
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
- A. O# C/ ]6 o+ z6 V. O
% \' A" X' x5 `& ]+ _) x% Y9 }. U- D+ t4 ~! r
2 D1 o# f/ } l W9 I$ L7 P% W) a5 G
" R* h6 x+ |3 K9 A0 B! M) v& I2 i2 @0 c1 E0 E( S. s
2 g! U3 f* D$ t8 W
2 l. \9 G& g6 X1 m) |2 L( R# x4 J, j8 W; G* g
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ) e; |: }0 N& k9 b
3 B1 z5 ~$ @/ R& g+ T8 u
9 m _: w, M, Z* Y8 i
) }" x* S' c. h9 P
* c |# P9 @; f* _4 {! O( ^& }7 t: Y" n9 X
- a/ [0 G6 P& V$ N) ]' P
9 c) ^6 \/ c2 s7 W2 f' d
& p" l8 M1 z9 p$ q0 @ L" n
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 7 c8 h# e- M5 ?' w: g. W* z
' ]% s5 N8 \4 U1 T8 i
7 U% h8 G+ T6 d1 j5 u
4 G! {: f5 t: `3 ]+ T
% r- g4 q$ U3 `8 q1 i1 x/ W' \. l" q/ D) ~
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
) i4 b+ i/ J2 k+ E$ f$ w: y5 c ; c% s2 F: D+ N
" c, Q3 N' V2 k. a
/ I, f9 s2 G6 d
5 X4 V1 n( ?) O" F0 x
5 [3 q B C, D" g2 @; i" \ ' x* ~* p# S1 L! |# k
; a1 K$ S: g3 @( J' K9 M
/ D+ R# n" d- `' `! | j" m; l 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 " T5 q e; O# {- k# t7 L
/ o# o& b, K# f3 B
/ v+ C* t' G7 U6 V/ s0 r LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
/ G _ y$ h& ]; K2 U. D+ d, X( B( ] 6 I, \9 l/ M8 C4 V/ e, I( o
* K; i$ O$ K& c
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
0 t& X! Y3 t& [
' `. C" S2 i: Y2 \4 R h5 f' _/ C: B0 V1 [2 p0 f3 F
开源的luasocket代码可以参考学习下 4 o! r2 J5 P: L2 v! l" O) L$ v
; c/ ^3 o' ^7 P5 @# ]! T8 j1 Q+ @0 K
https://github.com/lunarmodules/luasocket $ A/ s/ c8 R$ @/ p Y) V
2 E* `+ m& j/ _9 B
. m# s6 U- p: F& K" w
https://github.com/fengye/luasocket
. e! m2 F; o, R6 o& w1 e
+ i! M1 S, ?! V& w5 [
! N) Z9 k9 F0 l3 ~1 K& G
5 T( t$ g- E* ^8 T' g" z2 e ! y( A. v% }/ W
: B1 l" _" G0 x( J8 j- N
, e* g# x3 [# L1 o6 O% ]4 }5 D
4 B# p5 G7 P9 J( E# c; ?& a, |) @. `/ c. Z2 d
: u1 A& g- p6 H, q: Y4 Y2 F/ G
8 l- S; s7 R, }/ M- Q/ S8 L( ^3 L/ i! g
) U$ ^! d4 m$ E3 Y6 f
$ X7 `' _ p& F0 ], |" T
% a" ]5 ~/ r! t+ o
总结 2 k! c4 t0 R2 Y7 R& C8 a! }0 B m
& P4 U0 M4 ^8 y
; l+ Z7 h! d3 c g+ W" S+ y! q* E 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 , r7 C; k) u. w! y; D
0 i2 {- `6 v* K% e2 r8 E. f$ w2 M
3 [ s. F) V$ }/ g; _% z0 q
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 3 s4 G5 I7 ]5 Q
c/ B% i# K5 v% t+ m- Z3 x. d! ^
% _' G0 v. f$ b! b. E 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
7 V" m) W& `" U$ G1 r$ `2 ? . v h4 n* T5 H4 R
) `; [; ]# J7 P0 Q0 a9 p; C 结束 0 i- A+ X6 J2 _) Z6 |; L
4 ]0 f' t2 Y& N# d, m! \
" z% c" D6 d) t" g' G
【推荐阅读】 - g! j8 d1 c. J$ h8 H1 u1 J) y% O
! E1 c; J( r6 W, Z
( @5 ?0 u6 w) t. _, } 对吃鸡APP的分析
4 u M; f- X- O) N* P : @% X" k, C. x4 V2 M, N
6 k) |5 C0 T5 A, [ 你需要了解的APP安全 $ E8 ^7 ?! G; ~/ L
) G5 q9 U8 n7 I ?/ k2 S8 c5 N- L; A- w' \: f4 |4 Q( T( L% q/ @8 {
你需要了解的APP安全
6 u! {9 B! g8 j7 f3 y6 P; s
! y* f* r- a) O$ o" \
. U% M4 X0 ` t. L1 } * P- B. K% g' j! k- M5 d
|