|
5 x7 n: `+ c5 F# e* k, Q 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 0 l! W6 e: q i6 U9 L
! s$ x$ }/ r: }* M" f8 h. _
0 |2 t7 g* n& p6 S, r | . F% x. ~- N5 s/ h1 m
# [# b; b8 l V3 S
0 ^9 h# F3 b M c9 B8 \/ R 2 F% z+ `+ A: o2 t, w% [
4 W i; J7 a& {0 V$ f+ G( H- r b0 k& W
下面就以开发者角度进行解析下这个APP的功能的实现原理。
; }4 A2 r# g1 v& h4 o 8 {% M6 `7 F+ @6 Y
" p& y$ X) B4 _- A. B& h
, r; M, I* r9 g8 D- }& }
$ y$ ]+ j5 q m% C5 i/ ]3 x9 m- I2 r' _# [3 Y" w$ n
基础信息
# {3 H3 A, S: i7 r' ]' T9 g
9 _3 a$ R1 \# `4 a; z/ e) ?7 E, c% l
. E% [1 b0 j r& k 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
9 {% |5 [ W6 S4 } 0 X! S( q" a/ D8 ~* w- }' w
1 n0 V2 D7 ~0 G. ^/ @8 d- H
1 Y7 t6 [2 v4 D& ?% D2 ?) O9 R
+ o- d; \2 k; }3 O
* x/ a6 @. F: o+ H
9 F/ C6 f6 ?* [+ a+ e ! |4 `$ {1 O9 |
/ h# ] x) d' ^
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 3 j- I7 ` D! z0 m3 A: @
, d# W! w/ n7 {: N# W; t. z4 q* r( |; v/ T% J7 _$ U* f
( ]6 B, y6 ?! i' K6 {
4 s5 ~# s+ J9 w: N$ J* {2 r/ o) Q
7 d4 B/ H& ~- t( @5 `8 q0 E ( F" a: O# `8 k0 o6 ?
# ]9 F* j4 ~- Z' k+ g" _; c K6 ~* ^) ^. S
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 1 Z2 B d% o- P- |; l# D
5 J+ w. o3 f. t; m1 K
; M! x5 u7 @2 M' L- f- l- O
. F1 E7 C% u7 _4 ]( O- G
1 p: ?' H- N2 p6 O/ Z) g4 T& f, {0 g% i' |8 T
$ B% V5 X! D: G. X
8 F. m' b# O; [! v9 K
+ U3 f0 L8 p1 q: {: J- p 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 . P3 n2 ]5 Y2 k7 ~) l
/ {8 K& v g3 c% b5 Z; R9 N% _) i4 w" C! n. w/ S/ ?! M4 U8 B
0 v/ q' H! |4 Q# p. \4 }& p
& Z8 `/ t5 ?, D4 N7 q( q! B" d/ P
3 t$ Q0 A0 w0 I' g8 r
: z3 J: i3 T! R$ E9 \$ Q3 B9 l" e4 Q* r
# x/ {. }" f- n6 p* \" a; x1 `9 h/ a! j& k# ?7 @! J4 S
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 , d* ~" A: ?/ o5 q$ A
' i2 n7 w- e; H$ _. ]0 ]: I( g; n
+ m- s2 }( N' ?# e: w
4 P" n3 k, Y9 z M2 x
& e @7 w4 ^) M# {5 C( H8 v$ m2 o+ g9 z5 m5 E* |5 S+ @5 {/ t+ }' R
- W5 R4 K) F3 G/ e
% a* N7 j% g$ J3 Z% r7 ~
0 C' N% L% f1 ~( k7 z s
" z% K& w. \ r# v# H
: A( ^4 U/ Z. i3 q) G, g; b
/ ] `* q7 f9 n2 V' Z; M2 b9 C 签名信息
* `5 {+ I# ?; N) T' S2 U
! F9 d2 M# p" f9 e' I* M
7 e" Z( M) ^; Y; d- J4 s 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 8 p. @! H, o/ _, `# Q
% ^% @0 f) C) ~ ^/ H. R0 C( t
c+ l) e2 U% W* G3 Z$ m
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
; O1 V) o4 Z4 g: l: `3 G" x) } - w; w4 U2 h2 i5 P, H
/ { a9 h' ?- B* c5 V3 m
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
9 a% l, d2 C5 j # i$ l+ n$ C! J% }- p% ~
+ n0 e7 E _1 ?- s$ Q, @- ^& k ' f7 t8 s% W' Y, u
7 N; U' v. e. R& K9 C9 ?1 j
: [0 ~4 n2 Y( J/ q 5 ~% L8 s3 a7 b( t% x6 C
$ Q' J/ U9 j; W2 _' R$ z+ M9 S$ g2 I7 A8 C
android签名的数字证书的一般都是采用 X.509的国际标准。 / e$ j" k/ E1 T( Q
, X1 g- f0 u) K# d8 n0 {
$ F7 ?4 p0 z8 U
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
& c3 s2 F/ e9 C* h0 M * u7 F4 n5 x! O+ W( ~+ d: }
7 |! k- e# a. W& E2 ?$ ^ 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 8 W* q0 D X# @" g
( L$ M$ G9 d1 k" D) B ]7 ?
! \9 K3 m7 r; h7 v# g; m5 S) d# R 0 V( y) z a$ |) J0 N: P2 I
( I; S- V% J2 Z R, R7 J7 E5 b3 W9 H* K. |
2 @% v' w1 B* _( s/ Y+ V
( g" n/ r6 R3 g( N3 N, }9 f9 x( m' S9 O+ N
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 , W$ M& H- Y( e0 }6 u# s
" ~/ v8 Z3 R1 s% e* M7 D1 [. D: a+ B# W9 U5 }' [! ^) p. L
- U# N8 v1 d! }. v
# Q5 B9 }8 l, f8 u* W
+ U/ G/ m+ H" }5 }/ I0 v$ B 、 3 \1 F( e: W) q6 j
. A' Z& R: |" F, f( c( b
. e' d+ V9 ^& ~) f2 e$ H) a
$ @" L0 Z8 ?. i$ W b [# c1 { 9 z' O1 M* s. P0 |9 l g
( C& }, ~0 B7 g1 Y* L. C
权限信息
1 D' p# Y! F1 `* N6 U* c - |+ s$ {) ^3 \5 q# i! H
1 h5 Q1 Q W. t( G: e* p 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) / O2 G v% W, l, q( k
8 R" G i* H: o# P
- S1 {& H. X/ U0 V i7 ]; Q
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 0 w5 F# m& j% b1 s' I
. G) V; a5 a' {" z
\1 m1 \; Z" I3 Y, z3 H* Q
$ {3 ?' [4 D' p# \5 G( b0 q % R8 F; f% Z! K4 p
& K5 l$ H8 f4 b& j6 Q
. \3 ^0 ]! ^' ?4 r3 E
3 `) k# R5 k" L4 L- B7 g% O" V' j+ o' f! D F ?- w
下面对这个APP的所有权限进行详解下: * u8 f# U9 [( [
" Q/ d+ w" T4 Q4 s) B: I* h# u2 I, P2 Q5 J( d
android.permission.INTERNET :访问网络连接可能产生GPRS流量 . k3 g& J' u* X- @
D$ _- a( A" C$ F9 @2 F6 k
1 }! q3 D3 z4 q0 P8 G android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 ) h* ^* v* R! o: H) ^4 }
2 P( r" {6 o3 A4 ]1 Z
a4 B2 G( K. n( u- y- x! k. M android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
: b9 ]$ {4 O/ E8 }& S) b% t
& a, `( u& T4 j" V6 H
/ _7 A7 P( N+ S7 y- L android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
& O; G0 s8 F- x5 @ 2 q& u. O0 V" B
* b( w! I/ j) ?1 \; u+ m4 C- A2 v4 E
android.permission.WRITE_SMS:允许应用程序写短信内容 - j. e d5 y6 w6 R" d4 `: p
+ a- J# {4 x4 \7 c4 r0 B( Q0 r- F8 M( ?/ E
android.permission.READ_SMS:允许应用程序读取短信内容 : j9 y9 B& t& [
% C$ j; h. p7 ^% _6 U
$ a) D" A! W( @/ e android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
& t$ o$ @, G% @" C! I / q4 b6 `1 K. g. C
7 U. x, V2 C8 M7 e5 @ android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
. s; k' Z, B! f& @) S8 }5 C+ Y ) }$ a R1 ]) j+ J2 G0 k( l
( z* Z; K1 v) a) X$ h" V1 I$ \$ ] android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 % p8 o& F, b9 r
4 m9 @ e' i w' ^1 @+ K# W
" Z4 N) Q# t, l4 a# h* J3 N1 {9 x android.permission.VIBRATE:允许振动
6 \) q' c# K0 Q, X8 Q* O; o 7 y4 Y) }, ]" c8 \% }4 b; X
2 e7 Q" \4 j8 e: l! u& r+ n" \ android.permission.READ_LOGS:允许程序读取系统底层日志
9 a" a" ]* M0 q3 U 1 @8 y7 K! L; q) G% W
+ E3 k. ^7 N) F android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
% M# j# C4 f; I' E9 l: B
/ W S' r1 ]) n% R+ {8 A3 `; U3 [# p0 Y9 ?5 Z
% \( v( h' V. B( k : P# ?. H. k1 x+ r! o Z
7 o6 {: X/ f- A3 x2 @) i
功能信息
0 L% W3 l7 n. z, y" I ) D" Q$ O2 G3 E+ z
: p8 A7 ^) P) F
9 R" z/ p7 i$ R
, A* M! ~: m7 ~/ Z8 a) K$ M
/ [/ P. k4 ^/ a& E& N: b# u 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
. K8 O; G u j4 I* K
! x5 q5 F3 m* D9 n
7 `. o/ |8 A& p5 B* ] Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
! p3 u( ?. O$ I/ v2 ?+ c 1 ?# d, M, \9 i) t9 j: S
/ w$ j* Z! g% ^2 x 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 7 r6 d7 Z) l) w; q/ ]
c( |% s$ \3 C0 E6 b9 y1 q6 n! q% c$ x& L& m r+ R
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
* f' P I' J8 ]8 L% |9 W T 7 \" N! F2 {+ g; G% x
3 h6 K; V) O- U* t2 B- L( M
b8 K, M8 y0 d! E
8 [) v7 [* i4 q- O
6 d: R# M6 W4 H- T: W& ^
( B/ X G8 \8 U; m ' X" _3 F0 l) A6 |/ m
$ }6 {9 [* m% l
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
( h. v4 f, U) l3 z' C q " y* [8 i$ R! k4 y4 Q& c! O
* o9 j2 F( A# k
* _) a/ _- j% i/ b& L 3 U* w- l7 P/ s b& [/ B
5 a9 }! t& N6 N6 C* l
3 ?* Z. a) a" L+ B " O9 \. N; s1 [$ e, [4 N
. I, M. a( ~. N
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
0 ~: C6 v- v$ F8 T . b' I* p3 E8 b" j' [
2 l6 u" V6 q/ i5 c
5 n0 M( ?. t& K, b8 }7 i
7 K4 U) q. Z, Y; Q( [) W/ ?7 R6 M9 m% J( q
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 ; c2 ^. n4 _* Q" E x4 c
9 b! k9 \; b1 A( P
6 {% S) a; F0 d3 K0 s5 B6 H, o
! B- L4 x' ]6 P, T& c7 ]
7 v' X; I9 o, r3 |9 n0 w' Z+ J, w7 {/ y8 Y1 o* F7 [
# x) e2 w8 Y' L" A) S' {3 f
! ]1 q1 Y2 q5 m; j, {* l4 a6 {8 n7 m9 a: L8 }/ }, n
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 8 w$ R1 `9 F! |' L% A* g
5 _2 y( l3 z& @# `5 F( d% T, }- f! }) ^6 i+ ^2 a g1 [- E) S
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
& V4 g$ s2 a- U0 [: p& n3 t: B , Y8 M1 [1 |, {9 [6 N) a" ~5 J# p
" _# [$ b* h2 d5 T! A( B5 i 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 & D, b* D1 h1 p; Q l/ u+ T
- u' L. L/ v* d3 A' ~) A8 N+ Y4 o$ w; u; q5 B( b
开源的luasocket代码可以参考学习下 6 p# j. G+ w/ G8 U; T
: \. v5 B+ E0 t- g5 H( g" S9 o
9 Q2 R# r) p9 P9 u3 g8 V
https://github.com/lunarmodules/luasocket
4 z( h* y( h, {5 b! D
7 U4 d; k, U% z: X: i! n
a& p9 I) @/ r( @* M https://github.com/fengye/luasocket # O0 x, ?+ Y, @# a2 T& T7 h
& _) V$ S' m- E+ v, j( M1 W3 J& Y: V/ u" X, ~2 g: I) g
) G( |) }% p+ Z2 o
8 L5 q+ ?7 r1 y' D4 t- d$ D% ]( H# `3 L3 ]% w7 h
7 E" r+ b" e0 R0 Z; L2 e" u) f
7 V* i# ~2 B9 Y
- I2 K* f2 c$ j9 A% W
' t- Y4 h& E. A: u
, X: S4 r* H' G, {- l. c
t% k- {/ _5 r) ]# x o- b& @
, p1 f( [* \" \# R2 }3 |
+ [' z q3 n- J" m; d! `* ]' `1 J& W# B/ }6 e4 s& {
总结
; a% G* A8 B* e# U& s$ A
# N. |$ p' U: k' |, h
) |' f( O& S/ [. } 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 ' r/ }$ ^7 O* l6 x: A
$ Z( p$ B- i$ Q* M* R: l
+ s7 U9 E @, a% J1 B2 A$ H 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 # O# \! P H$ S$ S
9 v& c( Y0 I# s/ u3 c& G
7 h" T2 S& a# R 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
& K z$ m, m5 j) B' J$ _7 R% v8 f ' N% d1 s# m3 }2 }* a0 n5 a
0 n5 Q& f, v# K* }' T9 z1 O 结束
9 t$ L8 m! h4 _% E# G9 J
( r7 L$ z) ^3 E L& f6 L% y
6 N0 L. m* R# S% ~9 b& l/ T' I 【推荐阅读】
0 J: U# y: s$ |8 X% y 3 k2 C' [4 [* l# d' H) P4 M
4 ]. e, ~% ^# O( P2 v& M) Z% R
对吃鸡APP的分析
9 M4 @" F1 e+ [4 q; M! J& r
/ j5 q! w- X1 {
. L8 j+ w0 z3 A; K* F 你需要了解的APP安全 * U7 H* e) M5 Q5 B& @- j( n' p- B
$ c$ ]6 f. I) {$ ~ \6 j! s: G/ x$ F) ~: I
你需要了解的APP安全 0 n3 u$ r7 Z# k5 c
6 h: q& d% i9 M S3 j; A1 W& k9 d; u1 S& |
' o) \( _( e" h, Q4 w7 d
|