; B3 W. {% }+ }7 n% ]
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 7 T/ S9 a+ ^ D* m) E3 O
2 d, r- \, y- s4 s/ @( c! m4 H* A3 z2 S( b* w) H
0 P4 ^) \0 p8 {- f J/ d# a
6 M: E0 d3 x- L4 r, e
- g" x5 K1 X: x- F3 i
% C2 X% F4 @) A7 t, s1 W : M: X" u- O7 n6 g" W5 q
- e* n8 P: ?0 g6 `" w3 ` 下面就以开发者角度进行解析下这个APP的功能的实现原理。
1 R' X+ N% v0 S( }; ~! e3 ]6 e
* m5 j7 Q# {% b9 \' ^. X$ @& g3 n8 x; g- x( u# j* Q
: t8 T* |, T8 a) ~3 q" W
; o3 O' P/ A* @0 Y5 f
& t: {# E7 x! G/ P" } 基础信息 0 ~% k' I+ S- x# @4 `
% m3 L! j$ _( q1 _
/ n/ K" x2 O- @+ d* j 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
( X" j5 a+ ^* |! h3 J# P
% U3 [' q! O' i2 I' x
0 p2 \1 y3 h3 e) t X1 I& i* q ) Z$ Z& X2 H- r9 D2 b
3 S) [3 S5 _! s; z7 L
) w4 K! A3 o- B% `$ U n
: D! Y) S7 ^' s* w + |/ s4 B; W5 G$ Y' G# W
8 e/ |9 i3 V I 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 9 [+ I$ ] \2 `3 j p8 l. O6 z+ Z
. n( _! o6 P/ v( ^9 ?/ Q$ |) x
( O& n- l' v! T0 l/ i: Y
+ N: j, K( [7 _
2 Z# `+ i; N3 z+ M6 g ~4 h( s" d) y' O/ b+ f+ @
2 }- G: U- S& c1 R5 K6 f
- X5 g$ U1 ^ p5 m3 V1 {
" N: F9 }5 N' a4 }8 g, b+ z+ w
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 ) W/ `+ }, \0 a$ G0 _3 N
; w( ?, H5 W& x+ E' v" X
* j5 p$ G2 l4 ]; P . }$ ]! y$ D% [9 X' _+ I
" I5 v& R2 m/ P+ f0 Z; u& r
, b) n5 b+ M* R( ]. }
( _6 c" T9 A' Z2 k+ f6 v, p: H
2 i) s7 T* L; D9 k4 s
& O0 C( _/ K( e# G& R* u- M5 D
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
5 y. j l& x; U! {$ @* z ; v# y: ?# J: B
3 H4 U9 @8 v) L; s4 E5 g9 c' R
5 y7 r' D! F! n" i6 j3 r2 h5 J4 _
8 Y7 c& P4 d' X* v" K' n
% k8 S! F6 `* p
! ~5 D) c- q2 L$ P - O" n0 T" L/ P* ?6 m
! ^+ P1 w k, Z* u 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
& j: A3 f% T) @( W: v. ?; b 2 l% v5 L0 A& w' S/ ~# a
3 k0 {6 F* N# _3 p5 k; Q
4 e$ [1 e( Y5 a. A- S 6 I4 v" C1 Y! E* |9 s4 X4 }; q8 {
4 f9 S7 p3 k* h. M- u) k; v; `
/ N* C, I7 ~0 o3 |% U
8 |4 E$ V" | i6 x9 y% k: x
- K, O- t9 K0 Z+ R' E
" I; g4 \* ^ J' P# N5 G
% X+ T' W- b* @# h9 u4 o6 k
9 M$ N$ ~9 p: [+ N/ h 签名信息 $ m8 H; Y6 Z% [3 |
& g, G! K z& U- L' A+ x
y' B3 q2 W; k; T3 x* h 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
- P+ r) ?+ p, Z- d0 y3 t. B
5 q. ]3 N8 t& D/ U6 ~: @( b9 V( ^ C7 i) O2 U2 T
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
) ~5 u) k7 L8 Z; Y5 D
$ {5 e6 U" l9 E6 l5 S% G+ r, S8 P
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ! C5 r- N$ v2 J' q
% V p# v$ J9 L
p- e; v7 g. j# e! G; J ' Q I5 {1 R5 m& `
( A- o2 J. a2 C) x8 L3 T
V: e$ K1 s7 o
l9 `! y- @& X* |" S$ B
" e5 ^' \2 L0 b# R8 _. l! q c8 E8 l" Y; N
android签名的数字证书的一般都是采用 X.509的国际标准。 $ U: m2 S& Q* l d
$ \" c O; d' f# k4 _! L
* Q% N) Y8 |& J
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 1 l; D7 t' N" E( Z
7 F& N, I* V# W. \4 a! U
. _9 L2 O5 J0 a! f i2 v" P
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
& l8 Z7 p! |) M ) J3 f( E1 z8 a" A A* n
' G; T' G! t3 w: _" x& k" @; f6 h- I- a9 ^
- P% ?" g/ t1 Q, v
; S, {3 |; N- @ V4 j* h7 f; f8 x+ z+ v4 j1 `8 i' G
0 d/ K" F0 y" g
" c2 {+ L5 D8 A$ Y
' {' n. V1 F% [% L. u9 L: V 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
* X& N. R1 g, y2 E: R
8 H. j5 z3 v$ L
4 q3 ]+ b+ T( C; y
/ [6 u" ~: M+ O( ?& J
- ~; }4 ~) ~8 q7 ? B
. S. J4 y! o7 ?3 a) p1 w. i4 T$ W 、
, ~: K- J8 s# x% r' E( t9 M + |" {+ f: B; u' |
/ x& r. w: x$ h
9 I* A" X5 s R4 R7 d3 \" A9 L
+ A8 G! O7 M# D7 j1 ]9 s' }- }$ {$ S' W' q# y
权限信息
; n- D; s7 c# n" }# g9 M B
0 G6 t5 D, I8 P R& h
5 z# C' e4 p2 e& p7 E 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
. j8 [# @# u( H" h
0 Y8 M+ w: u j. t8 l# v+ g v" H
6 F( x/ |: H! i0 b android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 ' h, }1 ]% B/ ^9 }2 s* o
4 _' o, e7 b& h( ~& v* J L: e: b3 S
3 V9 I1 b8 A r9 o4 Y
7 T+ w' Q \% y& ?6 b& ^6 z
0 {+ w+ ~! T7 u- w! @* v; h
5 h8 `- j" v# b5 ^; p1 g 0 G" n& w; h7 ~+ w# o2 q
* l+ s/ V' g4 c" `7 B 下面对这个APP的所有权限进行详解下: ! A' ^, v( }9 ~' Z* F) [
% f0 y; N( w0 U
: s- U' a; X$ j$ U( n7 Y1 }0 E
android.permission.INTERNET :访问网络连接可能产生GPRS流量 6 U/ _4 b$ \! n$ x% j# E
! C% e7 E6 _- k7 v
0 t s9 `, _ R
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 6 [" k/ L( k" q' D* {: y9 A0 A- E
- m4 m" g$ j9 Y( v0 y0 t
. b' ?2 ]" e2 I8 W android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 + z! }! z ^2 v6 G% D) p& x+ k
, m, n. h( d4 X$ c( }5 R. S4 i+ \! w0 K' f4 |3 X5 g) W0 G& N
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 1 M9 q3 O) w) \# n
% A2 P! ^$ K @) |) d: o
* ]( ~' x2 ?: @9 S% A$ A. }; O9 N; K. r android.permission.WRITE_SMS:允许应用程序写短信内容
. F! ^3 @3 G$ Y ; M* `; D2 e1 {, H/ c* y) o
1 d6 k7 [/ R9 P4 \- M
android.permission.READ_SMS:允许应用程序读取短信内容
7 F4 v, B) f' q/ }: l
8 E$ O# {+ q, K; g7 y" a
. y4 ]6 r6 {! z- O android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
" M( Q" Z0 i1 w- R* w+ p 8 Z( @' U/ [. U9 u& ~) a1 z1 Y" w, b
3 t' t& q/ ^# [: q+ d
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
* f9 K% y K3 b( `
9 F+ d/ c. @- l: f- |
& M- a0 G: x) O6 M android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 ( T/ I) u$ X6 F3 J2 K/ I
+ Y" c" k9 ?% d2 l& \" t5 e' k- }& b6 _* E2 Q; N
android.permission.VIBRATE:允许振动 5 x L4 K' k2 n7 g `3 ?& _; H0 f0 ?( Y
+ B7 U4 t3 a9 L4 P9 s
+ z/ @) Y! K- @& C8 R) b% v android.permission.READ_LOGS:允许程序读取系统底层日志
5 `$ r/ ?/ w" A. f0 p- l
$ J9 W: g+ ?! W+ |: F9 R, w( v
8 x7 z/ g3 ]4 T# U9 Q android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 : n. ]% n# B/ K1 H- m
7 |7 j% Q, v, z4 q" n
+ E1 F( _4 ^; U0 b' L( U . f6 z6 {, [0 t3 w1 H# q
( {2 P5 K- [/ P
: ]$ ^8 Q4 o8 m/ H& E- v7 m 功能信息
9 r- Q4 ]* U; \- g' M
3 G; a; |$ w8 V& x
7 N, l. P" i1 Y0 {$ z * D3 b+ M( @/ p1 E {) W" @
4 ?( ^' l4 S3 Y: Z3 L
+ _$ I/ v. u! e 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 ' ]6 \( M1 P A$ j
! T% h R# |* r6 ]7 O7 u
) b# X: S' |1 z: ~7 p% h Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 . ~( Z) K. N7 [5 o" |$ F
! W3 k Z. R) ]* ^" A- J
5 f% t/ ?6 N& x7 \
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 8 v" X. y4 G$ ^. j4 K2 s; U( Q
" l$ a" t2 z9 ?& T6 S
) h% Y/ z. l% o; a6 Y% ~* G
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 3 Q3 t, w# }6 X2 w; ~
7 C$ @/ D. L$ S( [8 Y; m( {. X9 d- ~& M1 q, u% ^4 l
! H! I4 @2 @, U% a, @! Z
3 g5 F5 y+ w( p9 |+ e
M- T3 L- ?: ]6 U Q" v4 b
) F$ _7 u. {- A# Y9 P: g# H: g
* x8 i$ q5 Y. J9 A/ U
8 H7 U. Y% [! P" i 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 2 R% P5 p" s% Q5 k+ n5 i
* `3 ?, s5 u5 _! P/ s/ R
9 x0 b! J4 t4 G9 v
4 c: {7 f: j$ Q+ g! D- @
( @( l- s- |/ \: q2 C, t
1 W' R' \& u8 ^5 d3 @
, I" b+ }# p( Q5 ]' h
7 k4 F; k# Z% @( I
; `! C/ [3 X; Z- _" A1 ^ 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
. c3 y/ }& c& n8 F4 O 9 Q7 y7 l8 t$ p
- s/ i/ o7 C- |, f5 v! C
2 j" f1 H2 v: D! E9 u) Y4 J6 o
8 y( r7 ^7 ]" e% Q0 c. b" u( y- u( @; H0 w0 G. ^: D7 i0 l* D6 B
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 ; s, y& V6 f7 C2 }2 f
& S( q- h) s" c4 ^
6 D( [- L9 R5 m, w1 ?
v$ c/ O- t g% c8 R
! K* b, {2 z+ @6 S5 ~) b! E" q
% e% M0 l* X6 I V" h; E
2 [/ i: N, s1 W9 Y4 ?4 t ! i$ \/ {4 L, J; i0 P$ `# O
, F. z2 ^* R- i4 C; H- [9 t6 W 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
% N' i" |6 D: L; G. R8 j # d5 x' F3 t+ z {9 h
; h, g D& S& b! O# X4 ]; @3 ? LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
2 V5 k9 m* q2 \
) s6 _ m/ ~1 M
% c' D# C' [3 H4 f" Q 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 ; ]# |0 u5 H# O+ H# U4 u
8 _ @. c+ b/ q9 a
- {; G8 y: O0 _$ n5 O5 O6 r 开源的luasocket代码可以参考学习下
: C" |6 f3 B# Z4 }5 `: k5 f
* \% I1 p: y/ J( f7 c1 z. F# s: G5 O
6 w* w+ [4 m) ^5 |+ }; d2 h+ G: k5 m https://github.com/lunarmodules/luasocket / C; L1 m5 s5 t e" W
, x! l! j) A, b/ z* L
% y2 H* w1 r k1 A% s: \! m1 m https://github.com/fengye/luasocket " a' a4 i: x0 B+ A0 R& C7 G
; w. t/ a0 T/ X" Z) P; W
6 H9 P- G) ^$ |6 t
, i# I2 [6 a2 H3 l0 R, k
% G# q( k4 x; ~; V' n# X4 I# y0 { B
7 p( E+ R% L7 [$ z
; s: q5 Z2 f) M2 ?! O! A4 x- Z! Y7 T5 s/ r) ]
- L; n1 s; t) p. ^4 r) {5 k+ c( a" j
2 d% @% k$ q8 a7 ]
5 N( |4 o8 |7 c" F/ h ( X D3 z6 e8 G4 Q) u
% @( _) T8 P e3 w# L! k7 s/ z. B9 t8 x& _
总结 * l" z6 C) k/ p. ?) ?0 p Q' i
5 {( ?. B6 R7 c0 H# k6 D
4 m4 m A8 G2 K1 X) @& F3 ] 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 + R R/ K# S& J" G1 q% Y! i
* y( K4 q. F2 i1 | O5 G8 @
; Y4 g+ \1 n" _9 t 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 % E+ z# {% {& C6 r! p. }4 v$ n1 j
& W* A% r2 M+ {, J# s, w
4 \: C5 G$ t q) ~
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
* R8 v3 D$ L: Y; X7 X/ m% t
t+ P: y \7 T# B* l
$ n* R O- P( d 结束
0 `) c# ~' i2 C : m' m" L* j9 y' P
; T" L- Q8 h A C 【推荐阅读】
8 S6 ?& I# _" d- v# z5 l
) q E5 q( ~. P/ F J3 K$ q/ p& |
对吃鸡APP的分析 ( C$ L( [8 S% F3 x: O& x
9 a! x4 M) m; L) @+ h8 Z( s3 G6 i- G# h6 Z, b! ?$ s
你需要了解的APP安全
4 H' h9 w3 M) X7 a6 G
6 j M. ~; U$ s* a. a& x$ E; D8 z( K! r
你需要了解的APP安全
' J0 I8 O3 j- @$ i5 p( u
9 M- I( X3 d4 [' \* C- z, y! B# V0 [4 z2 o1 q5 i: }
9 E/ _) F F: P6 q$ f$ i' j5 i
|