% ^5 c1 a+ J- B( c/ } 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 7 _8 F: ?( S9 c
) v- C7 z4 q/ n9 o8 u3 X
0 C+ n, n' U4 q
0 ?* e) ^0 u3 I: I3 Q7 \ 9 ?' X+ N: B! ]+ O2 K
6 R( n1 W0 p5 q. k( t% u
/ L8 K# G% f7 |6 u- A+ i* S
+ u8 ]4 O# x6 v/ X3 Y% U' G ~3 X) g/ O; A
下面就以开发者角度进行解析下这个APP的功能的实现原理。 6 T) x7 K) p: e& J# Q
7 G$ A9 K7 m2 z. a
( q B, x% r/ _& w2 Y , [0 p/ T! n B/ j
* h2 H2 c5 P" d1 Y: O
/ Z; ]" M- |6 e8 I2 A 基础信息 4 {5 c, \: w! U
/ W8 J! n1 }4 x7 P" s- ^9 D
- A5 G7 C9 g4 m
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
9 x4 z: d7 a X6 T4 D0 a& r1 u: [
& a* K8 X# @3 q! O. \/ f+ \+ g& o3 ?9 L4 ~# O
0 n2 g B: a4 r. B) w' H0 Q
# J& K$ J+ B7 G& e" V' c& W9 y! Y9 w2 D* y
- g* A2 [2 ?# |; K
0 n" O# V1 V/ ^% L, t, d$ w0 r2 `5 J3 E# q( l1 z; U* o u8 C
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
! ?5 O8 A; b" K* L5 f/ q- f
: J9 `7 t/ b; T+ F' e; N0 l( e
: f: b% a2 q" L) n6 O
6 b8 R3 S2 U U1 ]2 f
! Q R8 W* [. ^8 M6 J7 c" L+ l+ I& I8 I3 i
; V7 y8 @+ z5 s, i% K ' `2 B z/ ]$ d; B3 N: F+ I( E
% J$ X8 d$ Z1 a1 \ 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
7 @* S! C( N0 |% ], j
; ^0 l1 v7 ~+ w3 L5 Q
0 b: B! K: a) F5 ?& }
9 N! w s' y o2 S$ ]
* B6 R8 ^4 P- a# ]" h3 k7 u% v8 ~9 W0 L
2 s( l; v6 t9 A3 j
6 R. d5 Q; X \% B$ v
# {5 H8 {1 [% c5 R5 w/ V# L 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
1 d- O3 z; @9 i
- _. L: L! g! M5 f. O# I% |7 B3 |8 h2 |5 [% O' H
5 L# ^; m1 ~' ^6 N
% \+ d' K+ a3 ]- z8 m4 z# k0 `# l! @2 Z! {; A8 [+ X+ `( Q8 I6 i! M
- K7 Z, g# q6 U! |0 r) ^3 |5 {
) i0 c/ L, O7 l, z. A0 }: P% L6 N2 F( q. g" O: N
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 8 }0 \0 [$ r/ ]2 N
; u! l! ~! K5 Q1 ]& ?% S) H) |- ?' w! t! p7 ]0 ~9 f
5 K+ f { i \' C
" v% E* m) M0 }. }0 d) {
- Y- @/ t" v* N. E3 f$ k
% D6 q8 @5 P& E: k
! T O/ s4 q/ q! s; p7 h! n# o4 [ V2 V M
8 N) g2 w* J6 l1 p; x. P! t
) s8 h0 n2 \8 J$ A3 H0 [5 ]5 ?6 @4 o& w1 m! r& p
签名信息
- b4 J; e) [ Y9 X& ?/ q 8 R j6 |% u/ F& v( t
9 G: l" s* ]* O5 R2 K7 w 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
# X$ G$ F+ z( ^! [
; @7 r. M" L' V p; I2 ^% Z r' w4 G' d [& l- c
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
) T) y9 s1 E. V1 P5 h7 o7 x6 f2 W ( w$ ?% h7 _6 \4 p+ U" m
0 T8 x* ?; g) l; S3 W0 e
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ; o$ q' F) X+ o5 v) Z9 J& _
+ b, D7 s1 r0 F2 z- y, W: o! t; m/ B+ n3 u
) ]9 b' h! G% D$ I$ @4 ?
% h/ N8 \; G1 K3 g6 l$ }& W+ ]0 S4 e% _
- N. L% x/ Y" \0 [ , Y1 s5 p/ u8 R: ?1 D& q
5 z& @. K3 G6 r
android签名的数字证书的一般都是采用 X.509的国际标准。 + F& `8 H6 A0 I7 \' Q
, C9 r: r' o* F( x! e i, u4 a0 _5 o! |
0 G) s; d+ U& ^8 u1 y. B; G6 b 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
- A! c' e: d3 O2 }( F" ^ # K# p# h/ X7 p( D( U! U$ s
, l' }$ a0 y! i" N& W0 E. L; a 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 , n5 S4 e# e! Q. R
+ e; a) Q4 j1 t. X
6 M- l; P/ m- u" m% {0 Y5 E2 ?
% i1 S2 O$ O$ R+ u- n, e
5 e" @5 e! e7 R8 j7 b. N' ^! U& n( R$ Z+ T! V
3 ]8 s& O; v" V9 S$ o
/ m' v1 D \, f
. Y, O4 N: t0 d
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
7 n7 l. e1 a. M$ Z. V( w
6 X: G6 l5 e1 [1 A. O/ V* Y! F1 Q. J3 k
; H5 L5 x/ l; I& ?( d / z. N3 b! d$ |5 X* q1 C5 Z
: u/ B' H, M( q/ L7 c- o
0 k k4 k4 [; h1 k+ N! X
、 6 G* y# w. ^$ G6 A
' H' [" q1 W) Q z, [
* \: g8 [& c; L) ]* \6 J
$ o: T' Y& r- Z
3 g {9 d' t3 S$ D$ F$ j+ Z
4 Z/ c; |* Y9 G" f3 S C
权限信息
' G! T$ o/ b) q0 L" e# f 4 G- v; h5 T: p) I* a% S& h
4 D ?8 b7 `" x 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) 9 j4 q$ o! ?' p8 @6 J# U' l$ `, C" [
% @' X y8 d g0 E8 N$ }7 _
7 l# H3 q! H. y0 a2 g android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
5 |. M& Y- i1 D' n - _3 {' G& T" }# G. ?8 N
9 P. h4 Q0 p* N; u0 D# T8 [
& Z8 n! z: I; b) ^' p! l7 D/ Z
; O/ |- n0 [ H+ ^
. R* o! N) R' M$ m1 j
6 k. v+ ~9 x9 U$ i A8 r) y7 u4 |: q
6 n3 k& W9 ~ Q# X& I9 ~
下面对这个APP的所有权限进行详解下:
8 C% b$ N% G/ A, l' i. D3 t
! ~" D" [; F4 D( Y* j R# Z- G
5 T! [# v4 G, k+ X android.permission.INTERNET :访问网络连接可能产生GPRS流量
3 z' i, B8 m1 S5 A
$ X: u2 h* D6 G) ?, K" q, p f
3 q8 h/ h) G) [, x; k) V android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
4 u6 f# p( g7 Y8 a: E
0 ~* L, L% N- h7 M+ W
. Q$ Q; i. u+ R/ Z3 L- |" Y" y! Y0 V android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
- X, Z+ A5 e7 Y' R6 g4 e% ?$ k, J 7 D; k( Q$ L1 R0 C7 w8 x) a
8 F$ D: S2 x& o, V5 d
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 ! y2 w4 t2 L& P% E3 r3 X0 }
7 M5 }. T7 B; {) e9 y8 y& z3 D! {! L% P) F! B& h
android.permission.WRITE_SMS:允许应用程序写短信内容
2 j$ x/ z0 {8 e2 p( |7 R* Z4 i6 g " m' P2 @# D7 B
. ^& I9 a S. y+ j android.permission.READ_SMS:允许应用程序读取短信内容
$ W+ _) l9 o: E7 S, V# s
' w3 |- u3 K4 ]0 w& u
6 L! `4 v1 ?0 S android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
6 ^: f, i1 l O7 k* c, ~' O5 k8 q
" X: p0 [& s* D$ d9 k
2 i1 o, J8 F' x g) y) y android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 ! X$ U; L- c/ U- w2 o$ \
7 C. i# [1 N, [
' C+ G* V5 j/ B android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 1 c @7 u' U. z$ u7 O
' C7 _1 U# H! x9 n+ t; @# O- T( U) x6 _& M+ u! ^
android.permission.VIBRATE:允许振动
0 O" W: S- A8 r+ ~$ |; i+ h 1 t+ ], u6 I, F( Z
7 C/ @# f, E( f h6 `* ` android.permission.READ_LOGS:允许程序读取系统底层日志 0 H' m6 J' T- F
5 _ [7 D. p$ T3 Z5 s, q) d; k6 p# U1 G% s6 S
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 3 `% C- {8 Y; k" m: N, w
3 R! V7 \5 t4 u( L' v* Q
3 Q3 u( p6 R! d
: |' h- X5 s( m( ~4 v
, j( T* t$ I2 F' Y6 h W# G9 s* I/ a. Q* G- L3 \2 q
功能信息
4 ]' C* S6 c; v x! d ' y5 h. Q" z& V+ h3 c# w
6 Z% N6 v: ~" Q) X- S, v) Y+ t % G' |$ [: @% M( E. ]
0 E* B; m% r* R, S) n+ B1 l
9 Q- k6 |0 e V, x1 H: n 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 8 r% y: ]6 M0 \1 j0 r' q/ {2 q
" [$ s; O0 m/ Z4 j9 |! p6 @0 e4 L
5 g! O; X K& O
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 $ B/ p2 X- W/ A8 t$ J* h5 F
! i4 a/ [' n- ^1 K3 E5 n/ ~# G0 }7 Y/ z) _
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 1 X9 F- }* N G) w; ~
1 s# {$ ^7 g1 r
# ?7 r) t* w* s' G! o 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 ' w2 P# x! T$ n% L: N
* t/ z$ |8 _+ Y" l2 P* y& J
. |7 {9 \! g/ v, r 1 M+ F% N* K* ~. }4 k
7 w/ I2 V: L! `6 m! H6 l$ y6 u' m
" H$ ]7 O% F5 I. o5 ^& H - h) F* @- Y9 u6 d% y9 z
) h7 H+ ?3 f3 t' m* R
- P7 _- {4 `; B5 @) V 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
" e: i. i$ I2 _ a, I5 L/ w ' t* g, t& d+ ~" S. d; V% R/ e
8 e; v* U4 M5 t: Y7 C6 N" Y8 t; P1 S
# V* p$ s R* ~% e) o$ H
( S/ p' Q% B9 g* S
/ O( i' n3 I7 ?8 k, ?, i1 ]8 _# U5 Y 0 | l( ^( ? O2 K0 L$ K# D
" \% l- N) z; l1 K
- B% \) _$ }) T5 `% { 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 7 P0 u0 d) Q0 O: ^
. T- D" g Z. k3 E5 K+ Y+ ` l
: U8 |3 E6 C% }& i9 I
4 t* Q; p/ k3 A/ b& m* k$ D. i : ~- o- i3 `) W G% `8 O
; i# g( O, Q2 Q$ p 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 2 a; D) i. F6 r7 e
5 j: p4 X- p/ X. C* ^! U a
q/ p/ I/ F% X0 F+ L V" F + @7 U4 U$ b. D, {. b/ s4 n# w$ t
2 o9 l; w5 k* q4 z4 n. l3 Q: I, p, n7 l5 L6 v y, X, O
' j* ~! Q( C' X: V2 f) }. R y3 e% e
6 @! g: w0 i+ @5 g; m9 N! |( ?. z
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 - l- ]7 F- q9 @! b- c$ L9 s- B
: c$ K5 K4 U' I4 _+ _
2 h0 C8 _2 A5 ^- V/ J8 i9 P/ D2 l6 b; M LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 $ _, Q) F0 \! \, f, ]6 F9 l7 r
* I8 H R* b9 g7 h! H
a. R A* S' u0 g& o
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 " L c* `, P& }( C' L( {
* [/ q# X$ E7 h6 ]
! ?* R# f9 Z% h7 q5 [* f5 L; D" ]- Z 开源的luasocket代码可以参考学习下
' N8 v4 z3 k1 b2 m; F$ U! D5 F
: F0 T B. K( ~. y: D' M/ S7 h: I* f5 K& C7 n4 g( R
https://github.com/lunarmodules/luasocket n/ g0 Z1 q3 H
# {- q& n! c) v6 M
" t/ c7 d. E, h( z: m0 S https://github.com/fengye/luasocket ( {- d5 D4 B1 ~" x0 a0 Z" b
% C& R. Q; p: ?+ n; s" f$ D! ~0 u/ ]; ~+ m) m" e9 z7 e. K
- i0 a" Q' d E) w. G7 n
8 S6 [+ B" X9 A% k( r3 Z
4 j3 L/ T0 a& n. z; t6 J' K+ z r t
" X2 }: o: q/ }) C6 H
/ i) Z# ~1 E1 ]) N7 `
# H4 k, s# O( m) \: \& _" U! h
( s7 M8 }' o+ c: {' Z) e- O0 _
6 Z# D& p# \1 Q7 Q6 I+ K3 Q. N
. X8 x1 Y! D! z5 D& D1 O1 J( X
7 j) j* C- Y5 S- U' p' }( N
& b- T: ?6 T# p7 e3 p7 ~2 r
" A5 k ~2 q8 }+ v3 Z+ o+ _5 g 总结
7 D+ `$ p+ w, F! v 2 Z- P- |* I" V
- T0 k+ U8 |1 o5 D& R3 A 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
/ y+ r5 |1 c* t5 W* S' A+ o- z
. ?' X7 Y- t; c, i% V" ~; T" x, r: l& f9 u i2 X d
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
# m6 N! T8 D4 J6 k* w2 Z$ b. w' z 2 Z4 N8 X0 \1 k2 ]# [
( `6 G4 H+ c9 q% ?8 }& T
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
" {% n+ w( {' } ) I5 A6 Z' G" c3 h. ]- ]
) y" w$ e/ g' L& y
结束
9 U5 `, A3 Z; `( T# m* j6 @
! \, C4 p& ^- q8 f& z
# J0 A2 |! T* w2 O( b: p9 |; X0 M$ p 【推荐阅读】
/ x& H$ t) \! \3 r
6 L* n4 r! A* m) T
) _2 x/ I3 k3 }0 b 对吃鸡APP的分析 2 i/ I7 f/ _ K2 _: @) V+ e& C3 v
- @0 V/ Z, b, t' S. e
; e3 l9 G; o+ T5 N* r, l: d; @6 R 你需要了解的APP安全
N2 Z1 W( F9 K9 f/ a
" O; @3 k4 |/ e6 [" `0 e: E6 m6 I; _# l! }( U' o
你需要了解的APP安全
% s, \: W) V, K: \: q
4 y0 r8 U; S# p
( F% a& o( z7 ?' U: Z
5 n; ]% _$ G3 j/ f. X. G5 P |