8 W3 c/ O, ?4 m' F8 @
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 2 y W( @4 ~! P9 c
4 K3 G# l9 ^1 T u3 ^6 P* f5 q% v5 j0 F$ T- }
6 q# c. @ _+ N/ I 1 C3 d9 }% v; S% T' d! C i
8 G' G7 `0 [6 m
( h: V' G% c6 h7 G' {
; K8 k2 I: I. ~0 S
* x# m8 F, Y; p7 r- Q g" a% c 下面就以开发者角度进行解析下这个APP的功能的实现原理。 ' b( @( I, V, |% ^0 W$ G# R
5 Q0 t) o) q9 j+ k/ f7 o, F! K% J& X2 o0 A
6 B) \( i! B1 w q3 c1 K 1 @5 k+ f' M; W, L9 l
, T( t3 @3 v- e+ I. P1 }' Z/ a
基础信息
9 b# @- b2 w& G* _" U0 S7 D 4 }5 @) b/ n, S* k8 Z
% S3 X. n0 |# M7 N
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
* V3 N* s* t2 F7 V4 a : k9 q0 r+ @+ _" Y7 a9 J. k& e* t
$ j3 u3 a2 c* C# p, _7 U8 J! Y0 y 7 ~4 Z' S& T5 m
. [+ D* _' R$ ]$ W/ {$ b4 l+ d
7 [- D, x {! F- X
1 n/ }3 ?5 M, n* _" G+ M' U: B
( k7 f! ]' {9 l0 [1 C
- f* ]/ ?# q" K0 f% U' e) H 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
: l$ t. e8 r! c$ ?
6 c4 ]. U5 Q8 O0 A: l) Z( |
$ Q q: v: ~' _: i # q! _3 B& X g+ s
6 V3 |' Q$ k4 l/ k9 V' H
+ z7 U5 h' {- P3 s+ O
6 |% \, W& G$ G, h& {( f
0 ^) r" W& i: J# e8 Z- x3 s9 _0 y* ?" g1 z2 E
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
$ Z" N) l5 w; R . Q9 ~) O8 I* _, n7 z' `0 j& Y
& i9 I* |: u G" D) j# f3 X6 ^
2 ], z! v: N: {! E5 n, _; O
% A9 K8 H. m% a7 W1 T. i# n$ z# E
5 H- K0 S* B2 D, ]' Z! k
8 \2 W7 ?# G# \8 q* J7 L
' x4 j O7 @! |' j; x
2 q5 w( ]! ~) k; ^% [9 r6 |
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 . b. \$ ?; d! O5 C8 P: i
) r5 q, T: L% h
V6 A/ U! V/ s ]% q - S; t7 ^0 T1 t& M6 Q" l5 p0 M
2 a! n% l9 x, E
, a6 A% _1 W2 C! A8 }
6 Z8 k; D; |1 ? 3 A- |: Q9 l" |* b- [
/ m5 Y, z/ A+ ^' @
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 ; w3 u5 Q: S0 c# ^
1 i. T' R |, F5 [8 X: |
& h' A! f2 n7 i3 @
8 N% o' k8 W& `7 o' p + x' p. g+ S# ]
- W5 K! {/ e$ |, _' E ) {3 C: Y- \( p( q1 v {& q
" R6 B+ s2 M+ D: g( q0 |
6 D" E4 F5 {$ z
( B2 |/ W5 s" x$ s
. D, J: z9 Z4 l4 f: l4 f
; i0 f" m. N* b" F 签名信息 * J; L( q, [$ _) v: s, M. V
3 R5 ]. o. L/ I7 W! |1 R f' V: M# v; o5 V; \2 \6 F' v |* P9 M
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
' H' g* e' K8 V: @8 X 2 m* @$ L. U2 v3 z+ ^: _5 C
2 C5 R3 B" E0 V: u# E* I
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
5 Y4 C* l# D4 i/ T9 _4 M 6 }1 k) J" z; K8 F
; d6 B; i/ s! B% Y, m" R! X
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
; X! s+ c# b' T' Q : _( y/ P; ^8 Y
* X( z$ ~$ |7 F) }
" w' [( \" |& f" g% A7 ]
& l- t. J7 Y2 L# C' f" c( v2 R; K( i6 H
t& l1 `5 ]* m* z8 u
: ] w- x( N5 R! [5 v8 C( V& f& M/ J8 |; {! v$ r9 z3 n" `/ u
android签名的数字证书的一般都是采用 X.509的国际标准。 & r) q* `- |: p
7 g! _1 h% K6 Q. W2 @" x. e% K
1 k# z; ?5 f/ o% r/ U- i/ K) I7 H 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
5 ` S3 g+ V: q ; P- _% M9 y- Q* D
6 m- n% B! k6 y' y8 [
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
' o* o2 @8 L) s" A
2 Y' J0 g B! `
7 I5 d" Z- Z/ N$ D5 ~$ x
6 U1 `* O" p! @7 D/ s1 }0 _$ ~) h 5 G6 s) J7 @6 [4 u
, h: G% A$ C# {) [0 L# L5 ^
1 ?/ R& r6 j1 w! [ ( P+ R" c+ q+ H+ }: Y" G R
: D/ h- I1 H6 ], C# I/ q; _1 r4 k7 ]
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 2 Y9 _2 x5 X' v$ C& N" n9 I/ R
+ Y$ |) O! m5 A/ I/ [0 T e
4 o6 @- |: V7 X/ J& y5 e & x5 `: x* c2 j# t
! G( E& ]8 C9 x5 S
* E7 E$ i' K- |: v' b. {; N& K* A/ o n+ c1 ] 、 2 P- u% q6 J1 a' Z' J @- A
9 t8 x- |5 Z8 G$ a0 J& b
' d2 n7 `8 l+ ? C1 A2 R9 u
$ [7 [+ E. `4 t1 b$ }+ J! N
1 Z$ ^9 i- W" y R! X
! `1 ?5 A; p7 X 权限信息
" [0 X# J0 G9 H6 c9 V& d" K9 _6 t
* }- |" _7 E4 h, U, c$ o6 W! {
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
Q7 F, ?1 o/ R3 ]0 C3 [ 6 \, m; Y' k: d" Y
6 u1 m1 b, @* T D. H5 A5 X6 `& P android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 - }- v5 X2 g2 O& N' y9 V: i
- e0 b/ `1 [2 ~. N* B' I4 t$ C" ~4 Z# a. F: d& V$ ^
2 \! E5 M$ f; q
- R4 E' s) ^+ A& l" j' \
0 p: l& T7 y0 a( S# l5 ^! Z5 N
" k4 s: J. Z0 [4 Q: b. ^5 L4 i4 l8 a3 h o
: v% t& m& D \! y& U2 C' J! L! b3 N }' @
下面对这个APP的所有权限进行详解下:
# `) v/ w4 ^+ D" c' T/ f2 r4 P+ y7 W
+ |% q3 N8 P% x/ U8 E
% \) z; Q. k! Y; _3 n( j, G android.permission.INTERNET :访问网络连接可能产生GPRS流量
7 h7 r* V4 T* b, h! ]+ E
. ]" }* N. N4 c* E D; e) r J( f; I
5 q& l& K) a7 h3 A1 J android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
8 `7 {: n# i3 N- F, W5 | - e$ N/ A) U- r# a7 i" O F
2 ~5 t- `4 `2 U) w1 S android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
; N4 X, B U& D; u: f5 j 3 k# g4 W/ k; W! y; @
7 f/ y& A9 p; ?8 h1 H android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
7 S3 \! L2 ]4 B3 e 7 r" y" D. d; R
9 Z$ j8 \5 K, w% a1 H8 M
android.permission.WRITE_SMS:允许应用程序写短信内容
) E, N* |. A; \+ w# P [ / R8 m0 ^4 ~$ G% u/ Q6 o
: W* u' v6 a2 ^+ {7 X
android.permission.READ_SMS:允许应用程序读取短信内容 0 D: |7 ?: O- b4 l
- k! t. \2 M+ ~7 {( J6 N* j; |$ G! S
* ]( l& ~5 x7 l3 L android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
- _; m- w8 k. S" C7 M & I; E: F& C; P( ]5 X* `
+ A" L: {. g C2 q+ ~ android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 2 N0 `% ?& p4 ?: p& d
: v6 F8 V2 C$ m2 q- \& x
% T6 o: d$ _, P: D android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
7 I. j: `4 o/ h; W) E2 ] _; U
' ?" A8 J2 q# R- \! @* T( A: p; F6 j0 K/ h0 T) o+ P- {4 ^ x7 n
android.permission.VIBRATE:允许振动
& N \0 _6 W, }* p7 g. W y2 T - J2 m* V. {5 _! u0 Q5 Z
# \( |/ L" ~8 Y8 _- Z android.permission.READ_LOGS:允许程序读取系统底层日志
% Q4 c$ e; {3 n- [) x 3 q, E8 A# I: f5 S; }. z2 M# `
/ a' }0 B8 O( I android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 1 D# r# n$ E1 }4 Z3 R8 a
$ [4 y: ~, y; E# m9 f' T0 ^4 s
5 |. k) V' L3 F 5 H) {; J o. I/ c. p
m, |: J# V! U7 m
; z/ r) G' h+ { 功能信息
! v4 O! ]4 Z" z$ d7 ^4 _
! k, x0 r% o* o" {( t- N3 j1 L4 D# P d
9 A: k. f3 U, e6 ^! V
0 I x# Z- u( O0 G s
8 X: N8 I& g) R) i 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 " M6 B, t) b- v8 E+ h2 r. C
. }! C$ d& A9 b) m: T
* X+ x. J) J2 ]! x9 n, L Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 : F( w9 W8 G) N0 v1 [
9 Z$ q1 V$ g7 y- z$ z3 N& v' @% V3 u( ~7 \8 p9 p; o7 [8 \
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 ; Y( e0 d, Y: W# o b+ u
+ U4 o; N/ }+ O7 q& a( a9 d+ T: ~) f6 |3 K
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
0 ~) _: k. _" C: w- ]. @
! o. F: S1 U4 u: z( r9 E/ q2 b
7 D+ j; O+ f1 y1 r 5 L4 J9 E- s+ e6 I
9 |6 K! D6 j4 Q5 [+ E" R6 i
5 I- N8 P1 g& @9 y. V ! C9 l1 u: }9 l. ]! X. T% k ?" s
9 P" l& Y- {4 |7 U: J; Q l, A8 F
0 c% {. W% L' Q: S! u' c! N/ E e 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ; P7 t- J* f- w5 u3 D* G
7 [% ]9 o$ X. t- I0 d8 v! d5 i6 G1 j H$ z1 P+ C. z# ?
& j2 ^6 z# c3 C+ F- s
9 P( ?: S+ i' p: ^4 n* m: l
( L5 s) d1 z6 {. `2 N8 `+ o
4 Y) \+ g; D2 M" L1 o
% T+ Q3 d& V& A) d o/ F8 y. ~6 U8 K- A3 u) ^! Q$ J0 v0 |7 t
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
/ Y0 {# ?( c5 Q g 5 U' G! o8 v# G9 h: e
& f: v c' x, C6 F" u( s) d
3 u9 ~/ ?5 c0 n% v
0 p0 I" g% V' ~" l4 Z& {( p
3 {4 D( D# E5 C1 V! `3 g 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 " P3 V+ G; b0 I& h/ t1 z b0 f
6 X0 I: I: E' A" k/ E5 C( x
0 h5 g, P n5 F; R
) A( z+ f8 J+ L& |, A" M! _
7 J4 k, [* {) ?# e8 L' V2 w' `+ s5 Y+ O: L ^# n4 U1 \" _
$ W- i- F! u1 a. E! `. d
3 X9 n$ T% K- v( k( G6 ~' E
* ^3 Z- I P, P, V! s* p/ M- ] 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
( g+ Z. ]9 R+ x9 [ ' Y8 ^( S( C& ~0 z
1 {/ f) S' {- I6 {9 Z& v" M( u
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 ]- |" k% X: w
3 y0 s5 r2 y# t
' I7 X# x9 h% F, M/ p" i 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 ' s' X0 b. D8 A( p* V; \/ ~; k
0 n. M. u3 B/ g. N( r
2 Q$ f1 [* t( q [
开源的luasocket代码可以参考学习下 % I3 l! V+ g: r6 f9 }3 D2 \) W
& p/ h" r' `/ O" U1 R" f" P' Z' C
- {$ d- i }0 P/ d# Z https://github.com/lunarmodules/luasocket
: B5 \ ]* ?# j3 C/ v8 [
4 x" u* e# t8 A1 S* D+ n$ @0 d: }$ O7 J! d& @
https://github.com/fengye/luasocket $ `: F) i& L7 |
% |2 y8 f2 {2 U7 q# ^1 \4 @$ `! J. N! N# \, Z' F% Q; i
! x4 O% {) ~4 b2 E8 z- E: h
* \% _ D0 ~# g; e4 @
7 n/ R# ^- b! W+ ~) z & E- g) A8 x- Q
4 q: {0 U8 @6 v5 p
- B' t4 E# A$ B! p+ M- i2 s8 v# q
- H2 e" X9 h3 `( |, v" a$ v
3 N* V# x: W" b1 | f
" A; G9 I: Q1 `& ?/ K7 S* `" I
6 {2 C+ W* G8 V 2 n! A/ E( \0 p' X
* Y5 I) x& X8 j0 G
总结 j7 }' K0 C' A
4 M4 _4 x0 e5 }+ _& i6 [5 e
/ {8 {) \* Q5 h4 l; J2 @$ v$ ~ 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 . p+ F7 O( N, e: Z
2 w8 C* }1 Q7 h7 d- }
) p7 V2 Z' T2 m8 s. X4 n
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
x1 ~+ v$ B @ 3 c) y8 _5 }7 n6 A
* a( B- V! Y V/ e 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
( B0 ]; t u) y9 \; Z* x1 L ( o$ H9 w y$ V4 i4 Y; T7 Z2 u8 M
4 |) }. P+ ~( ^! }( z! R. V' r
结束 / B0 {7 p( R. e2 ~; H
! A( }' l/ Q7 T
0 a( ~; t7 Y* l C' H; G; \% W
【推荐阅读】 5 M- U2 F% i$ |9 `; P0 j$ b# `) W6 ?
& ~- q; ~7 U% {9 b+ w
; l# N t3 {9 n& A" O# L- O# k- g 对吃鸡APP的分析 $ ]$ W# E; I) H
) U2 h+ I( }: e- M% ]
, r, N5 ]% _0 M7 \6 C
你需要了解的APP安全 8 _& b1 z2 w, v7 u! |& R( W
4 j0 E5 P5 y; A
/ ^" ]7 X% y" t
你需要了解的APP安全 " ]1 {* r- t/ e6 o" C' m5 @3 p
- S& ?5 ?0 r) J4 _8 Z
0 |8 k# _) K* ]4 E8 \ ! [* T& ~1 o7 Z5 q$ {, }3 X
|