/ {6 \# E- p) J 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 & E5 w' A; @5 o0 G5 |8 q
3 Q8 t6 x; y; c- N( u$ k
# f: `* ]. S3 z/ v, F6 x
* p. W, w$ {( `( |$ H
+ Y% d6 m$ c1 x8 ~1 s; q6 {
6 c. Z5 g4 T- C6 Y2 b2 n K; N
% ?% Y3 N. m/ w% S% `( g/ C% p) ~ ( b% t: n' F& g! h. {* A! C% p
# z" z$ T, q) o7 c
下面就以开发者角度进行解析下这个APP的功能的实现原理。 ( R+ T' ^0 ^, ?! p9 z9 l
) {$ ^4 b4 D, L' u5 H" b3 U% }8 v
. k2 o3 z8 {) `# o' S ) \5 D4 y/ N) ^0 U
8 U, y% M* b; X0 P, g" a3 z7 ^9 ^* c& g% g3 f+ i/ R
基础信息
; ]8 o5 h6 p/ X% D4 o/ w ; `4 m2 w6 w6 H/ \
" p/ t) V* R4 }' ] 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
' f, N, i% W1 q1 g
7 {0 E# s9 j5 m" M! Q1 H9 _
X% c! f- ~7 H5 D2 G $ v( A8 X" z \- ]# R# K6 ^
% P8 Q8 c: z: ~9 m0 v) P2 t
* ?, ^# W/ [7 P* b# g, T + u' e2 Q% x6 r; Y" U: c/ S4 e
5 @8 B" v( }+ ^) p2 e' [1 w, n. U" Y& J/ c6 c
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
) W! m$ L! e+ s5 \ ' n2 U$ S# |( s
' d; n/ |; U) p5 \4 L
/ q& Z! f0 B0 k# {- ?% [
" n3 ^& V+ ?) l+ ]3 T" C Z
( u/ A9 ^" O0 c V, u " ]. d: ]7 J! C' c# n
' Q; Q) m: c/ L8 T9 E5 S* S" K; O) L" e: N
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
8 o' D9 {0 M( f4 j+ Y' s/ O5 C 9 N s5 ~1 F- ^) b/ Q* H
/ v3 c$ A k: W
% }+ n$ a `( \/ K % |/ C8 O! l8 B8 E5 C; A. A
Z p* j8 q% N7 K8 w
' t5 o3 }, |8 V" e' {# s! o0 s F
$ G9 I6 p0 s$ m, T! b$ E& O& p* R: I6 w( {* Y
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
+ D. F+ c& P# e& v$ d5 N, E 5 ], R2 {, g$ I1 b: L1 P R
) ? I/ [/ V* \& `! B" v/ D1 _: _ 3 ?$ w* m: \! z# \2 }9 B
( S5 \+ T8 s* T
, \& A4 V, p7 O2 S; W, p " r4 M+ a, P* y8 y: f4 X8 `; E" A
# l* o5 I/ Z6 a
7 I6 i3 `& w0 v 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 8 u* |2 U" i- h. h) ^, u8 v
* u2 q+ v9 y% N# U1 S+ p$ O+ b( B( v8 d; S
5 \) S' u: b2 Z% Q V
: R( [- l1 a$ K2 l. U1 {1 c* t7 A% ^9 E/ H' A! t. k. V& l5 O
3 z! |0 t' \( L
; _+ x% k4 V, R! M9 X9 s, _
: e# m+ O! U a
/ k8 T8 G# a# G$ c# I
7 F' x. b3 L3 U F5 ]
' s$ _" w$ R5 Z y4 e/ N 签名信息
, g# [$ G( C6 a9 ? ! ]3 _9 l4 w2 s/ o/ d
' v. u0 Z$ H! l; y! y
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 5 e8 q9 b8 A2 ^* h/ [% P5 s+ b
' e- j: o g# E& H( \! t0 S- A& A
6 O5 Y* L" F ?8 j+ O) S/ Z
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 $ j9 K2 p7 x; ^6 i, d1 f+ T& K. T. v
1 h6 g# T# X: R+ | y; D1 T* e/ ^/ O' F! _! s/ Y
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
2 P( E/ s$ E$ w0 q ' |0 E- h$ Q! y4 a* u ^! I# V
8 y" R* S# U9 X3 h
; O" ?& C7 ?4 D1 S$ G: F
2 M- ^4 |. ^5 q( n Q; z; f$ z& U+ C$ g; `- J2 A7 b8 ~0 V" ]# R
- T; H/ ?4 T" `$ V 9 \0 B b0 b+ i- n+ K3 j# X3 _
6 x O' V# G$ p; ` android签名的数字证书的一般都是采用 X.509的国际标准。
7 [" e `% ?/ b5 ]; e$ w
2 }$ j& V \, g( |
* z% f$ |- l" y2 L) z 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
+ p$ m, w( d |' `' a1 w
5 C& G1 m; V& i. ]: ^( Z
6 | }: a9 Y8 }$ J8 e- e, T5 \ 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
6 X1 A# x% A. r. V( q( m9 p
! G8 d. _% S7 `6 n' o2 w
2 a6 M K6 L5 B& ^" C4 e
9 C( w$ H6 ?! a% b. F
% ?( L% W. F" `- J$ y) c0 C6 e: h8 ]7 C0 L9 M" c+ o1 f- H
# g4 o4 n& g4 t
6 M7 l- K+ _7 L# v( d) H
, r& {! m2 E/ G 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
' `! V1 i# [! {3 p2 f U / ~/ B2 a9 ~- E
% }; J! V0 z/ b+ o4 J R
& \ v, }/ q! e, s F6 r4 O* f ( |# o* T) r: o6 T, Y6 @
* T, }4 \% F, `* H/ S 、
* Q& m$ x4 r6 v, y8 y6 f5 l
' I( h/ P1 J$ v D: ?$ c6 q4 A$ g
( d3 R9 h' F$ c6 k
( J. u0 w1 b% b2 X8 c, H/ n; n
; t2 R$ p( l2 ^+ ^ 权限信息 8 a( {+ S& y/ w: y- B7 v/ m
/ J" X @" Z. ~; s# q
3 Z, }1 X& k# W4 _: @! j1 ~/ D 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) ; e! Z& Z2 d" f2 g" l7 f
, A- F3 V. D- k+ A) R
7 q" |* Z/ ^ m% x Z android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 : f* M7 g2 x! k! e$ a- C
4 y: B' D) P, Y L5 ^
, }' Y3 k/ X* ~- x3 L' {8 I o2 \
+ g( ?5 u. M2 ]/ E
, h9 P/ t/ q, W9 `( V3 c; ?+ o# m: a) B N$ }) Q/ G
8 j6 E) N5 j3 }3 z4 F : R' C( H. e3 x* R T" k1 o
- h1 L& {3 t; W6 I 下面对这个APP的所有权限进行详解下: ( ^/ m0 G/ D: i- F7 B; l7 y( T; U& X
+ b+ r) B4 H7 C* C
, p# W" s; F: f, H; g4 c android.permission.INTERNET :访问网络连接可能产生GPRS流量
+ a: g3 Y/ y4 j6 i
4 Q: g+ m6 U3 l
# }8 j: U! l: }$ h& {- P2 b" L8 b6 ^ android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
! x+ w+ G3 H' M. \
: m% `8 Q' A6 Q4 m. |
* c+ V" W0 ?4 t+ Z) e android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
?3 j3 C2 m" O& ^) {& j4 l2 Y
: |3 P, M. b2 [ T8 G2 g' B ]/ S0 Z
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 . n) [2 |- ?. E( M" F F
% i* W$ a {6 b: B" w& M8 R/ r
. ^3 x: A1 s2 U+ e$ o0 `
android.permission.WRITE_SMS:允许应用程序写短信内容
/ M1 } b7 X! H) h6 Q; y5 L/ w) N1 R ( c L7 F! j7 {' R# T) _# C
! f' f; \2 i8 `4 m# b2 G; Q1 N5 i
android.permission.READ_SMS:允许应用程序读取短信内容
2 B# Z- N8 V. U# j
' R8 b! w* ]( [# o2 A! k/ U8 e+ |% N; v5 E
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 8 z" |4 A4 X4 U5 c# ]+ G
# F& a. ^7 Z- [- |4 Z- H
0 ]0 ^8 N: N/ b* C' u+ j1 T# C android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 , a. [, ^3 @3 `5 n8 a* s
* a8 I: f1 G% }: O
+ l4 N+ g* O5 f0 K/ D4 L android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
5 ~5 w5 y' g! J+ X3 w, Q2 X! j
0 G- |' j; N, }: v5 n. I7 a
& W& \5 L& \+ | android.permission.VIBRATE:允许振动
9 b/ I5 Y/ ` S" x3 S# W' u
* m! H3 l" S3 V, O; j7 u9 [& \) l' i7 H$ l
android.permission.READ_LOGS:允许程序读取系统底层日志 K$ l3 S e5 k+ f9 i
' Z' ~) F! O' L1 }, o! _2 I) @- S5 @- b* C8 Y" z1 H( W7 H
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 ' H. x" l! V, d, p2 Y2 M6 m
$ t3 @8 m# r+ _4 x p% [, R
; S- c0 o+ Z9 k$ ~6 k# J9 E $ `- K# o0 e8 ^
2 k: l2 ?7 S& P m1 L( h
5 C6 f% r6 a& i
功能信息 $ X6 Y( c8 B5 ?! J9 t0 T4 i5 ^
e! s5 D% B* Y
/ t6 ` J8 k. W- U4 {! Z + R" o) L( A- G I" x( P
& `7 V6 I: V$ D8 { Z7 u
0 O2 {5 F; E8 L5 y) n# i' v
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
$ A$ n- ?7 z0 f" Q9 B
" y6 k8 y2 j) I) }# o o# r- J" v
; N8 z6 ?6 M# S Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
6 ^3 S0 }( H: l# r5 d% a
$ v9 I' k) P x" D7 d% |! d/ k: W( m' w! o3 C# ?/ t$ o& ?! l
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
3 e/ _9 Q. G9 _0 N8 N4 F: x' ^
* S8 O( i! ?* Q W' O$ ?, v. j \8 `# O9 C
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 : R0 y* D6 J# ~% M8 y9 Q
: f/ M# M- L2 }6 J
$ p# e6 |' E' m8 u
4 @# G3 g# a3 [/ G+ }
% y7 A' Q% c4 [4 B4 i+ G
; U/ B4 M- Q; ]; u \
8 A3 j0 c$ \5 h 5 Y2 |6 V! U q- o' t
5 K5 W/ k* O- P; y( W
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
1 ]# l' R" L, `9 B) e- i3 R
# n( `9 t7 x- @) O7 v- [% w' _: l! p- }- w1 k5 w2 C
S' W! u3 ]& C( G
+ S9 n3 ~$ K* v8 A6 a9 m* q( D
) }9 j6 Y" D# m
* {" x: U, z% y! D8 Q1 D, E6 B 9 `6 U' {5 `: C7 G+ a$ A0 _
, m! c% P0 c% V2 e" j! E 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 $ v( y) q1 l; d
5 {/ e3 z. N* m6 _! ?$ t0 e
$ r. {9 A3 X9 I* U u. |3 _3 [8 |
; ]& g/ s# u3 y
# C8 z. X, n7 v' o: L" p* z: \" \. _- Z) j; @/ w# T9 R7 {
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 0 m, x. }0 i, ^1 y
- W- p5 R& Q/ T
" J3 r6 {% T% X% S( Z
$ D$ J* t+ F" k 7 C: X) [& z# p) |$ p
% F' @5 o9 h; L" l: {/ ^ % \! I, u5 H U8 G8 o
6 S3 J6 {% b4 I$ s) ^7 f$ e+ ~, T$ A& Z% z# h+ k! k# }! J' h
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
8 A8 p/ }) v/ {1 h8 D
" G; V: ?; v( l# d9 N/ s1 g5 g \; T' i
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 % l( i9 r. o& _1 H) G9 n
) ^# U: W3 g2 n; y8 m
' P# c: a/ L. s* E/ o7 l& G4 a 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
Y A: k5 r% R; i
0 Q; p3 ^0 c$ f/ h [
" [. F$ R4 M! s; o. {8 _) |2 x. f0 S 开源的luasocket代码可以参考学习下
) W2 s9 \( A7 R7 k
; z( w! a/ B2 @( t, C% q4 [) C' D$ |; x! u# g1 M
https://github.com/lunarmodules/luasocket 0 g/ p8 N2 C' O7 f
" s# T! ^) Y( J: v4 _' z
w' O, A5 u/ U8 r, H' ]9 u6 r4 c
https://github.com/fengye/luasocket
( N% e" f5 T8 v4 v! ~
2 c5 B8 y$ O& `1 l
o0 d5 D9 |# M0 M! Q* Z 0 R( _9 |) n U5 T7 t3 Z
0 p! L" z4 N# C5 Y, ?" y5 K% t# N
" P, F2 S- q& l4 _$ {2 T; Y3 ~
* D* L; H2 |. ^* o" [. m$ ^: h% |
3 Y& k* h! N# i3 Z: j' l7 c: Y% [' h6 V4 c" w1 i$ B' p
4 g0 k" ?- L& L
8 P# N; E4 P& i; p
. I) e/ o# X( g8 L1 y! x: y 9 U# R6 U( g* ^ Y# K
) v, @9 v2 l9 @1 G
& [' H) B$ r$ X7 w( i5 |1 \ 总结 5 N* e. v3 A1 u7 Z3 Z
& D7 F1 F# i! i& A. ~. x' n, w6 y3 n5 y, }/ j
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
) r. @7 P( g0 Z
) g9 ]" Y) H. f- I0 h: }' I, I% s0 M: m" @. u7 {; `/ ?
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 4 K8 v/ K, C! K
! j3 s+ h$ S4 |# k+ r
# Q* t0 f2 j3 R# f 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 7 T6 r, L* Z. Z/ ~& J! `' w
: h6 A, j. Q1 b; [6 T4 o
7 I& z9 m& M7 m; B 结束 & d5 ^+ A6 @2 a( r
* B, s' Z' i- e4 K, X6 _+ V; _7 K
: C' M8 `9 g* p2 Q9 r3 C3 x! S6 w, {
【推荐阅读】 & `3 N* F" P4 ^$ C
9 [! x- V8 V% U( h( N9 X2 j+ P4 T( Y$ @8 `. m; g, m4 Q
对吃鸡APP的分析 9 l$ B1 G* ?3 A8 e$ M9 l1 u
$ |$ x( T/ Z2 `! q" B ?
7 s9 A. }+ L: W" j8 X8 p$ a
你需要了解的APP安全 - Y f2 e: Y' b& j) E
" X; P6 i P" D7 I
5 ^1 Z `: Q. r 你需要了解的APP安全 ) f4 h5 @. r! [+ h$ i
4 T6 E! `4 X% i. g$ [3 L: e; A
) z7 y# M5 K: G% O( P8 p
( ~, N- y( {. t# R |