& M4 G. j# F. f. |
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
7 B4 V& ^" D |/ Q3 H) n- @' ` / u6 l; n% o0 v
& F/ L% Y0 k8 |2 Y* U* ?* W
2 o5 H v/ L; T0 f7 P$ J
+ Q+ B' x" j" P+ C
% f6 x1 W, J6 E2 N3 f / A& \& O& Y+ d) M" N* ^
# R; |( A3 o2 U2 H2 f2 ~) N8 S' S3 G$ q8 y4 ?' k
下面就以开发者角度进行解析下这个APP的功能的实现原理。
: U" e9 }+ C6 O) q5 g 4 h$ I8 C# n$ R0 z9 ^% V: G
6 @4 A1 i. V# s( a$ G/ c3 h 7 t6 w9 O' c' h6 }
# B) F& T2 `- z; N* {% Q: {: h2 v1 N O5 q) K6 p5 Y; u z
基础信息
! P( i( k1 E' H/ s6 Z
8 o; S" F) Q' p9 U: ^ _ a& E2 ` x0 c& E3 K& b' L+ P
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
5 ?! D5 {8 w) a- d7 X$ ^# j! p
6 q D4 S; X+ E9 I& t4 f K
8 `! R+ a5 N( s
+ N' E7 q) s! `: u* n, {5 D! K
* O: q9 _: y# P/ q' Z, O. S
! ]0 }/ @- b2 e0 J3 L 6 X8 F( i' \) c! x- H1 E
7 n5 y+ m! i* p. u; W4 L4 f7 P# g' ]" g: A6 v" }) @& ~* s
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 2 b) `# e4 ?, g! z
9 H0 J E5 G$ W* c
# v- \3 k/ u. x" }, K
) d; X$ {2 S& o: X " R! R, }! s9 e, @5 I
. K" k, \7 ]5 ?' V9 D" v+ k9 |& Q
" e' M8 m- ~- B/ D
0 {" w8 R5 e9 N
' g( q' ?* h' S R+ ^ 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
6 l6 t. u/ q$ N7 G, L
* }2 I. L- F4 U8 l8 N0 C
- m' O. U2 ]$ ~& O/ p# q
1 X9 B, z" Q9 M2 ?" u
5 j e, T% o& I1 v$ k
) b" X/ z5 J% G* z% G9 u - i$ `; g# a. X
9 s+ n% q* M- x; M7 M2 v# b
* U$ v e' T6 | 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
5 Q4 {+ e& s" L9 x
: @# ^6 J& q0 e% d9 v4 Q# a6 m
@( X+ n( i! r. {( ^
6 e6 G* j: a: _; a2 o, | m
, ^0 [3 C% E$ J0 {2 M/ ?1 y1 q! Y; J6 b% n5 D# [
$ B z! W) h, [9 Q% Y& `
( [1 T* k6 _( ?1 C h4 ^! W& X3 p& A' W
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 5 U" G8 m y6 J( p
9 E" N8 |: S3 a' e
3 W4 I- W& G9 t% R0 G
! f; `+ z: M! H, w% D0 l1 ?) p $ k. [2 f" g6 ^- ^
8 D& M% u' c- O' v
: z t8 Y* f% g% _1 e) C
7 s2 m# C4 | G2 n4 u! W
0 W0 H) t, M3 m6 g 8 L2 H1 X6 }" `+ h# K( f
+ N8 g- _3 B G! _9 ?
4 c, T* R ~ j: Q 签名信息 7 `% ^$ _7 V+ G' x
7 F" I3 ]$ x8 P3 B
! X6 ~4 A5 R6 \. m: r6 B 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
3 _2 k, x2 l% Y$ o) S8 ?( `8 C 2 l8 B( |# {6 P& ^, j/ ]
* G. ~" S# p6 W2 p, D, {, }
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
6 p% Z6 }1 Y' s5 K " B& t; P4 p: ^
& A* {: q# \) P: G: N3 l* G
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 3 b9 v. V8 w& g5 Y E" S% l
2 P3 M9 J; o* t1 m1 K
; E3 }+ @. ?3 \0 n" |4 ^& P' l
3 s7 } w8 P) i. I+ f1 Q . ^0 O# T% A8 f1 {5 Y: \6 K
7 }* w# i3 y5 T& x( U- E
1 u5 ]3 { |7 o/ B / W8 H4 U" ^/ ]; p( V1 @; S3 l
7 N7 {" U/ D- I
android签名的数字证书的一般都是采用 X.509的国际标准。
3 K7 E6 w' X. U/ W% w ' T- v& ^' r% Y3 H. _
: T( o G( D0 e* e7 E Z5 s. P- X
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
- J# O3 F( U2 X' F2 R' l" {. l' I " G+ A7 I3 e' r
9 Q, i% E0 O- V4 C7 B. j: z 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 " A( b! h/ [$ v1 G) V2 E F4 o
" n0 C) P7 Q1 i% y' d4 ^
4 a2 w: \8 P5 @: S) ^; G f, R
2 L3 p( o4 O9 I6 _ Z . q+ H% y- S9 D7 x
* s2 e- x# r/ u* @2 {1 Q) J$ E
: n) E: a2 [- q6 _
7 F+ o; C- @+ @; [' K1 Y
) ]) Y6 V; W9 R+ Q0 X( H# C 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 6 T7 N4 \# |0 V3 G! ]
$ _9 B* p& o* ~% K3 T5 B
" T! e& v/ N+ S* h' r+ d
M5 L4 f# s/ J2 q1 ]6 E$ i6 h ! V' H* _9 C& [# ?2 X; b% {9 `
. @1 V+ B: | x. {
、
* c. F9 D- k3 y* A. ^ % t. N2 t9 a/ s* W: b2 g; e
2 l. g Q) x$ t& W1 |) a
% P3 Q6 J$ ~( l$ \. }) g- Y% r; I8 ] 9 y/ R2 M h5 u% W @
5 }) a% F8 O% X! r. v7 k+ j$ T+ c' i5 }4 B 权限信息 , ]8 f# Y7 C) r
3 P1 t+ F3 s$ [+ Z
# C4 ~" Q6 N8 x8 H1 V 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
: b, X2 R, e) n& A+ b ' O9 s. ^4 J+ O2 f2 b9 \, J
7 n) D8 [/ {+ M) z3 R
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
2 z6 k; M7 V$ L0 L) q0 P # J, N- R! m/ b% C8 Y
5 }/ `9 a# y0 d5 R8 Z4 Q
, ?4 w/ [! N' U i& W; w
8 O- R# F* x, a$ p! J7 F8 W0 e9 R) W; n. @7 K6 h! b- A
" W1 I3 _% e, L! x ( _- `7 I5 Y+ m" S# a; M% I
" M: c* t- L! e- \7 ~ 下面对这个APP的所有权限进行详解下:
+ R6 c3 v( S. w3 w( H
c5 Z/ i7 A/ g. @8 ^, S
7 T: \) R/ V5 C! R8 R7 \ android.permission.INTERNET :访问网络连接可能产生GPRS流量
2 \. h: {" @3 ]$ Y9 h/ ~ + ?: |( [7 ~$ R8 V
" q4 S3 ^7 H* e& H* w# g4 q9 {1 E
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 4 d6 Q4 V/ }: ~, K! K+ |
2 _- Z9 Q) }' L
( D0 F O. H p# L: K% @: F! A android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
1 k8 ?; M, D% K$ S }
+ j L& }/ k" Q- s$ X* G/ }8 B! L( |& C7 {' M
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
& U$ s. ^5 @* E9 C* Z! [ 6 z. V, O4 X& y
9 O$ N* d& w q% k# H8 C4 B
android.permission.WRITE_SMS:允许应用程序写短信内容 " r3 P% w! A, @$ c4 h0 {+ E8 M
5 c4 [& {0 g5 w
' r# g& S! V, S
android.permission.READ_SMS:允许应用程序读取短信内容
' G: y6 X# k, X+ o% R5 T: f# e) T7 E
% c$ ], _5 b) I& E7 s0 \0 _# O9 W: L4 A' @$ m- ~; Y! D
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 ! ]: g! X0 g/ u6 X) g
9 ~5 d# D# O* A2 R8 ]% `$ I- U% L) g2 O9 M; e& Q) I r8 O
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
0 d) S9 c+ I/ N8 s' i & F7 N. e1 {0 A3 W6 b
, O4 D. i9 x2 O8 `5 m: p android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 - p" @* U, O G( b
* f9 ^, }3 |, U
- t4 G- d' \: F ~& u/ n+ [- R android.permission.VIBRATE:允许振动 3 G3 e/ s l. U _- p% e4 o
% \5 l0 s- v# [7 D+ b; j1 k7 s: G) c2 _4 e9 A- M
android.permission.READ_LOGS:允许程序读取系统底层日志 , _& b. d7 M( Z) b; z6 a
# d' @$ \& ]4 ?1 u
- q5 Y1 N5 e: Y( |; g8 m' K
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
, x- C2 }+ @) x
& T" F8 C% l. |) ?
! y2 L$ D, q1 F. @* M/ K
& `. B( }+ {8 \: }: `
2 y( W; k" {3 V# r
9 w3 t2 H8 Y0 B% T* d0 y 功能信息
, r& I. d# i: O( J9 [0 n1 G 8 m: C( H, R5 x5 C @7 a L- X
, b; M9 Y% P1 @2 k6 w; g1 b3 f7 A
5 W1 k9 h* N: w
& m# l6 j* k2 I( B7 l
4 _3 z& J' M# W$ |6 b 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
/ A# Q3 \1 U. O/ U
4 y" F; G" ~# N" m2 F8 L1 \$ o" b7 g
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
: g2 B" F9 c% E, G$ r) N
. s5 w. O+ ]2 E1 s+ I. x" X9 `+ R R6 W$ h1 N9 f6 s# X* A( U# J
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
3 a! N0 p1 t9 m2 `" P6 z) ~ 2 Q2 ?, A: V+ O" Z/ B
' J) o0 |/ z, X( Y, c; v5 O
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 1 c8 O: S: r; S3 N2 g
$ F- Q! T& m! M
0 u" H7 w+ E' X
% ?1 X4 e# {0 ~' u$ S6 `/ z! j
0 h* j- q; m+ c3 \( Q' z e D6 f( w0 [; R+ w0 V9 U
4 e/ X \7 s0 [7 j
/ N* W3 v7 |$ G- S. ] ?; Q* }: [! z# ^9 ~" j
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
( a; }# h: ]8 W" _! ~; L) l
! U& L! o Y+ s# ^/ n; X8 R# n) R" e! o' O6 a% K8 L
* O6 z; X) e4 ~+ n
5 [! P3 @1 j1 }/ g! c( {- h& ?2 E& O- K+ R8 o! E8 F, s, W7 {3 U
% P7 E* @7 b" L4 h
: Z! I, }2 `9 Q( e7 O
7 g8 _: A! ^$ g% [/ G2 ~6 a( \ 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 & H8 k" P6 |! L r
+ s- V3 y6 a+ I9 t8 y8 S* c' |- U% ^; `9 l: ~/ `
2 r, n5 `* T8 L; i1 b/ {* e; S: l
" L& i2 h- S1 F9 D4 ]6 f- U$ [, u( G; ?4 [- P; g3 T9 k
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 " { E% \$ f# _; ^& P
, p+ e& f, A& c3 R- [4 p7 A- C1 [+ D. Q9 s! r
& H5 b6 Q6 H. o) z
) [0 m' E p' x1 ~$ i$ ^% H. }7 _ I7 ?8 \
* ]: m$ f4 l# ?! X, J , t. J& ^) G/ O- u# Y* _0 R
. ^( D, D8 `! [' t7 P0 q 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
1 z2 G, Z" c- J0 ~* E; F 1 B; K9 _) p, y
& x- N0 \+ G( q* d2 ?. f LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 / j1 S9 C5 h( [( |) u9 Z4 R
' N0 p7 t/ _% R& ?5 v* P) t( v* d% Q }' @0 U
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
0 j F/ q3 ?0 u: y# F7 }- z G % F, E! q9 [$ }
8 } i G- g4 K; k1 l+ i0 s
开源的luasocket代码可以参考学习下 " j* q0 j4 ^2 }$ S
* N; A' J3 p' N# i9 e' o) X1 Z( h' Q
% e7 A! Z5 s" k. n8 w/ y6 F https://github.com/lunarmodules/luasocket
X3 p: I3 k w* p& f9 S
4 J0 l' G9 g7 @+ d
7 c0 T& w* B, P7 P" p. I/ T https://github.com/fengye/luasocket , `+ f8 P" c. H
, F- `7 @4 \+ l4 q) `
|7 W- k5 d: e8 Y: `5 ]
3 P; y J$ _+ m) p7 j7 q
3 F% C7 J, K* q& ]' o3 A& ]! j
) v+ _0 u7 ^. ?* x9 j" T7 E ' Y9 _# g! N1 I
( E# \6 W* ]( e/ w
0 @) Q/ R- i/ y! O' u* Z: _. o
T% s4 P+ C6 n. J% z ' ^' k5 a: @" Z
# T0 n, p, ~3 c( }" h; z* U
" M) k1 C u$ n1 W, D) ]# j) B # Y8 r" |: F. [1 k$ l8 I( E a9 a: i0 S
9 V' M/ K) D; M! v2 }* I
总结
|# M' v3 r3 L, B3 }% [
3 x L+ F4 d0 w3 D; i' k9 k% T1 D
+ c5 j! U) F" U% o 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
1 j! w* \0 Z" [3 ^ 4 f' T, t9 X0 [; ]
7 q# S, D$ o8 ~% q5 o( P/ i- [! C
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
7 E/ V. y5 X: s - X- Y/ `$ l2 m# i2 }5 I
8 [! E1 g# I$ ]6 O8 V
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 " i9 b9 _7 D5 n" v8 g0 L3 B
1 @- Y5 l a5 W! S' ^! N
* p _4 o- p3 q5 ^& L) w4 A
结束 # z* f& D7 q9 H4 N) j9 e6 O
! o! [3 e% S( _, }: Y! G# _% T
7 X& T, P6 |1 |2 D- Z. A, W5 `4 \$ O 【推荐阅读】 % `& Y6 a9 @; W. [# E6 z$ i
' O# U6 N, m T0 v2 i* V
4 `) \& E ^2 g( i& {9 m9 `1 H 对吃鸡APP的分析
7 P3 s a3 t$ O% N, u% M+ }) d, U9 b
, T- g( `* v. M& f2 \
b- Q: v2 i# V5 b( P 你需要了解的APP安全
$ M! ]4 v! |7 C' d* W4 N- v
; w2 {; e7 ^6 _% ^3 f& b0 M2 O) C( V6 ^: n
你需要了解的APP安全
9 p! M: i# q5 V, c1 q
+ e! e. I$ j) l2 x# ~( N
# |+ g; f+ l, C( _ 6 Z+ i1 d X2 u
|