`8 w5 g& _2 b6 e% H0 z. d
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
0 i7 z' ?3 d: H' K, r0 V
- e. k$ N( H l7 B+ E, @! B6 f9 `; n5 N* u# N' m2 x; M
, V q' `7 }" w! L. d % c5 U) `! U& p: a2 L6 d# W! z
" M3 L0 g) j. ?3 w. c# V
" D7 S1 I) F( f) t$ N# Z ) q9 q+ [% N' @- y; B
8 }: S' b. N9 m 下面就以开发者角度进行解析下这个APP的功能的实现原理。
4 w* `/ n7 x3 |% a. G- L% f9 e1 ~9 H 2 M' v8 f+ B3 x& O2 s
" o+ Z' [8 e* A) h * @6 @, L! d% N0 @( @" {
- f4 T8 k, ?" S% y
) H% L: d+ m( h0 f. P
基础信息 1 @0 Z5 o# y; _0 }% z9 R+ ?5 X
% P- B. M7 {9 @: R
4 O% c4 c3 H( {- Z4 ]' O! W 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
( ]6 Z' j1 U; ]5 a! w ; {! y) O8 ^9 P
8 f1 ^- F1 E h j0 b$ Z, V4 }) O3 S7 ?! B
& I- C& P" A- M2 R& @" H# i* B8 ~3 Q
& K/ A8 H/ M( L
- D& ~# k* F( g1 }
- ^. M+ f6 Q2 S4 H4 i 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
3 L0 b6 |5 R4 w, F
. v& \: e' j" q( G+ l" g0 z
, f) Y* z6 E1 j, z ; B& O) P. U9 ]2 b! E( w* Y/ `2 `$ A, Y
& E% c9 g7 N+ m/ v* }+ k% u/ L8 V$ O" ?% g6 n5 p# [& L
5 k6 R6 W) T$ _! ? j+ w & r% p# Q$ P1 m1 k' d6 z
* v9 L' s6 \7 ^. W J( N5 l
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
6 @- W. w9 D8 u
& ?5 D0 I* _ z: ?9 n7 t( b
! n$ i/ b' V/ [& F 1 a' G3 X+ {. B1 c! Q+ n" V' t
+ a& X! i5 K) k( o; @# R y
7 D" y; B3 a: z! x
* i+ E" e7 M9 P/ [9 O; {
0 A* k8 l9 b4 k
0 i, p0 {$ L/ w& |9 I5 q& L* G 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 . S' M( o0 B5 w# ?+ Q2 P
0 \8 Y/ [$ r9 c% q, T, F; Y2 G
# K- b9 _2 I7 [. f0 a! v/ y* J) ^
- x$ J# U( v- d. ~+ X, l; a 2 L/ W; `+ B' D0 |$ V9 {6 y
5 B( ?% |7 f Y- y7 j) ^9 C
( p; P& }* T( I U # P0 e8 l( ^7 M# a0 P9 c
; f Y4 y; U! W4 e) b& ~
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
, d* U: K* G/ s4 q7 Z8 S% S
3 B8 o' H- L, {$ T
7 z( `: A- j: N
( q* W3 E2 d1 V
& h$ s2 z, y" T% e z$ F# l; J+ R+ ~
9 k2 {' b8 g+ r
8 R+ l! }8 F+ y; l3 L; {! n
9 S3 l! P% C- t6 ^$ @6 T Q+ [* j
0 ^& Y% o" a$ K5 v1 a& T: {, n
: ~6 y$ X* K8 j* E
1 h8 V" {, L0 S3 K, _1 i 签名信息
& @# E* y4 J1 D! c% S9 [- _. H 9 }( n# [! g) `
% B5 r5 }5 |% y9 c* ]
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 5 U+ m# u4 K1 G, g: s l: x- B
+ ]. B0 x+ F+ i; [( l& d% x' ^& }8 w3 K- l
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 5 t9 W3 Q" C: z B- }, t/ |
$ a( D! d: m9 H7 O5 u, {! I) t4 G4 p% _5 X }, L# O
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ; {/ [! z( }, ~; W7 R& |6 x& n0 W$ F
" Z) S* Y6 l/ J" D I
/ R1 x2 }7 o3 p7 _9 v 4 w9 u5 @$ K+ \0 \
7 f: g4 H" f. B
% N) u. W1 Y0 n, M6 }0 O2 s% G , E) t; p% V1 R' H5 m
' h( v( V/ E! i- B0 w
* `& L0 K G0 b3 s/ L( ^5 w- B android签名的数字证书的一般都是采用 X.509的国际标准。
/ E; S- R! h# C+ r+ R, y+ u+ F* m( Z
( y% L7 Z* Q) O, v2 ]
! X/ y7 c* G0 o- I 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 ( \5 Z/ q# G* }" n' T# ~0 @8 W
$ y2 ?0 y4 ^" i0 N
4 t( H) V3 O! f* a9 ^$ H8 P 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 : F: h" |. x7 x$ |
6 x9 e8 R, g; }$ q- v1 x7 r
0 _) q( w! Y) C, N
" j; B; \/ q3 d) i$ s$ X" Z
! c( k* v( r% z6 r
) _# i+ Z4 L' v# B2 j6 Y % E4 ~. ~. v7 C( `) g$ n8 X
4 K3 l# ~) g/ B5 a% K' E* O: K% g% W7 `* W
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
8 G0 @% V2 H3 R6 h8 f3 z. H$ r/ { 0 V6 ^: t3 ~; e; r5 P' k& D' v
+ j# q) z$ i9 d4 P0 P
% n, q. H) U4 s4 C% Y; [7 u - f5 w$ J1 G) S; |9 w4 t' H
+ s: W" M f3 R* ]0 e1 T* |1 u
、
* m' g& n$ ~( x7 r1 L' G 6 D7 d& I1 M0 Z6 t, D
0 I X: d2 B! p& M/ D/ n4 T
# U0 D g9 y7 Q 1 B/ r- u9 l( W0 Y% \/ F4 ?
, @1 d" P. g6 b3 V 权限信息
$ Q5 m4 z4 h9 S9 X 9 v4 P s/ ?7 j% @3 U, D! `
: I7 T; m5 R" Z
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
$ x& a* X3 t p
6 ?: p# I6 `' \, Y2 E/ W+ h3 b Z5 A) a& Z$ j- `
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
2 Z5 F$ U) `, a . g/ a" e( W1 P/ M
% I9 H' ~, @3 t+ E6 Z
1 X& S, ~7 K. v% m
2 Y( j. C) S) t$ p- H: }% c" K) ^; S% ?
4 Z* p8 ]/ k& E( n 0 Q3 @: ^6 Y3 w9 l0 H
4 X; B* t" d* V1 ~ 下面对这个APP的所有权限进行详解下:
; x2 q" s% p+ s( x, B7 @, R ! B V0 w3 }9 w+ {- Y
$ g* h" o3 K; _( z android.permission.INTERNET :访问网络连接可能产生GPRS流量 ; H) Y6 O3 }" r
{0 y7 \2 H- A( C; b* C5 H7 v3 o* T6 p; ^& d# K" z8 Y
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 * l. U" {- B1 Y/ [1 Y: a
3 v( L/ ^- j, {( j3 j# r, c) v2 j
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
8 A5 F, W" J, K& u" ^9 w4 G
+ |7 x3 C! K2 A- h# v4 L* a# T f- P+ m" S2 o# _
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
5 @) h$ [8 ?" H3 @7 O & j$ \6 v. q; s3 @- x5 q" r
- Q e6 `/ e# Z4 z9 E5 g; c6 x+ {
android.permission.WRITE_SMS:允许应用程序写短信内容 ) b% `; z3 d( ?* V; k% C
5 J# K7 T4 q( g( ~+ [8 f# [* Y2 D) w3 ^) D
android.permission.READ_SMS:允许应用程序读取短信内容
. D. Z5 H7 ?/ q& A
4 \1 [2 L8 J' d3 f
) H& d9 ?7 N L! j. ~+ z8 W3 @; F android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
( w$ K) C) q8 x3 r# l" ]0 Q( o8 E, I
M, g8 S! X7 s( @1 q) A1 R" J
2 `, S" ?$ B6 p# M |* O5 h android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
4 [) ]0 U0 N. f- M# A X+ }& I' z6 E' e( V
; R5 [1 R+ o8 \" G" t9 W android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 1 ~% Z5 ^8 U; i9 V* r# N' a
# r( p. b0 j- l! y2 P" b0 G( g4 Y% {7 O$ o; v
android.permission.VIBRATE:允许振动
) t7 ^$ E% L# f, I. p. t9 u 4 D! q2 v/ `; z/ e5 ], k5 _8 ^
+ ~; P/ G) l+ N1 c android.permission.READ_LOGS:允许程序读取系统底层日志 1 K6 c) Q) b1 G9 Q
& ~+ {6 \6 \, x+ b
6 n0 o4 S/ H% A2 x2 G3 i& T
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 ( V! Q% T5 y1 `- S6 n7 z2 n
8 F# ?2 |7 K, q) B3 k2 I% F; p
+ E x# f, K2 ?7 j6 f6 L
6 r. d: M( J0 E& } * x* r& y0 d. {9 l7 Z+ e5 Y
9 C! T6 _. M8 V Y) Q0 p% ? 功能信息
& _, [* K- G+ D 9 v9 g7 m5 e4 S ?( V3 a9 n1 a
! b. n1 @, F! j+ A
' L6 B( r+ I2 c6 w* X1 [ 4 ?5 J5 i8 o1 ?# D$ L4 k
) s3 p1 g! {# G5 [- z# x 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 $ e M2 e* C" F
7 C$ F! c- ~! g) y9 B
9 ~4 K/ u: A W* s1 A- W
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 # P4 X$ _/ [7 d7 ?4 v8 C
, Z' g O. C; n0 r- a
% s/ @7 u$ J* M6 u; b; @ 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
7 Z% v; l6 |0 Q! w M' L( X ! }8 ^& `' o7 z5 p
, A7 ~$ N. C5 t1 b2 C" k
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 3 N* }8 G$ `7 }, ~2 W& ^' u
+ c. o& \) N4 p1 D) e9 m) E
: t/ M. Z& H- y' j/ p
7 H, d3 R+ h, Q. Q " L- ^, M5 a; P
' m6 }! h( q$ _: D9 p8 h6 k
8 q8 R# B" u j , c. X8 J% C6 w* x
) x2 c9 t7 D. h
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ( @) o+ \0 N6 N$ h' Z D8 Z
, ]4 {+ Y0 I2 ^4 t. B9 a Z# f2 ^# _' ~; q: w \ U: p
0 c1 H1 v3 o7 o/ n
0 O7 s0 M9 B/ a7 X; f- b0 D
) X. j0 E3 M) [6 ^7 \6 j$ q p& o H) ~* T* f
: S" x! c; I! @4 V' Y( U6 _; x( n/ e& u$ m
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 8 n1 T8 {& a) C
6 E5 J' ~: v( k! y, B1 v
; [# v3 R" K& \
* C2 ?% \2 D! a T. j 6 h7 ` m9 e- z3 j* Y) Z+ n
v* E/ e0 }& D. p0 L& j' V! M/ x
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 6 P O7 x4 I5 |; `% p7 \4 Y
, M- d! N) T% O5 [3 e4 e! s) d5 U; h- u" u- D" I8 I& X- I
! a! Q! ~2 s3 E6 h
! n/ d4 ~& `7 e! o; K
8 C. i8 B# c, j) C% C# k ; M& p7 q3 {+ ^( V5 R
/ l( W o; s3 m0 u- A& f# E) j' I' j
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
v' a9 _; b4 \8 n
1 T7 A3 y" r! \- V# n4 m
/ I% z/ U- {' z1 e, ?+ N LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
) A1 v! n# R; h$ V% L' x- ~ # X! M3 T0 e! F; H2 Z U( G- T1 p
" u- W+ H( A9 r2 j( N2 y7 E6 M( ] 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
: R* ?0 F- @1 M* ]5 f% N9 s2 T$ g 5 L: I/ s. q* b+ ^& q
5 f% m/ O4 ?* M' `0 a 开源的luasocket代码可以参考学习下
# `8 ?; g# ?0 O& l' _- d
$ K3 W2 c% J; M0 ~+ N5 D, y( \2 ^8 K: I7 U6 j4 w
https://github.com/lunarmodules/luasocket
$ K' M4 g( P6 Q4 ?% V2 U% J, N7 ?% n
5 U' A3 c5 x5 i8 \5 y4 d1 P% M }+ o( b3 B. B
https://github.com/fengye/luasocket
# }! h9 I) I& h' x$ ] ( V6 e6 z5 I4 Q9 k
* u, W; c L, |, t, b
% l8 s& S j6 z' t
- E1 _1 e6 }5 U; H' i( W
8 D2 t- R' L( e4 B4 H8 D
, l8 Z' @' T! [4 X 2 w- O0 u3 A9 X% t, H- r
4 q' K% T* }0 R: k+ j: z, m x
6 b, s8 q9 i' D+ p" G/ w' C$ s" }( @8 `% h $ c1 [7 M% J9 `3 a* I
/ P& L% I" ?. X: b& n ^
7 N2 I* K |) ?) x+ n- P
+ A0 `( X& w: }% s* X% V2 S
' t% w% h& }3 D0 c6 w
总结 # e, ~7 H5 @& c! Q6 i7 Z
7 W4 f% Y8 O2 q3 a5 ]& @/ D
+ F, V/ Y2 j3 s 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 9 W" f, k: ]% h9 d& K9 z- j
. G* ^' f9 `8 Q$ l! l: l' c- X' f1 o5 @! W
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
! g* s- B6 S L; o4 s $ z. {4 ~9 C7 y8 F" O& G7 |. U
9 k5 }% c0 S- c+ ?# Y) p 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 + V/ h, a9 o4 M
6 V$ s" V7 z& a! E: m6 z) x+ L d2 I2 \
结束
# f4 ~$ W6 G9 H0 Q0 S6 |: {" q( H( V ; O' l. `, \) ?" {1 V4 A9 r
4 O. \9 l: j# q! V! h7 \
【推荐阅读】
7 R/ @/ v9 ~9 h( Y9 h9 O / R, o- Q$ l4 Z h3 d: |
3 G& J7 X1 X" ?' _* G6 G/ W
对吃鸡APP的分析
5 @3 r: D [/ D- H& I
: d+ b0 X% v9 y- h$ z# l! H* ~
9 B5 C) `9 K) i2 [ 你需要了解的APP安全
( i, P9 n! z8 A & y& T2 m6 [1 w% [ }
: ?1 D! L& @. |% j/ B/ M$ j9 U
你需要了解的APP安全 & a4 [# t" L9 l! d
* A. q2 _: [ O7 ` p: G# M
/ g% @; ^: h; z# m9 h , l9 R: }. ~' r9 ~
|