2 Q* k5 J3 t2 a# k! T; O
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
# C( y/ o5 Y R v : c. d+ d9 ~: n* J: y4 |5 Q2 h
, R: S+ K: o0 B; E1 W9 @& a$ P
, S9 s1 V3 Y6 M8 u5 r% I
. a) D5 ^1 F8 r( N
6 j0 }) i& ^4 D5 [1 P) m& S2 K% e: F 5 l# W: Q7 o3 t7 d% {7 _
* p2 h% O0 n! Y ^: i) L
$ m4 p0 V& N- Z! D 下面就以开发者角度进行解析下这个APP的功能的实现原理。 ) K0 o: F- f" }" @3 S# o0 i
5 K( R+ F0 L* y, O. i2 q
9 v/ ~) \1 A+ l& h 6 N( Z0 O3 n+ P) t+ x7 @5 Z4 v
0 Y2 {5 Q# X7 G* B
( N ^& o& V& n0 C
基础信息 ) d/ v1 k: [9 k' v1 H: C6 \9 ^
, N7 k0 p1 l0 w4 r6 s5 a7 [0 E6 Z8 y8 |' y
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
( H M" i- w% H8 Q 1 k q9 x$ w0 F+ Q; v8 v
" G- B( S1 w. j1 k% y, K
' ~) X0 p) A( X) B
) N$ @4 t# n- p! L; U
: G( h6 ?7 S" Y; o* ]" c
. V! v% i" Y0 |3 |5 M3 s $ a6 W0 A0 X5 O1 W) q* i
3 q, c7 a& w/ c3 X! A+ s 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
8 z' D4 J; `3 P5 v* C + H, M6 O$ a$ X; e. u
3 x6 W B9 }. x/ ^
3 c2 e" p1 W8 O5 @8 \, c
8 ^3 x, Z4 g/ O, @% B$ ~# @) Z( D1 q2 k! `
; e: {% y4 A; u
! {, w. O6 H* C2 t0 R8 u2 U3 m1 w* l4 B/ [
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 ) L# h' k& n: n( ?3 M+ ]8 Y, z6 x
0 ~8 E& b3 Y6 l! `6 g) l
8 R9 a7 }2 V1 K1 K( N) C8 D. d5 U ! \6 m; e, m( M9 k* o& t( Z
# G% ?3 r/ X9 _. M5 U6 A* ^
' }) t( T( ^% x4 V2 t$ S4 ^+ [9 f
0 S! P- U! {+ D4 w$ K2 u
' E0 g$ m, Q+ N- t; R/ K
7 _% ^8 [) I+ a4 V8 n6 F! i, I
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
/ j9 @; I1 D# D0 B( X4 ^
0 F/ a/ k1 M4 \; D" i
8 L) W% a: g6 f" x" M7 T $ v4 `, c, z `4 `6 W$ B0 |( L
?/ w8 m% r G6 T1 y& }# w* c
G; [( Z5 L& E/ S4 V, ] ) }7 i2 G7 `7 Y7 H
, {" w# U4 v' f5 G& C7 u2 T8 O
! H# \. k1 j. J! b, f- L! G. h
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
7 Z9 Q$ l+ Y( E/ n 5 L2 J: E$ C: u& N/ x+ e$ j
7 G- E v5 j- E( p5 U' ` k
2 r6 D9 _( T! ]% I
2 p8 |- o# n. X8 X, @: q: q1 J
+ U" T$ o3 G9 c* I. u
W) H, C4 o' P7 R: [9 P ! k& K; S% x5 i6 w! Z8 @* A
! r' t# m( p/ g" R! Z2 r$ n
" n- q: c% Q( O7 v6 Z: h- M! O
# R0 \- F; z x" n: X& U5 [, o8 U$ X b8 _: ]: b
签名信息 2 \# J7 ~8 @ E& Z
+ y( I9 E5 Z0 @3 b6 L/ l! P$ x _$ p$ e; P' q' x6 b: @
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 & p1 A( ], W; o; q6 u4 {4 r$ D
) d2 B! `1 r2 F$ r% _7 ~
6 Y3 L9 m% m+ W) U# r' t
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
1 n: P; g' l" e$ n$ v' J
' H6 G9 R, z4 z5 _! ~' g0 D( T
7 K: _- j& H, L7 Y# a 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
4 |5 e6 w; k" _" M% t' m
) ?' Z' K8 q* T- M* O; O+ I* V9 l7 [/ @/ ~
* L; o0 o" m6 q' w
% f" g' r7 t/ c( }( @* b& p" k' t3 Y* F" H1 U. W
4 n" G9 w' A4 L, K4 D
c( J4 D1 C. y
3 t# M. n7 {' h5 G
android签名的数字证书的一般都是采用 X.509的国际标准。 6 m5 N# M( _! l( W
, O* Y; N& Q7 l9 g: e# K2 M5 S2 E& S: z, T( {$ k3 r* w
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
% i; c6 g% {/ H1 V+ U
# z/ X ~/ _% A1 B& U9 ~6 a- G! A2 ^6 c/ ~ E1 {8 c4 V0 w* y
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 2 y/ B: B- \6 M7 _
8 }$ `* l6 L* W( i
6 p7 D$ Z$ |. z + I4 @& y+ D7 _0 g( F( l
! e& J0 m, G' M! N3 E, E" T5 y
! {/ l x8 @* G8 P9 e5 D9 O3 S
- m( o& t5 R+ l; s
) g1 m; X1 J; O! z
B$ K* q. v8 w) T+ }; | 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 & ^4 F% ^. f" Y# {; U: n
) l# B; I, d1 f& v
* U% W. {8 j+ e4 B! {: q
% h; a! B' C& S- V9 f
- I; E* @# L2 |; F9 G
9 {- u! i+ B7 v/ S- L) t$ Y4 o 、 % o+ v2 k. j. ?* F
1 P9 Y' m. Y% H' n. _
: X* R% s; T9 k3 Y
2 S2 P: A4 Y. p) H( \+ z3 R& L
, Q3 Z6 F/ b2 Y) D5 Q, W) s1 i: A0 k8 ?- s' m% w. J6 X
权限信息 , e) f) p" {# l7 Q# O
$ E6 [; N5 _0 ~. U( a) z& f1 M7 _
& c3 ?; l# m% a1 U* {3 G `7 J 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
# ~3 c; h/ ^5 u* L# F* R
, V1 F% G( D1 b a
2 m, R) L4 P/ `+ ^ android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 . B, m. I4 d9 \! F% Q
2 d* l8 B3 G! A1 `& _ \
8 P8 O; P; |: J4 k7 i" u5 V
* B- l6 O O% K5 G5 W2 t9 t , g$ Y% p2 Z6 R" ^ h# @
0 n, U. Q/ y+ J& \$ s 3 b5 r6 G, C# R% L
3 G* _# j4 B" K
: {) t- `0 A: V. w9 b# L( J 下面对这个APP的所有权限进行详解下: $ D8 S3 j0 s$ [7 q% ~! g
! N) ? b- _! |. Z! a' x/ y6 t) C6 I, x
android.permission.INTERNET :访问网络连接可能产生GPRS流量
\ ^: O8 Q3 J9 N- ~5 J3 n
9 C2 m {/ ]6 H! v! n, M
/ E9 Q2 k; q" a6 k) A android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 5 x% A9 \' Z7 l T7 b2 P
9 Y" T- V% M2 H) l5 O, P }
8 l1 N5 u7 F2 G, I) ]2 f1 r* p+ y
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 0 J' m; J+ D- E0 n$ s: U1 `
3 n0 D% z- Q- \& Z# w
) x4 \ R2 i8 o g
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 3 V* {3 \' M k- z, w1 m$ S& y0 M
$ z; ?: Y. X) ^- L1 I( [. R
; r) w) |3 \/ F2 J android.permission.WRITE_SMS:允许应用程序写短信内容 " }$ P2 A! e! I! J& \; g
, b R4 d" ?2 n, n3 L6 l) ~6 W
1 ^: n, Y+ f' G6 M+ j0 R
android.permission.READ_SMS:允许应用程序读取短信内容
6 Y6 X0 k$ [5 t3 T
9 M6 c& [4 C( Y
5 ^$ N* P/ f. k% L1 s android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 6 E/ c: n: j. @0 }
) x4 {# q# O' p7 w+ K& {! c# Q
& T: s. m3 Z5 _; Z+ E" i android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 8 x" ~8 l) |7 n0 z
/ V* R2 b3 N* y2 i
; j1 T! V% U) S( c/ m9 x2 r1 M8 K android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
) f4 L$ m, {) s+ Y) p3 I1 H0 w5 @ * V# V+ l6 N* |3 W# X
4 m2 {0 W- n" j# x7 S; L android.permission.VIBRATE:允许振动
( ?" p a1 D4 h
. H1 B) m8 d4 |1 m$ l+ u* ?
* m" N0 [4 N$ A+ f, p5 O) s# T& [ android.permission.READ_LOGS:允许程序读取系统底层日志 # e9 |& h; Q A6 I: a
7 x# j* H$ I2 f7 ^) |- y- L
5 o) f. Q1 T% g android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 6 W4 ]) c9 G3 G' N: z( q& E: w
/ R0 N9 q4 o9 w; N) M; U0 w$ V8 d
' _, N$ H, P5 c / l0 A, j, L( W: ] |
5 L2 _! u* q7 t9 W5 E% }1 }* Y
( f* w% ]$ f& h# E/ M& G# B1 B, T
功能信息 : Y, Y% H+ G( M! N p! f
+ w* P b$ w* q( }/ h$ ]+ [
2 m2 ]8 j. h& f' i& j" m' e
: O( r% M/ @- q
5 L! J8 v: l3 u: K: K$ n$ Y0 a* A, K* I" C0 S1 J
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 * x0 g* R; W6 A: i8 V2 G
l2 ~4 f4 K$ G3 g7 I0 H
8 o5 e/ `' {9 w% Y Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
7 X+ u. h2 |5 z3 |% m
/ M% M K( _ s( R# P3 a9 o8 N1 B! S+ P; i" A5 n- J/ j
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
2 b$ U+ q" u! C! I) T 6 @& O$ v. S( A7 h: s/ x3 V' G
' S+ U! O5 c0 x4 w! i$ t 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 8 E/ K; G4 O4 x& }
) b4 C' j1 d3 Y8 U. ~* Q
9 w2 h. f. G& [5 N- G0 R0 m0 k7 A3 B
# I+ V! Z1 L# B; I. n0 J. I+ G3 N
! R! R0 S1 M) l! d/ w
2 k: c* f7 s* K: s4 N8 X3 [ 4 w) q) ^$ y% _2 J9 n6 A! N
$ P4 P: C) p1 S5 a5 r& I8 D& M9 @, G* t. w% E1 h$ A: u1 R
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
: v8 u' b* I4 z) v2 ]- h
% [( b8 B$ i" s! g5 @( o- A
/ m. _) e& h% _+ s$ \ * Y- H5 M' n& n7 [! ]
0 K8 I3 s. G( n* G" a \8 ^4 R1 i3 j
D: H" x( m% W$ I, v
% M+ Z, ]! A7 A- ~7 N+ Z3 @ 7 Z6 _' s8 x/ q$ d: o
, ]9 v7 K1 O% G
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
5 W: s; J$ j- O/ `! F
7 c' z% n. S! t5 M- E* Y) b3 b$ k: {) I* `$ F
' T6 ~, |9 O- L- c2 Q' U+ n
0 U( H5 J7 M( M+ n
! x! F4 ]7 p8 I6 N2 {6 _" O. [' I$ L
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 3 [) y" {. Y: o8 c
0 j; E# r t4 ]0 y1 r% v& @, G& [) h% S+ C; T& v
6 w" t1 _7 h% ~$ n1 S6 R ; Z" d+ @, b. x$ b# ~( q2 ]9 j. a
/ Z, J3 S3 o( f c6 y4 G( R! L. U 8 p, r/ a: e% }; X' Z( v2 I. \
. h$ j0 {* d: N, }4 {0 z0 F
6 q [8 v3 m1 C9 T" H" P; D
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
- v7 S! G) u0 d' C* H - B' J& o1 \" t" ~% X
# a. c+ }0 ~/ X, w: I LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
8 L. x. H; [/ x$ V& A0 I8 J( k : f% o, y6 \, c8 S. a0 r
2 ]' Y b% D- A3 K
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
! [% t B) D ~) F6 Q: z6 A8 e; y + C$ k$ I1 M7 C0 _
% N0 ~/ b' r8 l. v+ `; U1 N( O2 @ 开源的luasocket代码可以参考学习下
9 G. T0 o$ O. o5 X6 W # l, @; ^" } e! I* ]' N' t) s
5 N: t4 p- p5 [" d' J d) c" l+ Z
https://github.com/lunarmodules/luasocket
) @3 z- A6 V# o' i& \9 P & }6 w) W* N# j. i6 V
& C6 U3 j2 e5 f) V6 {
https://github.com/fengye/luasocket
/ m, L8 a* {6 t, y
5 W, g( k$ b' x# t" Y
% Q7 K7 L }9 c& ~ 7 f' y! q4 b/ c8 g" k; q
7 Z3 G3 m" S( @( D+ Q
1 w8 u/ D6 `4 _2 p1 N+ p( | c1 A( R, ?7 J9 Q* v- t
, A8 q' n/ Z( M" }4 l p- k! W8 e9 y: m; G u+ F0 M
% G$ C$ C0 @! f9 E8 ], Y4 E+ X ! ~2 ^% e; M3 z& {& e4 T3 f
5 b# _- |- U+ I) { [& Y+ J; v , w! E4 A# Z) c7 Y# F9 C2 L
% V8 W9 w. ~, z% G& F/ n
/ ]; q4 }2 S. }) B
总结
4 r% x0 g7 [; M4 _ & F' O$ i( e: E* g2 |
+ ?$ W8 v2 h+ f4 ]! b# [4 l' b' N 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 X/ e& s% l3 E5 F& g4 ?
$ M y2 E I' R( R% ?- A3 n5 Z0 o: j" c8 \7 l! Q7 L Z2 t
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 9 c/ @$ N: Z( X% v. Q; Y
$ g* V' g& ?, T8 G
- Y0 _( N, M8 ~! N2 K8 y6 m. t7 t3 N4 g
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 $ f' G- f, Y. S+ ^
1 T! _7 m3 d6 J' }, r
+ L) O( g& ^' @$ g" T9 @
结束
+ N7 [# c# m7 m. g6 E9 P0 R( U
0 y' ?, v6 p& Q' p; K- o6 U( A) J5 @# o1 m' r
【推荐阅读】 ) @4 {. |# r( k$ d" U
! y. T8 ?1 K5 w; J$ i
; M; }+ M0 C9 j 对吃鸡APP的分析 $ n8 R$ G7 J( o7 X2 {# K# X6 f/ h
( x3 c9 |2 g; y! A
. c3 H- T1 Z+ U$ n7 Y" i3 x3 d: }4 c
你需要了解的APP安全
( f c: x: y8 s4 P) E" O
9 Y1 A/ Q, E$ c5 L
/ P" Q2 a2 ?& q' u T- E 你需要了解的APP安全 - e' z- K. K9 p) h( v+ ]% L
: p: A8 P: R( z) K/ r. d& d) I0 c9 ^8 f" b
1 V* {, ?7 a! c8 R2 ? |