' {4 t% z8 t' e+ W1 r1 z7 {/ R# R
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 0 }2 N- X6 A) b: W% k
3 l# Y8 _. ^4 V0 j+ {0 b& c
a, P5 z! r5 X7 ~' l1 j ~
+ E( Q9 x0 @3 q8 F" T1 A
' e5 y7 @$ j) w0 Q5 E
' r! }+ H; O# ?: F* q; q6 `
+ m; n8 `' i0 n ( t! z; w9 e* B$ w
* A: d7 g5 K" \' j, B- x
下面就以开发者角度进行解析下这个APP的功能的实现原理。
3 d2 s1 P% A" D& r) f ' E; {' s1 u7 q& B9 Z+ n
) E, L7 U; S# u, C
9 D9 B4 n! E3 t2 n. b5 m
5 p8 R) n: x- K" Z% W/ v' b" I ?+ J2 P- C
基础信息 8 b" I+ P9 a9 ?1 `/ K
' H9 L. c& L2 r( k
* n' q. R, S5 U+ M7 S$ a/ c
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
: b/ y: L4 a5 P
' {, A$ _2 \+ T
4 J: C9 X$ D5 V: k! U3 F8 J . d) f2 ?+ t; l6 ~9 q, ]+ z; s& |$ c
Y' k7 U9 m1 I& S. S p. l( G; ~
) G( \3 r& X; [3 v; L : x/ d( E/ ^5 v
3 I5 }3 r- l5 X: S3 b
1 r4 Z' M1 W& J- a- _5 |. j1 d
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
4 H% n4 g% T+ b9 Q# {
; U4 t& w) S) C& d% O. ~: p/ r& z$ o. \
% [% g2 M( G2 ?( K! A7 Y9 f6 V: s
F8 x8 M! j7 C: x Y c2 A. O( ^; i7 A, y d8 Y# r5 A
" w# V# _/ G, x, n6 g( K 9 S+ n& l5 }* i% ]4 w x
! x6 Q3 J6 _" y* B
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 * N, q, B. R/ |+ G4 _
! G& c. A# k2 X0 v1 `2 }, \$ s9 S6 A
0 S2 {5 s4 `- k9 P) S
: W: J' c7 A( G- T8 q/ x% H a+ T
2 T! S/ d% {4 Z8 ?
- O8 Z3 \* v" b % B' z- ^' k q A
( j( {5 `. @ W% `4 l& P 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 7 H$ _( D; e' ~2 D) B. t2 \ k
4 s K2 W7 J/ M5 f0 R
% O# @2 @/ D) q, ^$ O0 a) `1 ?
3 I+ q6 ` b8 ~' t( x$ L6 w
, z m4 E* a' { Y6 b7 z n
8 w4 ^2 ~- [9 d: _' e2 J , c M* G& G2 R$ C! Q
5 p8 o9 l* c( C- J& a3 Y$ @3 }) r- f: J3 @
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 " w: X. u- ~- f+ u5 W% g9 Z3 m
" V1 o v# |5 ]) |. Q& b$ {
0 u# N+ @) ~ P9 s$ M d$ H 4 J0 U% J; I6 w; ], b& M
" K+ J. l' R% m; h" c$ i* l5 s
9 V/ E, Y2 a S/ L
1 T# h1 { R' L) _- }& q ) @+ P, U3 a% ]& e7 u# \
6 z; A+ y9 Z) o 5 q: `7 u7 W. x1 X: I
" @' ]7 b/ l# \0 c+ }3 r8 k! m
* O: `# q$ ~- [- }+ T
签名信息
8 `" Z* x5 r2 }1 |7 f . @5 f9 O6 t! t8 |. p- c- e
, q6 ]( g/ l: y 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 5 f0 U7 q0 U2 S4 n( G
4 j, L% L( U7 O
7 `6 R+ ?6 I, c( n+ v
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 1 ~& `/ S- o# C7 S& h
$ i; I" n. o7 `
6 m" p! Q7 K) J! O) S6 Z( t: Y
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 7 l5 z2 {/ r( m" \* B9 g9 ~; `5 Q
' G2 k0 _. @& m8 n2 J
y4 g2 s5 W6 o4 ?- m
! O" L" |2 b, [5 ]6 L
! j2 X& }6 k6 F, ~' a! c9 J. n1 X$ T7 H
- S$ G9 u8 M! F" ~ 3 E7 g+ w9 Y3 D7 |; F- [2 \
6 K1 w: H& J+ x
android签名的数字证书的一般都是采用 X.509的国际标准。
% ?& d7 D( P* `% r! M 9 ]7 y; Z6 Z7 n7 s, j7 m3 ?/ p
% K2 A+ ]5 }& h, j- o1 J* p2 u
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
/ k' u+ H7 o$ P ! Q6 G- F4 s( l- V3 u
/ A- {0 f: ~6 V r 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
- g% q; u- W7 o5 v4 B9 J 3 H! }, J; X5 H$ E
- _% Y, ~3 Q' K
/ q c! h4 E+ \( }! q - H0 f" D: {; e: O# R# K
. k: y1 A" I- A5 n
- ^: Q, ^( h1 ~% [5 j+ ^
+ j0 O) M2 P1 R: O5 @, p0 W$ m
* A5 `2 O/ z' G, w# _+ ` 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
+ [) u/ o n7 M
3 E, s5 Z- {# B6 q& M4 R N
: Y2 b( i6 j; d8 ?4 }9 o; p/ G7 j/ o
6 Z6 z7 S9 W) q
' b9 J: d8 x1 A/ f4 O$ a0 a; [: K% Q9 n' {
、 9 I5 @6 ~3 c3 [
0 l9 \. G7 V1 ^. r. j/ o0 S
+ {# `5 H/ F, Z0 i- R" A7 h2 o' I. O
) ~6 ~& t0 S0 A8 Y ) Y' T1 I9 z+ s' T& J m
% B( J& F3 J6 [2 `2 t
权限信息 - X% p6 A# a5 b% S) M) K+ T
1 h0 B( K) _8 T. M& W8 W+ \8 I- p: B+ K+ o
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) 2 q5 X1 v7 Z; L( a# h# L: X1 |
- j1 ?" y" j3 b$ O u3 o& V- G/ l. _' h% p
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 - p$ v O" |. P1 \
7 l) C* W. A8 D/ p9 t- R+ b L. J0 C# d, z) @
* [( C& \9 V* _! c
3 R1 O, L1 Y$ l
) g& N/ ~6 |' Y5 H, A
' P# M' j: Z o) ?- ^
" |9 \) V4 P4 C+ ^" E6 j3 B/ V" V+ F/ ^& {3 ] E
下面对这个APP的所有权限进行详解下: ( z9 H1 y! L& Y5 o& o
X7 ?" m+ e! c g" Z
( @8 U+ Q+ E5 b5 T+ U) {/ W android.permission.INTERNET :访问网络连接可能产生GPRS流量
G- V$ ]7 _ m9 h+ o & m, k- C1 [" A/ u2 \$ o
8 V2 }' F0 {2 e) ~
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 ! k" r9 c. i- J! I, \, l
3 n6 e0 ~" X, {7 {6 k8 U! w) Y
) }1 m `, D% ?2 \! I5 i android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 $ d* g% y+ h$ h; ?
. z' i( ?' U; V# A. y% r
6 @9 M# q- N2 Q( { @4 ] ] android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
1 N; L: R0 u! z9 R1 C ( l/ p+ e; _$ q3 ~! D4 o" E; D
( f: W. Q" w2 m+ _; U2 e5 K$ x android.permission.WRITE_SMS:允许应用程序写短信内容 5 P2 O3 s: i: o: y# q" o2 \
6 J7 g! o: x) I" ~
, b. y6 u/ n+ C6 Y android.permission.READ_SMS:允许应用程序读取短信内容 % \) H6 @: f5 |# b
! t. U8 F3 g5 ^
. z* e S6 S+ A/ m android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
0 a" R$ |4 Q- y# e% X$ W& _ 4 O/ b' C. \4 z7 f2 t
: L. v2 o' O2 w4 U5 y android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 8 S" E7 m' J$ f" s& H
& ], ?8 Q4 r+ `5 ~; J. [
; Y6 |7 @/ J. ^* \ android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
5 X: \6 J3 O% y5 ?! ^ 3 _+ R6 K& y9 h8 b$ _5 k; X
& w7 n3 J3 ^; l `0 \0 h V# _
android.permission.VIBRATE:允许振动 ! k$ V) T* R7 g
0 _- h% W$ A+ {( w; j+ }- f6 o
4 t6 [6 ~ v- V4 e2 B y
android.permission.READ_LOGS:允许程序读取系统底层日志 " H7 X) u% H4 A- ^6 X
0 `) b, {$ C/ Q& L
* @3 N2 s* N$ H
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 6 [) I1 H# ~9 {: }, L5 j# a
+ c# t. h: S! Y1 ]9 n4 _3 _; B) ^5 e# d- v' B; ^
4 M3 |: D5 r4 X7 K7 ?9 O6 G
! e1 b2 ?' i. G9 L1 Q! _" J0 T1 ?& r( R8 w' {% u* i
功能信息
: B; X$ C: _8 v& W- v' s& n! m $ k" x1 z# o: {$ _( d
* y2 U- p+ f$ O' e% E* O
4 v6 x: t# F/ S) B. U% r0 I; q
" A; v1 T) ]5 b+ ]
0 Q- W2 Y2 j4 Z& ~; g* _4 d, Y 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
& m6 }* e4 `- m6 ? 1 z9 X) `1 t) x4 h
) v/ i7 V( R' J Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
, _. _7 A/ x+ h* [9 J# ~- a/ ? 1 q8 `, _) ?* O
* _5 V! d- f: `" B- M9 n0 g 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
' w- u0 {/ g* `9 g7 F5 f 5 e" R/ Q* S( W9 U
/ j5 S6 J7 I$ z2 D$ U5 \5 f! \ 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 $ S4 m# P: {& ^* S9 @1 G
% J$ c \ h- [. |/ A7 \( D- h u" y
6 w! h) Y \5 J% E# B1 ^: I
/ D0 H2 j# r# H - f2 e- _, O3 W3 z# ]
- _7 F1 G+ S) |0 Q6 }0 S4 y3 l7 e
# x, x! H& l- L3 y
( G& [8 m" i! Y% A
9 E6 V& y' m1 V+ C- }. {- k7 H9 J 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ; H# [3 h) q8 [/ b, V) J
/ Z: E$ W- N& x) E/ M5 r- H
l( o8 t: O( V
; h6 ]5 K( D0 X8 d+ n! G" u
' C. e, k0 k- |( i! e- T# c& U
4 M, c6 k# l( [4 h * t+ n" `+ R6 J) [8 T% c
c. J# O7 v4 @1 p7 {
0 J5 a3 b4 o$ h) c4 |9 E$ D 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 + j/ X9 ^% @6 k6 ^0 S
; O1 l( e3 g5 |2 U' o5 Y
. B8 s- t5 t7 j) z5 o
- r( c+ b- H+ q
6 \( j$ V s/ U
) o/ N; t. E6 U! V. q( I1 w8 z 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 , O" |# f8 y; J& u# ?7 y
# u5 r' X$ x& n& M7 }" _% ^
4 a5 V5 E- ]+ \/ h$ @ " f; R: A% { ]: m F
: ]* z2 L" u( W e0 o r3 h3 Z9 y9 U# J# g0 g
% A" @! a( Y% n# ]. R. I 9 J1 C% o: j/ O% g, k
+ h y. m3 A# o1 D+ c8 w, V, V C
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 7 r: b! _ C- G* T/ y* W. v+ t
0 W; f; m' ]. j5 E- s& P; b# C9 i% [1 H) z9 }
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
1 n Y% d& F% P3 O+ r! G. t1 _
/ N8 ~! b( U. _
~2 h% X. v- k 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
( b; B! B3 y. q5 y. t+ X3 ]- W
7 ^# r' D: D/ S5 k9 @: H1 G1 F3 m/ I$ o: o$ `# x! O+ D0 h& _% @) Z
开源的luasocket代码可以参考学习下
& M& J: ]8 y3 z2 k# y7 ] ; m' M: n; }+ @: r+ Y, P6 _
/ F( s" Y3 J" f0 x9 P https://github.com/lunarmodules/luasocket
6 t9 W' G+ n" x3 t- X, l
1 k! J7 A7 c) e+ c C) p! \: {: X. g9 N; G$ b
https://github.com/fengye/luasocket 2 r8 y/ o4 ?3 f. B5 y5 s3 Q
! d: b7 S) J5 G% f" G! Z+ I3 p6 S8 f; r) m
# a, v6 B- X8 l4 w7 h
; |: w9 a* Q! }# s- W3 W6 |
) u0 M, a* v( |6 U
& V& P _. ?# u( N- J' i7 N
# F" }' r* ^) _- V) o
& U6 a3 e e8 F! C* p
# l7 I" I; f' p/ S# \. g 6 k5 [# ~: }" L! [5 a K
1 G6 p; j# R/ Y r* ?: A
* d5 ]8 j" S% d0 _2 s j1 \
- V+ `% H- N. I% m5 I z2 ?1 A8 [
' V- u& o, g( y3 A% Y 总结
( t$ \! o* L p: q9 N' U
. C* o/ U3 M6 G9 a& B; G: ~' [( u; ~; c$ u4 X& E% N" w
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
# {* z, G# r5 z' W6 _! p 8 w& p5 e$ t+ m5 X, h
7 c+ c! z7 ]% l) U
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
- e( o0 _' H9 j* W. B: T / B3 ^) N9 D) C, S/ j
6 p: A$ e P, L0 Y" P& h# W. r
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
6 S4 u* ?- {8 m" W% q4 R. Y
3 |& \ ~0 k9 y6 J: I E
. Y! U2 h/ y2 C/ u3 P 结束
2 j- r. H* A) D- O3 w
% M7 }2 o" N! L& c( Y' s. s8 o) j$ D. s: Z- b- Z. x3 T
【推荐阅读】 1 X2 t g2 I2 D" m' v" `
. e* c4 Q# D3 D+ [
: f, i8 Z! l' k7 J# [' E
对吃鸡APP的分析 ; I4 J$ u& l, W
. W& m9 ]: u" o' a2 p7 h" @ h: B( P8 S n) `7 L
你需要了解的APP安全
) g0 S' N4 }0 V' Z 6 P6 I. u2 \( [2 N O
2 g! g8 D* r" [3 H
你需要了解的APP安全
1 u. c' `4 _4 a: T% M
0 B& @$ U j+ [7 A6 a% K5 e: G/ B5 W2 p: E
6 z# m$ O. }4 d; P2 M |