3 L) X1 D! m# o N: T
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 6 ?' Q! ^3 ]& P( U1 _% c3 g
% q( R3 h( ?% Z
' J( V8 D, p0 Z- m/ Z. X m
4 q: @5 h9 ~1 y# }4 h$ [7 F/ m
7 Q# k( Y' g0 r v8 e& P! q/ x3 y7 k G4 Z% f
# P- X- R3 L; U5 G
+ v2 b! T( O) S; e. D4 C1 K; Z( C/ q" A
( V6 `4 A$ Q% \9 u- x 下面就以开发者角度进行解析下这个APP的功能的实现原理。 + S6 a# U9 p4 F* l1 B
, h+ T* e# S8 X. r# I5 P2 J5 x
+ v# B h% E2 [0 J: P' e7 C7 c
) y, `# y3 V$ d( \: C
: f1 @: M4 K. k7 D3 ]" ]8 d3 w5 |" h8 [) d8 C! o, p$ Q( W; x" O; O
基础信息
5 \& |2 w: T/ b9 g6 r2 i- \ ; Z$ M/ A+ M) W3 g6 ^- Y
# R& o6 N4 l9 N$ g 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
u9 v; q5 E% A5 ]( m % I7 ?5 ~. O$ K# s3 X R
% N, e+ K0 X: g( V) Y; |6 k
* q$ B1 }* C, H
2 @5 D) j2 m5 W9 G( z
: R; I. j0 ]% v- ^; i
& o! d" e; S+ S 5 v: x' C8 o; R
3 t1 h3 N, s" x7 F& B) y 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
7 ]; R8 e2 g$ W' y1 ~4 W! F- T
) d: W+ ?/ [4 N( r% Q- k
7 z( B, H' x6 [1 l' s2 m # ]! \ \9 w9 c2 J
' a/ L3 m- f9 b' B) Y% _8 e/ z2 M+ ?: `- M0 v a; n/ C6 a6 F
/ l! V& v2 s$ ^# o! I
2 C/ }/ \( p5 i. g4 ~. c" M3 `
7 E5 S& N D3 K9 n( f5 e 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 # r$ W% {: a( F1 N4 @9 |# e
/ x9 U; s: E" K, p5 y+ n5 g' H9 _ \5 t; i e
* Y# m) T4 U8 a
- {; v" ] O8 z1 V! g# `+ y; F
2 M- B0 C( v( O- Z' b
9 o* ^0 v$ h. d9 |
$ t, C/ N, D: s( {" g0 H5 Z- i
8 e O' k" ^& ~. w; I 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 : C) c) V* V0 ?2 W7 L
; S D) B1 F. L* N2 ~- }
& q- C/ x- e( T. z9 B 7 d" s8 l1 [0 B4 \! t
G7 s* a1 q+ X- n' Y3 k( Q: X* z9 H
' h4 L4 u, x5 X9 `0 k! Y- ]; P
% A S I( {& G- I+ t- c2 P" L 7 k3 B1 D `( x" Y
/ z! N. T7 p) Y2 Y! y. F3 U
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 6 d" n& H' m7 C( g7 K8 R4 p
7 [* B- C0 j* u5 A
0 w- K! i# S) @# b: a . v' } f$ _; m% Y
) |& t' I/ q& P: K7 L
" a1 Y7 R- ?7 [0 c
T# e0 _ Y5 j8 |
& J& ?& ~- G2 E6 g) R3 Z8 ?
' k q# ~6 g3 ~' Q. G o
- \% d8 s; {1 n9 t! e/ B, p) K
7 i. M6 O) {; g2 C" B7 r
) j8 I7 @9 B# F. m 签名信息
, ^# J- i' F# Q. S
& c3 ^) O* I; \/ L! s) Y7 {
* c0 m4 b7 B8 l$ E 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 ; t3 J9 o( z" S0 N( X7 Q
# B( S6 z/ G( I, x5 j3 L; I% D* l0 d( ]
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 - Q1 y& s& A. _% M D
; N Q0 `7 N9 m" ?
) [3 J2 ?/ i3 r; L9 r# ~ 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 6 K% B( i7 j, `0 w! b, x: m
& Q3 c. d$ `* c/ k1 }: z% N7 I& ]
9 `6 H. K- C: z: ]
9 f/ _* W) t; A+ f% ?+ k2 U
. O' F4 k/ b/ e; p% G) h- Q& j ' ^$ _2 Z6 T$ q, @
& v2 I9 Q* [5 a9 ^/ D8 O" u3 X8 ~% C6 D1 y2 b
android签名的数字证书的一般都是采用 X.509的国际标准。 - d" x1 l( p1 a4 M+ Y
' f6 j' W' n. N& b
; x" E& X! ^7 _ 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
& z& ?' Z8 } k
8 f% E% S7 f/ u! R' a
& w/ }; f) Q7 H 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
% n8 k2 `$ f- }7 J6 T G) `6 ] - B8 X& i1 R' s$ O
* t- ]) R1 k" {7 G" V( O . q4 V( n, l2 U! @) R
, l5 Q1 x5 o! W- L, S
2 f3 D4 q, b2 u( b# T2 ?
' |3 A$ i& T! ]! Z6 z9 I* V ' T6 c$ o4 J0 I9 O b' a
2 _0 f+ U2 h7 W- _$ J$ b: Z
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
3 m% G# x9 U/ d) c# c2 \+ |1 a! G 4 B4 M1 ~& h+ |' r7 e3 d/ [2 p. G
: ]. l0 W' o. v- G 0 y* w( U9 k5 P( i$ H8 r7 ~0 I
( M: y% f) T0 ?$ v. o& n
0 [/ S$ B' g9 D# U 、
# i2 X9 m3 B2 D) j, ?
( B3 Z u* L# D) f2 z1 R
8 ~' G; T' f0 q$ [ 5 n, B9 q" Q* x! r
. E# F+ k2 W) l3 T0 v5 [/ A; W1 U" N$ S. V l, M
权限信息
+ o% U& J D6 \9 D ) d# ]0 e- s1 V7 v
: Y, ]9 F: V' h; }" e {4 a 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
1 ]7 }0 I& h$ V% _7 l4 a
0 U5 I0 |* r/ R# n$ u% t! O0 x7 R2 d6 t2 E4 W* p0 A8 d
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 6 v. p# U" _6 T2 o- y8 s7 Y4 e
' \$ x! z0 ~! ~3 E. a
+ Y# }8 {- D, C) S4 f3 m K
: A& C: N+ z) b3 ?; ? - L9 ?8 f9 u1 Q! I# E, g/ M
5 a2 f; u$ J# s) w" {4 t! v& l v3 ?2 ^; j8 d3 w/ u m
: ?8 v# U! T1 l' B* @0 F
5 K& H0 k+ ?+ N" T# @1 h2 @5 V 下面对这个APP的所有权限进行详解下: & E, y& ]* A% j- v
5 w# ?( X/ W: H: ^2 y/ w' \; Z. N+ x2 I; c' W. ?- P
android.permission.INTERNET :访问网络连接可能产生GPRS流量 , g- v* O( I) ^; u1 _ y1 a. N/ X
" _! k- F4 i e& x2 k4 s4 J/ N9 {: [2 |! M. j7 K
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
$ ~: ^! z* J" I( V: `# s4 r! d _
* N2 {$ {( [6 L
% y& G7 u, g- @* l android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
2 e m" j5 F- Z4 M# G& _2 e
' M' r& ~, M( u5 `" X; J6 l% {) o E
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
* F5 f& S* |% w" Y) Z+ n. v A
0 N q6 J1 w7 x5 G8 A" |; k9 r) X& c4 x7 u* U5 E& {, w
android.permission.WRITE_SMS:允许应用程序写短信内容
4 T7 ^5 j2 o. J. m2 \) E. { 6 o# W) P- Q9 q- w) F/ K% _, S p
7 d e3 i4 _2 x, o- j
android.permission.READ_SMS:允许应用程序读取短信内容 * k& N) v3 k$ I" M% `
) _+ p5 f" H8 i
2 f4 q, [! [1 U5 }3 N/ @5 D
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 9 e. D8 T* L: h& K, f6 D+ @0 U0 [
1 `. Z0 e7 w/ ? Z. U
4 A" u" C7 @5 X! v+ b* [7 Z6 ~
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
& r8 A b* F8 l4 A% B& w o. j: ^
/ {7 x' `: Q/ s* [: h2 \& X, P. J& r+ T6 u8 u
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
8 {' Z7 A I6 _ 8 E4 e) o3 H2 P) P# \/ m
- N" i1 @' R" t6 }9 y% X8 Q
android.permission.VIBRATE:允许振动
. l2 }5 N* l5 [! I: ? 0 _+ S* b! ?1 C; H& H* m
8 \& }2 e; a8 h4 _( N" C7 X
android.permission.READ_LOGS:允许程序读取系统底层日志
3 r9 m' c D: K' g" W% A" n
, C- W% U+ s* r, b: i- N/ T! v
( l5 `" I# I5 y4 ` android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 1 g5 K* p) }+ Q( C
, P, X$ x9 P' u% _* Q8 w
* c2 m$ C: y" s/ `% G! A J 1 p9 i7 K8 g: C/ R2 \
4 T3 m/ N, q" `+ g- e( m _: ]
5 ^& S+ o: s: h L% q' ] 功能信息
7 I1 Y3 P6 O2 D P" C* w , t" K6 Y; P- l0 J
7 E$ q' N# b0 r; O: ]# C 3 C3 m, p6 I9 E( M* f% w
/ S$ l% H* {' b. u; l6 ^3 Z) u$ {9 d5 W, A! r9 \; j8 c
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 2 d/ S* l# P8 i/ A' ~
6 @( r8 y2 L! }1 ?, g& G, p9 L. Q% Q& e/ U9 q% a
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 3 |. r& X( u! s, E% v- A* f# |
% U I' L9 H9 U) H+ {$ I* ]
+ l' G1 x6 \5 m' `! r+ I 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 ) P, @ K, S; Q0 x, |
) V: A i0 R5 A. p# {& A
1 V: \% L/ N% G- _: |( Q) @: ] 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
l6 \: _- n% `! `* }
! D: W; y% J+ `9 g1 N
0 M# A/ D8 x5 e9 c 2 K3 i" O, g5 m5 j T& ^9 P
2 z5 y. \. U3 N6 z, R7 y
* A* n: w2 h: I7 ^- k7 D) m & Q& I' k- ~2 l, _
% T, I9 d' g$ t, W$ N) p
- Q+ f- m9 N. ~/ E2 |6 A
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 8 x _. x' n5 r& v, D
. w% x0 S G7 M$ D- b$ J# i
6 j6 `; B4 B' N1 `
2 x7 d9 H4 Z4 _# U1 l) |+ a1 u/ E
$ y Q; w, Z2 Q0 r4 F& Z! s
9 }2 N+ i2 R' \2 ]+ \
$ N3 n# c. S7 l ' N3 i, V2 w, X/ C. _$ X6 N
) O- W7 L, I6 M' m 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 1 _1 F% I/ {6 l( b2 U9 R' M6 K% ]
# \7 n# I' r+ |- B, X" m
6 }; [! P$ `6 ^6 B% {
+ b' S* C& o) U/ p+ g B; s9 V
4 L7 t2 O, `, ^# h) @; u1 S+ e; g4 y( Q* L
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 / N, d L- J; b" O
3 p9 f( w. k/ `3 j+ G
7 u3 L/ b8 c# C7 M0 U% l % {4 d# o9 W/ `$ S
8 W- l0 V1 P' J+ V) f% O$ D
2 k, a7 v7 K' H' e% C
7 O. c# r8 C% q2 J0 g$ r
; z* y# }/ e: j+ g' w5 W0 `
1 `: R# C- e* ^1 l 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 1 W" f/ b2 b9 i2 A
- a2 ]. B2 |# _
5 f u0 u; N. R, p
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 8 Q9 w- H7 D! o3 m
( _" r, P3 C) [1 X0 U9 |" n) Y
p* e0 b' I8 l4 \/ F# y 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 ( Y; V) B) l7 A1 V. d/ S- e. }
' d+ ~3 X- W" q0 l$ A
' l- H, ]4 U9 X5 a 开源的luasocket代码可以参考学习下
/ {2 d) I2 h+ ]" v) h, i+ _
6 K- V, A9 _% V# N! H' q$ M5 P
8 C/ j! W/ r1 L E) a W; u, F W https://github.com/lunarmodules/luasocket ( i! B u @+ x) R+ ~
4 j/ @% W* t2 ?4 q/ Y! }* p5 x9 p0 K8 w; [( a4 o, ~& Z
https://github.com/fengye/luasocket
: Q9 b5 O9 g1 H6 s8 S1 Q
/ a$ L. |6 h5 U9 S! R z% T$ [# p& ~( K0 R( a' ~
' Y: W9 J1 R4 F * I/ B) T# R, Y$ }; y
+ o A! }: T5 t0 K4 I: a 3 G4 v; Y: J9 ^1 R, w K
, _5 }& x1 n( p; |
3 v: k! v, D) T) P3 ?$ M) \7 g
9 Y3 r! U( ^6 L( Z; U- p
" l+ y" \- O7 D' Z% z4 R) G( {2 u7 i
( H3 J3 o6 H) V7 N6 p; w7 ~5 L
# v$ Q4 y( P8 X2 F+ A P$ r# Q' g
$ F& q2 C! H3 ~. f# i
; W) x, J' ]! X+ `+ B 总结 ) W. T) Z) u0 X% b7 w
* \# p& G; _& V0 F2 m @' O, {5 p: D& K: p: c* m
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 5 |% w0 ^" z* e; B" O1 p
4 j7 U) e3 \ x
( y( y9 k: i/ I- @ 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
" d5 l, s7 |& B+ X' Z% L7 \ ; ~ @' q, X. O' i; P$ u" f
$ Y6 A$ U; B: [' `/ b+ g3 V 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
" p! ? a2 e8 X d1 P 4 q- I" X+ ? w! f) G
7 p; i) o" s: a, k, k( I/ U% n" H
结束 2 L& l) V0 y0 [2 j; |0 L
; {' m7 m) p3 y: @% h T9 L
) F$ `: ?3 V9 ^$ ], J: H4 { 【推荐阅读】 & x8 ~9 K1 O1 T( `8 i
% ~6 j* o" u/ ?, a' A, E5 A
8 F6 a k4 c5 D9 B4 @ 对吃鸡APP的分析 6 Z' n) K0 L8 N+ ~
" e( p: v! T0 S$ N
8 j3 m) q" ?3 p 你需要了解的APP安全
5 G, G6 i/ {8 [/ c+ h# U, O$ Q6 F k( q! }) H( c- _* d; L7 h
5 Y6 M* d( @. k3 v/ p6 a
你需要了解的APP安全
8 d0 g+ ]0 k/ g6 e. ~2 @, Y! E+ \ ! ^ q) D& W& U9 U7 Y
8 {6 ^1 F! D( E' z
) U6 A2 T( k! y$ c" F" _ |