) q* x$ u2 `: e5 L 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
( U+ A$ n' Y0 c- W: I/ w: A; K
/ s. t. ^4 `. W, f( _
- G& z" F0 E2 m/ z% A. |% |
. e# }8 T8 _* B) h" E/ {& ] ! n" x1 \3 a2 T$ Z! g
3 d& c5 x% U$ R6 e
3 }; v# _/ T% [
* ^0 V2 [8 I) s7 f! {3 M0 t# x: z V; m- n9 g" `9 x3 r
下面就以开发者角度进行解析下这个APP的功能的实现原理。
) X8 J; A+ ?1 }7 j" ?/ _4 Z' k 9 @, ~3 n) E# D7 g
8 Z1 b/ L! J8 m& Q' ?+ S
* y/ S9 b# r4 v" H, i
) A2 q' s& `( O6 f9 y0 N8 X
4 X& }/ g7 U* T4 e5 o 基础信息
, w5 Y6 h/ N# o+ @+ |
9 Y( n! a% |: C; F% v; d, L& F9 t) C3 R! l" c5 m% H
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
5 T$ u; f, [" w+ J% V 6 |2 p" Z6 b0 Q. y: G
9 r; N5 ]; \+ u) M- e! e
3 o: A! p I$ a( {9 K3 \! N% r - Y& |8 z2 [4 U+ ^
. O" E# M" p$ {* r l
* F+ H# R) ^: z, ?; a" K
8 B$ i8 M2 |& q/ U% d0 @# c! l- @1 \% m5 V, e
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
- I0 n/ f$ R% k- w @- f+ ] & @6 c0 p- ?* V* T. D; V) u* m7 m
' @+ e; B. ~/ M( V) P3 L' e # i+ A; L) ?( z( o6 l7 E) E B* c- {
* \+ t8 i/ \9 ^. {8 x
/ w [/ ?% B: o9 u6 J
Q9 l7 j, Q& N F$ J H
" I+ P' [9 D" U- P; I
8 P+ i1 }, S' q, N" n 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 % x; H$ I5 }. _6 h6 R1 @$ i. I
9 z" Q5 k/ g& I# p0 Y ~
{; C' n8 W) q& a ; Z n- T5 T* q1 \2 I3 E( F- e
; t' U2 a; y, L/ z+ c2 H2 E( {( u
3 u9 F$ P1 j& [: L) p6 u- A ; U S0 G8 w+ V. ^+ u& _
; v. n- O$ m' y
1 U! ?/ h+ ^1 K7 z) B; N4 q0 w 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 1 G8 Z4 }" w4 z& U. C3 D
- [. V l1 ]( R: b7 G) x7 {1 W
0 E5 c- ~ L2 ]/ S
5 k! M* \" ^9 n
6 L# K4 ` [( {9 X- x- J5 O$ c% k# ]
% U& Z; j, U O% U' I1 Y) ~% T9 {
8 K! g8 e+ V( o; h |7 e" G
3 c1 z# h8 w' Q; W
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
% u- K! m1 w- w& x
! T" ?; _2 p _$ k& p7 v+ T; [: p% w3 ]9 J4 u, Q
5 z) l J4 R9 a! M/ | : Q- [) I9 c* B# T) v
, j: i' d/ i6 u6 ]9 o9 M$ ?
. Z9 r$ I, y, A
& A# q I& S- M0 ~
& X9 k: a" j( }' b+ |
7 |) n- J+ M$ b: e3 b/ i3 O+ d! y
3 U# m9 n% [/ V' \3 \3 W9 `: B4 K5 W/ e6 f% S7 i7 U5 E
签名信息 1 P+ S z( s8 |& A. g, T
* a" Z0 D+ w1 r- V4 s3 j8 A
0 A* Y O6 N2 o+ b/ X! g 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
( [: l" c. g4 ~4 _' a) y* y: ] $ B6 g* G' N N6 O9 }5 j7 \
! p7 Y/ o- A# A. B4 V5 V
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 0 _5 I& m8 \2 F {7 E
; }8 D# B+ ^8 Z* j7 R
- z8 D* Z. X$ x! d: [+ H, ]
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
8 C2 a- |& b. \% w b' h+ P ) x- l9 t; J% R+ G2 O) u9 Q
: n% u* s1 Y" h" q* N* ^
% ~0 {: s; k1 w. B: w: L6 t5 ]
3 C7 X/ e) H1 a G+ v3 v `. B$ @. d+ d0 ^9 b
1 M6 M1 X+ Q; E
3 q8 B4 I1 I* G; N- b
9 D0 w2 E. s1 V8 | android签名的数字证书的一般都是采用 X.509的国际标准。
. ^ K7 O# N- v$ l' X+ h3 `" [
5 c4 Y; H; Y3 _/ @
4 Q( m# p, p2 M; k' x9 C6 @7 e 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
6 c, T6 X4 ?% v/ v
+ @' q- f9 w3 L! [* |9 i' L: w
! A+ {( l2 N7 g5 L0 f8 z 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 0 z' ?4 e2 l0 a! }0 w: d
! N: { f" O9 w" P& F) M1 |" h6 w2 f! a) w$ K- _; h" o/ k
7 a4 |7 q% x2 t! a9 ] E; _$ L
; I4 c5 f4 ?$ \# t! U/ H! H2 D5 `4 I' o$ y; v4 q' ~, }* H
: A( Q) T$ G* q! I
' b6 y; m6 O! g8 I0 Q% A- y8 f# f G* T2 r3 z
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 ! }! i) G: [) l4 J) b( u9 Y
2 A# a* e" e9 L0 G- X7 G3 C& W# v5 J: B1 E
0 M: k1 d/ h/ P; [ 5 D* A8 V* F* x" b# Q! m" r
' z! d/ Y: ]6 \4 e* P 、 / p0 [4 V5 I0 F% [/ R8 w
( f5 Q6 C& e& p) r- R% b: R& l# }8 m: S) M0 z! `/ q# X
1 d/ H& j! i3 N' S$ v
8 A# c) H5 F: o- g3 M
( p. `# Y" q" z 权限信息 ( U0 D$ L5 z/ Q: K
" q! e: v1 t2 k% ~3 N
- P R- Z4 k* h0 Y9 \! { z' F 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) 0 `# e6 Z) b9 l
* Y0 f/ J2 v( a6 j6 |8 _+ W) E
9 D( a' f: t- G3 F. b D
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 , U; }8 K" t* ?: ^ Q0 p& n5 \
- a. y% c. D7 R! ~
9 }* R2 g! r) w9 k % K; i$ d/ K O+ d
+ x. z2 g( J" e* t6 N9 M: r
6 V6 ?: b* p, c ?4 ]2 M% O " e# L* p" T3 W8 X" k1 o
$ I- m0 s" f% k; W" J9 q, Y- h
+ f) \" X: J+ Y% ]+ ~8 I' @ 下面对这个APP的所有权限进行详解下: 7 D+ l( L9 t3 v1 U1 ?# q9 [) ]3 A
$ M; B- Q! A, ^) W! P, M) D
' F- p- b2 ~4 g A- [ android.permission.INTERNET :访问网络连接可能产生GPRS流量
$ S- p8 K8 ~. x: C ! M6 g, W5 r% ]# G5 v5 a
- x- `. N k+ w0 E
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 0 I% Z/ P( A4 Q( M5 t* I
4 x; r! _6 d7 T, E* Q, \
& x! D7 k/ Y& k2 k7 Q
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 / z+ n {) X& M3 E6 {) p
2 q* g- h+ U: P2 J. |6 \! F. | c( k8 R/ i$ R5 B4 n; Y1 H
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 % s( A, [! X& G
: f0 x7 n' }# t* i0 [$ l
$ U& l7 I5 u$ e/ Q5 }: {: s: r android.permission.WRITE_SMS:允许应用程序写短信内容
U& F+ ]# X- p$ V3 Y/ h7 } 5 c- F. r% L9 R4 B8 d) i" v2 x
# o% L- S( r' e* x# F- _% ^" n) b
android.permission.READ_SMS:允许应用程序读取短信内容
4 Y, p: H" a$ E0 D0 U9 B+ t0 \
0 T& ?7 ?* K: }' R
% w! Q6 l( q* y# d7 w0 P; l1 s android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 ; B8 }7 b6 g1 J6 ~1 U- \1 C; u
6 _ q5 d' v5 j) A+ v7 O7 m8 d3 V0 f# N$ I1 R! E5 h) v
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 " ^8 m. q* a. v4 F
2 c3 K: K+ A$ Y- c% K8 w1 ]" ]! Q {8 o( O4 C
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
3 Y6 l+ L4 L4 R
- B J" a1 S* C" t$ |/ u- ]* I* h' R. `) B M# t( m
android.permission.VIBRATE:允许振动
5 q2 ]6 H# U" ` T& \
0 D2 l( k6 i+ {. J, b3 m ~! O' ~7 f% ?) g3 p
android.permission.READ_LOGS:允许程序读取系统底层日志
G8 p0 \: ]8 T " U9 u+ }, o: t9 S( R5 u1 B+ v$ \
f/ y2 X) @$ N$ ~& f9 w) q2 M8 X* b
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
! f& ?- {$ q$ b0 h ( d' n! a. k n, Z
M; m3 `9 x9 W0 V
3 ^% ~5 w, ^2 Z7 f T
7 A8 T% V3 e2 `! k& c( V9 I/ N2 x5 ?: t
功能信息 % P; p( n* \$ R9 X# n
, ?4 }% B6 u& `5 L, t6 v. I) e0 E% m2 r6 n( p7 w) r
& V* {( Y7 ^ E* C
8 t' `1 p& U: d% C
* H. u4 k- O5 b5 G
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 & \6 L) e% X( U9 E# x" h/ j
% n$ u8 }1 g4 q& H: {0 q% ]
% u& e3 R/ s- X9 v& L Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 % |/ ~4 M: }% W+ X9 }# t4 B
0 O4 d9 [( |0 V# J2 @, p8 h) v3 h: u3 ~* {
' m8 V+ M1 S5 M- Q9 A7 L$ Y4 M
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 : N: M+ g, l" b
: g5 s- h9 j f9 H& B, ^ W
9 q2 g8 |, k+ O4 E. P
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 , Z' _# L+ D0 [& a( z8 Z
; I$ z1 o' ^" m3 Q% ^
4 T z" A: X% G& o * d) r" E+ E9 o
6 T* c) d" T: Z
7 l0 X. C0 x) Y* e0 d 7 N" W& r a# l) t) e* {1 t, R2 [
5 f( I8 Z: M6 K. h
: o, g% ^& d* `) n8 B, }& |
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 . o% ` U% }$ c: H; N" `
: G7 z7 j% m* @( X- T3 `2 ~$ Z: Y$ b, o- {8 O6 ~& K
2 S; k0 P P' K. b. G" E
$ @7 P/ v, h& K1 k
' Y; ]9 x9 A# U! ^* P! r
. {, b; q1 \! v# w `
. G9 J+ X* @0 ?- _
# c! Q [& Q3 `* b+ X 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
& g$ o3 t! w% E7 i
1 I9 ^& B+ H7 K+ _6 D. z, _+ A/ V1 o. B1 N3 G2 S
' z/ Y+ k9 a5 p, O
8 u+ D& C% ^, x
( r0 t2 E' Z+ P$ o7 e! g 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
+ G9 o* v8 y2 D2 M- r/ g
' P7 x5 u8 o$ y& @
/ z3 Z3 I9 S4 c* p6 F6 b1 ~8 x 2 Y# q& ]: w# C A: I; |5 T
* j# R1 W: K* E) V2 N, u5 O5 u1 R
) h$ }$ v8 ~8 W- X! f& h ) N S, e' B+ [" U7 Z2 E
7 P& z V P; b1 O, u' l @7 w; z+ X" z6 e
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 # H# x+ f: V* V' C/ c5 }/ @
: X/ m4 U. H. h5 F# M# u
5 a9 C& y2 G( N. @ [ LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 3 j6 W% _8 e. H( I; T7 y
3 A# O$ L/ b5 o8 J! m2 t1 F5 ]9 \' U t8 A" j2 q
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
7 g. G+ y2 u8 y1 q2 B& \3 h
; ~7 D. T3 i# h2 o8 C, @- m' ]& X1 v3 d
开源的luasocket代码可以参考学习下 % T S( N% G; g8 X7 k! v
4 V* _" v5 p, J4 C4 Q
* z4 X' j, [" I4 t1 C& o4 G
https://github.com/lunarmodules/luasocket
% b2 }3 [6 [' S' Q4 ` - F7 C* u% } [. C J
; U% J- i ]9 v G+ z+ O
https://github.com/fengye/luasocket # e& ]$ H, B$ k. S; b
3 h. V$ A; A- j* B3 g4 |
) N+ R: X* Z# ], [' t
$ K$ Q2 s' X: |9 E+ a/ _$ | : G" \8 J& @9 Z4 o4 B
/ O/ t& F+ `8 E, X4 V; I
$ C8 Z: y7 y n. n: c9 ? 5 Q/ }% e" I; K K4 n
" E% e6 Z# w( Z# c, c/ J; B
. L3 E- Q- }( G# N$ p 9 Z5 X g1 ]" O, F
8 k9 i" G1 ~% F
/ M; s1 H( D; x6 m 9 c0 y$ o9 ]. a3 Z$ d( |
$ G- s/ A/ X+ d. f4 [5 I+ ?
总结
0 w- t8 h" j+ {- n9 ]- h
1 e, i6 Q. D9 E2 e
9 q4 f- t' Q% z* b: R 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
1 r$ o' n8 i; B3 q ( i8 P. E U' W' J% m
9 ~9 K* p% \4 n! U5 ~! D/ W6 O 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
3 \1 J6 c1 b* K ]! w; ~, a, g. d 1 ^! R6 h V3 T( a; H0 v# G6 w; y
1 H4 G8 `5 \' Y, H3 L% I0 N 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 8 p- l; ~! f1 m$ F
% n( D, w. r+ E6 s0 @8 M q2 A! |/ l" y. D
结束
7 S3 W+ _- B6 n
! d7 Z0 |5 c f L% a
9 W) }' D- o" s# x& V 【推荐阅读】 & l' c9 ^4 M/ z3 l$ a3 N* F
9 ~& @- p! V3 |0 T1 f
8 h& S/ V- d: _& r+ a, u9 b( i- C 对吃鸡APP的分析
3 g. z5 |9 z8 X( [: s , z* A% t" \, o" f6 D) s5 x
/ @; f5 A& ~, ` 你需要了解的APP安全
( G. n+ l* j+ t5 j4 l! q5 N& p / A/ P, `7 F, H4 }
3 A0 s/ h2 x* j. s' B5 s4 K. J: |) h
你需要了解的APP安全 4 Y! L. n" l4 [" n# p1 e" e: g
6 P. i8 p& w* g6 M. B! F) O. |
: e6 ?8 Q i n* I* r6 W: I 2 n% C) \* V' ~" T! J* ?$ h5 Y
|