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