( A3 e- F, k( D! ], ?0 r0 s; x* ^
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
$ p9 _9 [) B# H2 l & s6 f, x& \5 [7 @0 }6 }9 G X' Z
* X3 K* }' i7 d% K0 `
7 ?" S9 C* G9 m
5 N+ j1 e; {7 Z8 a
+ U" ]+ [% i5 K; e% [
- \' L+ j* a9 U: q5 M: Y+ T7 J
: T! B: x3 r: I4 ^/ A
* F; M. N* s5 o$ D' @0 f. m! Z 下面就以开发者角度进行解析下这个APP的功能的实现原理。
+ ?# ^# ~2 \6 X+ @$ ~% n% Q ( k) o$ `) y! \
9 f% z W8 }+ K6 x: h
! }+ h$ D9 G! s. e0 G& H @ : w, \& [' J1 Z4 J& x
7 r/ h8 T$ R: U 基础信息
- Y; q+ O/ o. c) S0 H! d3 F7 o( e, G ( a* G C; F8 l- j: e
. G; u6 \8 q3 z0 ` 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
/ S' ~7 X6 H, n# H 7 J; o# p: a8 q1 p9 _
# J) v% k7 x' o 6 s- w6 N$ G1 t4 M: ], ^. z
5 J" \: q, A% n: P8 |2 W; ~
8 v# g( Z8 M4 ?% f( R; A, e
% j0 r @% I: J
9 B; v* m' p1 \! N0 K3 K; C5 W; N, F% o4 B- V+ P
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
5 ~" D) q# t7 O9 e1 k7 T
. Q7 b0 q' `- g8 V; x1 u) r0 K! R! H$ A" T; U3 q% q5 c' w
% N9 S7 n2 |2 x1 d ( A4 H. F9 {5 T1 R8 ^; i; u( R* ?6 |; }
h# ^1 }8 n+ _8 J$ J0 e
' l0 K; G' ?% u6 C& d . Z" }- Z9 m" ^) y% h
- g- f5 Z8 t0 V0 U! |' W
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
3 [) m4 h' T$ [' v, b ! f! r. K; z4 M5 o) P1 a+ B3 Z! y
8 r) L' \* _ u8 V; s
' H0 [, A4 ~4 f ]/ c" a( j
' `% m9 m7 k, x% i/ l" M
9 n0 ^: e! Y, y7 h5 B& y
" C8 L* {1 J1 k% S ) C7 t4 c' U1 F- a
$ [- X2 Q5 P3 n( Z( b
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 : `0 m9 @6 ^9 S) d, E9 @+ l# q
+ q; o+ D! z( n
) W$ d# K" T% k) p
( e; [1 m- T/ u, w' Q! r6 | + L$ H8 l2 K' Y0 {5 ?: Q8 ]
4 Z$ J0 D$ d5 `" k9 E7 H # C) b) V: M- O; v7 v
; U! h# _6 W% V+ h; ]# W
1 c) e5 Q+ P) k/ C& C. X
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 / p4 z! R8 I: t9 c; ]1 z5 K
2 _1 J" @( W8 D* x" O* x% o" _5 h' v
, @& g( E* U% H5 y* w. @
1 n9 F* i, h+ @9 \" p* l" Y4 W B0 j" b$ N' {& ~
" j( {8 N! g# w 3 @" p* V; P, R+ \! b2 i5 s
* |! @5 L, m' ~. E8 R2 r* J
# r, |% p0 w! X x
9 k6 c: u9 ?* N" m$ z $ H. `- t8 {* Y& `1 S4 _' L
: y! }* d1 I+ ]: q4 a, V3 Y 签名信息
- |& `; S& ^8 D9 `3 G
$ U* R+ C0 i- D" K. Q* o# t$ y' J7 X0 z; b5 m5 J" A' ]# X
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 ! D2 w& {5 U% @0 s3 @( P/ N/ P* T
5 V1 u) r) |: j( g5 b8 S; w
+ C) ^/ [9 j d: [% z! I 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 5 m7 Z# X( D/ n% ~. q: F
4 `7 K1 m# O; b2 I2 w& X; B6 L1 j; j' R
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ; a$ P' [/ E5 B8 T1 t9 V6 y; E
" p; e; v' M4 i* L! v' E
4 f+ E+ N( G5 [ ~: q/ h
6 Q2 t( W5 U4 m: O( m. k9 V0 y
! l+ Q, k) e) t9 P# }8 X9 @& E
7 b6 h, t# E0 w' L$ o' |
! } l$ p- C3 v \- } 2 |$ S8 s/ ?4 i7 D+ o+ @
2 y6 L K5 n. a9 n1 G! h
android签名的数字证书的一般都是采用 X.509的国际标准。 7 x# O* y; }/ a. Q
& r4 q; m& G, g
7 `( f& V1 i; C
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
0 U2 v5 \# ?( @0 m2 T & J4 Z. l/ C9 d1 m5 |4 v& p
2 a% F1 p# h7 @0 [
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
1 X6 d7 C; Q2 z$ C2 x o0 W" p
! J) D' ?6 N' l: A: n- O4 y( T! }0 O% G
7 p% B# ]) x# p; @ 5 G% q% V7 V& q
! Z4 c6 k, C0 c: a T
! e2 z' J0 N( B% ^! I
2 O7 p$ V% z/ T3 I* l( Z8 q
5 `7 A3 E( W: G! j1 y2 y! E
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 " S: e5 s9 `0 S) _
2 q" w3 o/ H; M( `3 H. Q3 S
/ O) d* z" `' x) u
& V9 z: H" ^3 Y/ N n! w
* p) N5 \9 d- D) a1 ]8 d n1 L6 T7 X! X) [# K* |( r" ?* r! @
、 1 S. ]1 l8 _, ]- F C1 c* I0 R- F' K/ A
; S( t. L- U' Y; n3 @
8 H e" A S3 u5 z, b
" Q! z$ |, S2 @( G - E1 f1 f/ J% } m( X5 m
}0 H: n( V9 D. n* b* q 权限信息
/ }- a' R+ k! S* b
, r: F- H3 u- a
1 S' b9 n( D5 y6 q 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
; Y: D$ z$ c W0 Q0 c/ `0 \ # c/ A1 B) N: z8 B7 ^
, v5 P/ m, \0 C" M4 g# }( U8 j+ f
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
) C1 v8 _3 _8 \) J
5 b6 D, ~7 k, X6 U1 z/ M
M& i3 S8 g6 z4 I1 p 7 u& E7 U1 @3 U2 V( r& J. J3 M
" P0 _5 E9 P: j4 z8 P
6 I4 @' R# D9 v2 I* H7 B4 R; C5 G
! ?+ G; Y& e- N: [6 z
8 @1 C# l; I: I0 r- _4 `' a
1 e+ W9 q& g: o C 下面对这个APP的所有权限进行详解下: / w& ?* p5 e1 `
* a* S8 n/ q' M7 p- r
+ c9 O* s0 o; T- c6 }) | android.permission.INTERNET :访问网络连接可能产生GPRS流量 & G+ y& p& q1 s$ `/ T- `
% l2 [7 v. J4 M1 b, r2 b7 H Q& Z3 W& i
4 W% ~: ~" o) S: G android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
& u% B. k$ r3 S" I# e/ X8 a
* B$ T+ t& _; K5 ~6 ]1 |% y
0 m$ n/ ~" @, C s android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
$ m+ N$ h1 X; R1 s 5 J; j) y S9 s0 O! g
( Y2 _9 g5 h8 p" f android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
2 a0 R3 V6 G# L$ ~9 R
" R5 z2 n R9 v4 p' x9 p: t
! R2 z t6 s% ` android.permission.WRITE_SMS:允许应用程序写短信内容 1 s6 H/ q, S$ e" E) @5 c
* D0 V2 F* m. K/ K3 x" [& p0 M T. L# h8 j1 U1 [( H- h
android.permission.READ_SMS:允许应用程序读取短信内容
/ s$ O/ q4 u. Z# H ! @' v0 U, J+ d% y
" J$ @8 {. j4 R% i8 R
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
4 ?, K( g% }6 u
" \2 i4 B# \' h$ {. l! O* I! C0 i6 y z5 Q
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 $ h% B' t% @/ q: e6 S+ e! o0 L
6 l( i# M: G# t& z: M0 a% k; a l' C+ X2 G$ s7 T
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
* l; i( P" B0 ?, ^3 j
. F, y' z; K3 E4 A8 x
, ]# G5 W. U. F% c E4 K1 F android.permission.VIBRATE:允许振动 / B4 i3 A& p3 Q& m2 G: N6 H
6 w. [6 c& g) J% }6 s2 S- C+ ^
0 d! | p( ]: {& `
android.permission.READ_LOGS:允许程序读取系统底层日志 % Z5 r) O& i" B; w
+ B2 M/ s$ e5 r8 m7 g4 d) h: t4 j$ c O
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
& V% C. n! W% n% S o4 O
' J5 o2 F- ~5 a. s: M8 _/ c( S$ u- w+ ^9 I& Y p
% C3 \( {. C+ m% l$ @" k# Z" Z f; z
& R8 P- s+ q5 b; @3 I. x
; m3 `1 l( e0 @5 B, |3 G7 G( P1 r 功能信息 $ N; }1 I( v+ E9 I# v3 d: S# p
! T# ~1 i' z0 z* i E: p
2 ^: g$ X+ d, r$ R4 o8 A% C
3 e$ S: w" F2 a# S* ]5 E
0 h0 W8 y5 i+ _ z9 ~* F2 k
* v( y8 |: c# D! ?/ ] 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
- @7 \$ b+ R1 r( i3 z
) l; x+ a! f- O% i, d1 k |, }! o; x5 x5 s2 x4 c6 U, g( o
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 5 j' Y+ g! I+ u0 L) L
5 f% A# c9 p& x# v
: o$ x, l' J: `) c% W8 v
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 1 ^+ s2 C8 M, l
q4 u! i* a q# z; {: t: ?
N3 p+ _. H' A; z
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 . a* j! `/ ^0 }' u0 C- E
" g& F% a' \) D7 o' o, U) ^: G/ \; c4 A1 Y( Z
6 Z- F0 l9 R' p5 I8 p " F( h& K& m, q9 n. b( r t
7 |9 b7 R( t% _1 J o4 b* M * O$ x/ P$ F9 O# t
* c- i. c% H0 D
; |) w. n+ s- B" n
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
- F% ], g' N+ F! f4 z" d
9 ~! c* ~; Z O y5 ^
U$ h1 ^+ T0 t2 y' z4 P- T* S
5 C8 P! A& E6 ^% |4 ^
4 f, \0 S* K# e" m2 i) M+ R
4 n6 z. d' N/ l) c & U7 M5 w, k, {
+ M4 s4 Z7 v$ h$ n" y
* w/ t* P. p5 d, [- Q, n+ V C 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
4 ^3 }$ d' {* f, o 2 i, m5 {+ n) Y2 E
$ o* ?, h) [) r( R- x5 @2 f. E
/ H, S8 r2 y& P8 W- P
+ I* p" O; F: c1 u1 i- E, ]9 G- q$ w6 U" c, S
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 & j. k0 n2 t! y" {7 A2 {
3 f$ Z: w6 L I; J( { R' q2 L
5 {7 _" o8 l& Q. o* j7 O : m! B7 Z( {9 C
* D8 s) C: i8 T" h% l2 I# ~; d
% x' {3 J9 i* c1 q
a2 M0 g' f; ~9 U
" j$ U$ ^$ @) S G3 r- q* B- W5 Y
$ ~4 g( G3 I1 E* y1 k. I* q" Z 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 ; H" c1 D* g+ [5 p. e X
8 u4 ]2 P0 |9 q2 n3 c9 ^9 l9 U$ D1 O9 W% [ {* r% \
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
2 K0 k# c, I1 @+ d' ^" {5 [
7 r0 U0 E1 m: f. @
$ _5 O; e- i& T+ F1 J& r 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
! J( o" N2 `% R$ \7 u' a
8 S% `" ^, v) N- E# h) y, K2 u3 f+ Q( y& _+ w
开源的luasocket代码可以参考学习下
( _5 X7 o% U) S( P) r: \, T ) t& `5 S& y8 ~0 r
' }! @0 d8 B6 x K6 ~ https://github.com/lunarmodules/luasocket
N/ v( K0 N9 {7 n) a
; f# t3 i+ p! m0 w3 b& |
' g E# Q! Z4 v$ e) { https://github.com/fengye/luasocket
8 g1 x: _# M3 Q! G
" T7 w" X& Y! m" b
$ E+ |+ v0 |) b1 S% f& @. a) q 6 n) v/ w) z% @/ o7 ?
& c4 k( k: C3 S' `, _# J" ?8 n
: J2 k4 a! x G9 W$ r
' L0 A/ ^9 V$ ]+ |& @
( O1 b$ M2 Z# ?# C# [$ u" s: J9 ~! U" V' T3 G$ p. {5 [6 k
. ~7 T' L h" c$ G7 }3 l0 A2 N
4 T2 J* U' H% Y# E6 O( C/ h- e y, K( k4 ?) x$ R
4 X: l5 q/ t' o% b8 h5 l3 Q
7 U: P! T, t& S+ _4 Q3 H" @5 j
( H. K" ^5 y5 E% Z$ @% ? 总结
I* j) n6 n; k$ |( B, F
( @, e7 O% D# ]4 \
8 ?; z' t" W2 a0 Q- U 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
, I+ ?* h5 b* W" l+ V# E0 G7 j
% j: J8 o- n6 H: R6 V1 M% L( t$ {$ \ M( B# ^0 A
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 0 M# W. [+ h/ F6 v4 o2 ^; j
' h' Z$ b" ^6 ^( B
5 F$ {$ j8 F, p 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 8 M. e0 R9 i P- s
" K' `: d5 g) k+ i ?" H% Q
) y+ t+ d4 V$ u4 l2 V" C+ } 结束 ! ?" N4 _! m7 Z
% d0 G: M! n! B- f
0 L/ Z$ i: a# a
【推荐阅读】
1 _$ \" E/ ?6 G$ \ `1 m
6 \3 j& a+ D" ^/ x4 U& h+ h( W7 i, }+ A8 g6 v# k
对吃鸡APP的分析 ) L5 r% A6 U! j! P* M# j8 _: j7 @
) M* v9 r P# \6 W1 C+ e
1 m+ u0 W! G0 Z( l 你需要了解的APP安全
: @9 t" @* |1 t) u" I
' v+ N2 ^, e1 T ?' X+ F/ C0 P0 v+ |$ s8 A
你需要了解的APP安全 7 E' O1 D4 H+ ^, b
/ l9 D/ m1 ^7 A8 n9 v
' y3 {; S% Z6 M
; a7 X+ [# c' f* L4 q |