+ Y1 a7 R! z9 E- v5 @' R
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 / a! }/ j1 o& p
+ e! K4 }% q8 s# a- `: C5 O4 W, |
% x3 r2 i, _( w/ F! {' Y
- P! g" q. [, C3 K: ~7 V. P
, ~$ r) C9 J- C. v3 L' a) `- x( S" m" u. l
1 z0 [, C- v2 y% t2 z
: H: N4 q8 b) X. {4 n5 C* ?5 [9 i
下面就以开发者角度进行解析下这个APP的功能的实现原理。 9 r8 j5 A! V' e/ B4 U
& O' `. q/ z) ?% c G
: m; A$ ?' T& b1 ^5 L* g' z5 O( ?) g
3 O# W' x1 V8 Y' d) c & t. Q% x# S( B) O7 A; r; d( ]
' G* v; \! S+ ^8 E2 I& k3 s$ L2 R. Y
基础信息 8 w/ N; r8 ?) c3 G. [; ?) ]* s
m- }$ d$ I: l I# O- X2 z1 }
, k( W( Q9 y. l0 H+ Z7 q
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 5 f# y) Y+ J! m$ ]
: @( L+ U$ P- b, r7 J) |
7 b7 f; _8 F5 u8 \( w
/ a, X! w! X0 ^ # z) @6 P7 n) d" w/ T0 s- C- a) V
/ n) ]0 y& k: \' m, ^3 D, {7 w
4 J) `, U8 k+ g, ^, i! s- ^" m8 N0 ?
j9 _! f% V+ X; ^) m6 T' V2 r
6 y+ m" r2 S' V" P+ w" E 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
1 w8 h7 R# ~$ r4 w5 N) F T+ I3 g" e 5 D& d- u" F/ d" p
' g+ C+ X) e* F |6 I, \! o
/ |( V( b, C! t( d5 o4 N 0 o* U6 Q, E2 R. f
% o+ U4 w$ h7 x
# [+ s, b1 \% Q8 y- i" n
& E3 x( d3 }! Z8 p
& k# p. T1 {6 v
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 0 K; B$ c0 {/ B( @; n0 F: `( o8 _
9 K! A. u# y! L; x, ], Y
7 |# P1 b7 i! P3 h2 c
% j0 v. j* n. T8 }! `( g
S" x9 P* P* a1 Y6 Y# W
: F0 ?% ~& i6 j6 Z( I+ q
# r6 h- \4 `( p' G+ m) Y ( B. I8 q" z, u! O
q/ f1 r, h5 ]. s# C
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
' g' Z' B/ H% }; c* t8 t
+ K- C) Y) H* c# i1 x7 |' R- t8 R _1 @1 p1 ]- L8 G5 \2 A' t
8 s" p, g! U6 a" Y6 n6 ?5 I
- c2 Y4 n/ m3 X- X- M7 d# N
% U: L0 ^1 Q! L& s) r3 u+ E
* t; O' ^: m( g) t: b0 B" o; j
' P" P! Q8 P7 O% v: A. i
7 ]' d" h i& T6 I, m9 t8 b( x# F 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
1 q, q* X+ x; q; \2 w
0 S7 w# c, A4 O8 k! x% C+ c- L( p$ G
: R& k' M' P/ Q! _) d
+ e: P% G4 a) H. G% z) I! D [% Y5 }( f
: ~: K A- Q8 x6 c/ F/ d: U/ P $ ]/ N/ C0 V3 n, }6 o
* Z: N' B: s' o1 I4 d2 N5 ?
- L1 G4 _4 Z$ t7 w' m0 g
! T9 h% ]0 e2 t @: A4 i$ b+ W) q! l/ s5 `( I6 P7 d
签名信息 ; h n/ i9 u( m+ D) g7 S
- f+ v# t; B) E$ C8 f7 [
. `' w1 m& m/ z: k; p
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
: A# U( G" h7 F2 I$ ?( u$ M
* ^6 @& X" P+ A' u' d, T$ t/ F, N) t* x* c. g/ @
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 ( A4 D R \1 N4 s4 }0 Z
$ Z" J" B [5 @! o4 ?
. h$ Z2 C, E8 o) _& [
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
& k% q1 b; [. l$ Q5 f
& G. A0 P1 N; o4 Q" m" K- x* [ B' x) l# B8 ~2 G
8 F9 t7 x7 Z5 P# M$ u6 O
. |: b$ U% F1 Y! H9 l: V
4 d" B8 W" o0 g5 T8 n1 e& A3 N
0 m# z) Z( Y: R6 ` j* ]
: P% ~9 s+ ^! r) {2 B8 K% a$ \
+ D/ i' m# p" X. E android签名的数字证书的一般都是采用 X.509的国际标准。
4 u2 l- L9 l5 r1 o+ j * w; ?% j2 n% m4 r) z( q1 d& w9 G
! s& y8 m8 z) w! \ 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
+ _8 p$ \/ @. a& p 7 {3 {4 Q p9 u# o6 k: E
4 f. T7 B8 y# }) s! ]" ` 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 ( }5 U, \8 Q: y$ e
2 v' D- D3 ]3 h. J
6 d& _% U* v: N7 z! I
7 y# [ G6 H6 u. ?8 p+ [* ~3 b0 k
( L1 M% M) m) V, h, J) p. y* d
4 ^ J# v( ~7 f/ ?# ?+ F* x8 l
, T4 C9 \2 d9 Q: ]* G) o9 i! A5 u- T
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 8 J7 Y2 u$ b# T* k& e. k' M
) ?8 | F+ s w; \/ Q* e) M: Y; D/ |5 H `3 H' d; I
& N3 [+ X4 [7 N( r% f1 \
7 @- H" M6 r; I# i
8 k8 ]# `: v3 `$ ~# f$ N 、 + }# T4 e# F1 g% }# y1 {, }
4 F m8 ]# x* b1 L+ x( ^) H( `5 }% w; C
0 Q- Y( }2 F& k% e
" u* }+ x1 `3 `- M: L* q
. j$ d# g& W2 j; j) m. L$ } 权限信息
; c+ D# T6 [9 Y% |/ P X
/ Q7 b% `4 u' @ U5 \ g6 t& v: @# \- U8 u j* }1 h
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
3 C! C( `: h& L: f% l! C ! `5 M$ j1 G1 e1 P' S
" H8 s2 g9 b! H/ j1 G
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
4 P8 f7 c7 h$ Q5 z, Y% W5 p 1 E) s7 b) F" I7 t7 D* Z+ U |- d. r
' F8 {1 b& v9 \: g9 {/ \, r S
. R4 E, X+ ?' u0 D+ I5 k6 K6 P + C+ M% Z, \+ |; Z( c# y. r! z
- C* {# ]7 j5 s/ l% _6 ^
1 R8 Z2 X% M" q5 o0 P' S2 P - t+ n: ~7 S, f( Z8 m. X5 k; E G
4 L& B& }" f$ Y" K) K0 L
下面对这个APP的所有权限进行详解下: - }$ h: S" e' R4 J3 b. b
% e9 M6 j9 `& s1 \+ E' u
% ^( ?% y; t4 r! _& G, Q$ t8 |
android.permission.INTERNET :访问网络连接可能产生GPRS流量 3 f5 R; X- Z! Y0 Y% F9 L5 M- Y. k* M3 A
' P, Q1 S4 B0 W! Y+ `1 ]9 X
2 k, _2 ^; h" N/ ~- `! ^! t# V; t, c android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 * P* T8 u2 M# z. b6 o
+ r k. M S3 h+ S* u: r3 ~7 w6 n: `% p& H7 d& v
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 ; ?! c- ^5 [; Q9 ?
- Z: k5 \: F* {' _1 ^9 x5 P
% p7 K/ U* n! z6 t
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 - U( b' H1 ]- r
5 H8 k- } J. T! q' B( g0 m
: y( m3 U# e+ ?; J$ p& |; P
android.permission.WRITE_SMS:允许应用程序写短信内容
" B( i( N& q! @8 b& d
1 L* o n. E) [: t/ Y* h' }
3 ~ b9 a& T& w; L7 l% D android.permission.READ_SMS:允许应用程序读取短信内容 / d9 r5 W. }5 g/ j
1 |% x, e3 l4 [
Q2 e# V7 d* c! j6 K android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
* _% Y5 n8 E5 u" h( s0 b2 ^) h; L 5 M1 }3 ^5 m5 G4 U7 V+ m! M' E" D
0 V$ S* K, l. J5 d G7 O5 O+ e& T! M android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
: I# I. W8 X: c9 l
8 c' N$ Q+ ], C! o) z w5 J% N+ A- e0 ~* f
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
! R2 p# a) ?0 `) d' Q 0 A, u( N, R: t+ W$ E
- P' A0 T. a* ]( v( H- Z! E! Q android.permission.VIBRATE:允许振动
1 ~0 {% L' Q* I: t
% P% \8 E0 M; W! z1 G# [
% {4 \! P/ I: { android.permission.READ_LOGS:允许程序读取系统底层日志 - z/ r1 B( g3 d+ v1 D' [
- K5 _7 c% ?# R9 W
: }: [( b$ _- c# m
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
" l& x3 Y( v& l6 y' t
& k! l9 ?& \% [5 a9 a v- K1 j
& M. [- C B6 Q' a: H + d$ |- T( z2 G" H4 a
; W; a# U* W" G
/ x% Q5 ^: p) p- Z( i* N 功能信息 & l6 n+ O/ H& b+ J% T! e9 ^
" @6 K5 b! c: E* V. C- s" j' _$ e
. C% t' K. E' |3 W6 m3 F 7 M; n( w r- h4 G8 B& i
8 K3 L P1 S7 v4 p+ j9 x! I3 D, \5 u
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
: d7 b; _* L+ T; j
0 G' H- t1 `( G3 E6 @" i* O. B8 k; n) K9 F% h3 R
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
* a O: b/ {; P. o7 Y2 X- ^ % f. p* i+ y9 j" R" {7 q' S
- ~+ i$ @5 E. E- i! K& _
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
o R( D0 m2 i7 Q/ p9 Z , E: q0 H% ]9 Z7 A; C- R) `. x
$ _2 ^. t, h- k4 v. e6 I+ t1 G
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
! ?+ u t$ U1 { ' W, _1 v& x5 x0 k l- p
( [1 c* Z2 @' H; f% I2 \8 P
9 U; D& G, l) i& S& V
/ X% f5 c* y8 Y; |, ^4 E
/ M# b' d1 w; Q
) ?5 Z. j! U- L+ @4 O1 a 2 A$ h) u! j, Q1 T
, Z, C& \/ K- h* }* H
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 5 }5 O! b8 n) G* C7 J
. p, Y4 y; ~+ W* j1 \9 j: i7 E5 h) J4 d7 |; q8 J3 w+ C& B0 z h
# p% ~% b) K" j9 @0 b ) D. j$ N9 I1 I4 ? H( R
( k4 k% N7 N0 U# B
2 Z% o: n* k5 B & `! p! _' E f! H# H& g4 ?# G; f6 w8 l
1 f( _* `9 h, w: S: H8 a1 L8 x
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
& v* R) y3 _; F6 k; x& V! v& \* @% [
+ k3 t& |3 Q9 A! @/ ]7 x; w" {
9 |0 X9 j* s, Q5 b, z5 n ) }7 |5 G( N- K$ c7 G P/ ?
7 E* }2 \, y- x( P [' I/ r* ]
/ _( m$ ^$ `8 s; @5 [ 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 " x9 I, Y# y. T& g& t
0 A: r5 z$ T6 L0 _! D
9 m) S: a, D7 l! ?( u# x5 @1 p5 g+ P7 [
' T( Q3 j; {9 Y4 O- z8 \
5 F h" {9 {8 O% @' I, x& O% l+ i5 y- K, k! P: o+ w) q
; L1 Y b( m( c
6 J: T. A4 f6 e$ T1 _& n
4 A1 p. k5 S* _# P
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
0 G [1 Q* t) F1 U ; G; t: L7 a. G8 K: E6 s8 B
: U d2 b, T( c LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 * E' E' {9 {, P* |( F
# h1 y4 e. {; g" j/ ^4 f) H. C$ O; W
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
+ b, W1 G0 y4 s/ ?. f% s6 g/ [ 5 A" [2 r( m8 C4 W4 k; V5 d
0 p% V1 t8 `# R; Z; ?
开源的luasocket代码可以参考学习下
7 z i1 k& @' H1 W! x7 g & k' Y5 m& E8 i( L
4 b! u) |8 E, o9 C
https://github.com/lunarmodules/luasocket
; f3 l. A4 k1 Y6 r W! ]! H. b5 L ! r" ^: `9 u/ ^1 d
( U& O, ]2 t t% c. F2 N2 h https://github.com/fengye/luasocket
5 S s. L8 q2 ` 5 U6 P8 f, ?/ u1 P
0 b/ C/ b i" j* Y1 T1 S) X/ ]
& z4 k& E) P8 ~0 \4 y0 w& G* L ' Y" [. |. g" l
* [3 R' q6 _6 j% w+ w
. v# Y7 t8 l2 L* \5 Z, m 8 N" b; |. \; V P3 D
( J$ G1 c, \$ {6 m' m6 X% X
6 c- Y0 M7 M3 w4 d# H
# ?- o& J6 v/ w2 j/ [
# X) e' X; B/ ^) J7 `2 S
; N, P% B& e8 k) w $ Z1 E# `: N! R: \" O& ]; P
( ^; z8 [: m$ G6 @3 L8 b
总结 / S& L+ G5 _$ G2 t$ V4 h9 X- H
d/ F9 @! w& \) M; X
. Y' j) J# f' O* m
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 , G( p9 ^1 \% g1 U3 p
- r* s9 ?/ P$ o2 o" ]5 r+ H& Q
# q: x- E" x; s" c3 p* O# E 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 + A9 j' o) G9 I6 n9 |1 G9 z
4 I f- q# A/ J1 g, G' [( l4 W# u3 y' C6 S" O9 a
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ( d9 R& m/ t! S0 i5 f8 ~
/ s8 l7 z* H' u, N3 @) P; t
( D$ ]4 \( u4 J" @+ e& d2 P 结束
! ]6 Z2 C- D+ K
4 ^/ T* _0 \% I) F* S+ g h$ b g* z: F* P/ ?3 U
【推荐阅读】
8 z. ?! v0 w3 k" d, X) D6 [: o : w- z9 U( |; o
4 I; Z, R: e4 x7 d( E0 Q2 W 对吃鸡APP的分析 7 X) K4 S! L+ P& y# Q2 I
4 @0 ]1 g/ O, O- t8 z1 y
! K! p/ _0 G3 U# g8 K
你需要了解的APP安全 ' u6 v2 C0 m/ i& }
4 U2 @0 O1 ?6 i5 B6 \! M
: P+ @8 [% {% g, r# `6 V6 o7 v# Q
你需要了解的APP安全 % B- t0 Y/ _( U& x
( e9 J8 h8 p7 ^: l( }) J
9 a) |$ X. j0 H) @# p$ u# m
9 o. r# u6 q" v# }# Q/ D |