: {/ `5 U' Q! q1 f, m* q 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 8 ?+ W( h- ~, ?
) ?" v- G/ q" F! \9 f C; a. W+ `: b4 h4 G+ m
: H, O* v+ A8 v9 X
0 _3 r, |3 B- N) M; m, D9 `; K: ?1 E ^0 [, Y' D: A. t
. c6 a, ]' o; Q2 `- C0 h S: E
7 W s9 O/ h; N0 j. d& D6 y
9 U c2 S' d' T
下面就以开发者角度进行解析下这个APP的功能的实现原理。 ; o* s. L$ y( h2 i+ F
8 R+ R! z- i( ^3 V; J; s# C$ B# H( @7 n) g& B p! D* I
! l9 C" F4 W% c7 _* F
. D$ n I" x/ G0 o0 N4 P
) n6 I# V' X n: k5 x) d
基础信息 5 o# ~* ]7 F. t/ |7 Y
# c5 V" [) _2 G5 G8 w
$ l& M7 E& h. z. b 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 0 u) ?4 T% u. U, n" V" t2 ~ R+ x; G
! ~% `: k8 p8 d( z$ t2 G3 M& H3 N- j# R5 Z9 F( o5 w( `
1 a! c! _" n" @ / B3 H. W/ y' ?$ d6 _
5 x6 O6 h) a' w
# k% T* m" E" P7 M6 F, \0 Z4 L
- w- ~( t/ n" ^& L; o+ f; K4 I# C! q/ Q* C
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 - O8 Y' ^5 T0 Z) x
- G/ T) ~( {, q' O; V% u9 H( @5 e8 E7 Q' { {% w' P3 Z( z7 P
% U% ?4 O5 k8 g
6 e7 W! c" l; f; ^* R
/ Y3 P+ L y, r) y# g0 s 7 v/ n8 V* e8 y7 I
; X+ p; y7 b: u; b
9 M" g9 R4 Y, u6 O" `; `6 o 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
0 x0 J: `) [( B+ P( u
* |4 `; q" Z, [+ F4 @, K+ n! T; L+ C; V' ? J
* [0 f4 c. _+ K, n
; u, w5 u' w- ]3 C7 D
+ r6 k4 b7 o% J
, p9 `) F. n" b6 I2 {" n3 \
! }" k- o/ ~8 y9 f
' J' w! d- S9 U5 r) v. f+ U+ J
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 ! S& X! A& m: J+ ` v
f7 s7 Q3 j" D
/ \) X: ^1 b, h
. @: z f/ \5 h4 e: G8 y" c
* Z d5 |1 C+ I7 A/ c8 P, c# m/ z$ e! b5 y/ K
5 b) z6 |! N4 c( q. w1 `
5 F% w) t2 I2 ?. V7 f
4 m3 U6 v+ a$ Q. J [/ a1 B9 T 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
. g3 ]0 S( d/ B& u q, D& q s; Z % o: b: E8 b0 k) Q+ a3 [# d% n
1 \/ t4 h- G: ]# t2 ^
9 c; s6 K3 p P! C& _7 P
/ d3 X$ C9 T* ]' @; D7 p/ a! w8 o: K
% m& B5 g( ]& D) X % T7 P1 R, s* }. Q
& ]. s' X6 H: f 3 d7 s9 h' l; p: I9 f
2 z- E4 e; T! o7 X! G! }+ H e# R( f& |& Z4 o* b9 B" c
签名信息
! |- N" K4 k; J5 O. h
/ J' @" R [8 T8 i/ Z
" W- `: ^6 Q& O T+ J( o5 A# A3 E 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
/ `6 i, d+ X9 d + Q$ o. H2 ]" w7 w0 T) j8 O" W
8 e# Q% E$ s( Q7 h- c2 }+ s! i 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 $ e# h* s/ N5 s B8 J0 f
0 i5 s L [6 o' u( x: F! q1 B g4 ?( R5 ^- h. n; c* {/ l
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
d3 E) R" ]$ r2 b
& R1 `! `5 m* t# A% R- w
# r; x% r1 w+ c$ h. \7 T; _
& U" L8 X" w4 j) A+ n
$ y/ m$ G' D) u1 b7 D3 V: C* T- t: i4 l& H5 [2 O$ P3 `
5 ?6 X! L! e4 A7 U# `# m j# d
4 p8 }, a+ L- O9 J% o) d1 x% q9 \
6 h/ p& k9 ?+ t7 G8 U( M- Z. J" _
android签名的数字证书的一般都是采用 X.509的国际标准。 + [4 b2 V% a7 o% e7 u' `2 r n
' q8 B: v/ m3 q& B0 \& H; h
* ?0 ~7 i* l. i( [3 V8 G: z
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 h) K3 ~( u; ^
+ y# x1 n" a4 \& c2 T
! z i# w8 r1 R8 L 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 4 ^# | ]( s7 I) a7 o( L7 @/ c
0 |7 A, ^6 J1 @3 M- D/ v) ]9 |# j
; u7 f% Y1 Z- y- D
; d& l% y" i/ G! b/ e/ v
' @9 s# d. L4 N: p; F$ S! g7 ^7 T6 I+ V; t+ ?: w' e( a
4 z) S8 K& [# }9 d* G, A
3 R( S& l9 A/ J. c$ Y3 ~( S% }
+ R! U: P* [1 q3 H4 l4 F# Z
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
$ q( B( v, t8 w7 |2 t2 R " L/ u3 g7 L, q* y7 p( h, @
4 w# H8 e7 Q- u0 k8 J* X4 v- b
2 F/ r" h/ V4 W [. V
5 d; l! X. p! O3 _: J5 Q3 B4 V( _5 ^9 H- w6 Z
、 3 D7 d* D0 [/ b5 d; ?: J) R2 Z
- \& n9 e! n/ j/ ~4 _
8 N9 e3 O8 n/ d5 m. z
/ @0 P: w0 J6 ~( \6 Z9 k" y( {
' |- G) Y% S5 R( x% b- F. x! V/ ?# N6 ]0 R1 C
权限信息 # W$ `( c K) r# M2 \6 ?9 o
# T6 `! y0 R5 x7 j9 d9 |) s3 `$ o' W- k1 T8 w& s) E8 J. s
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) / Z: \: R) J r6 r
/ Y6 `& @; F: e. V' [* L8 A( ]% U0 D& s
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 1 D [; Y" E- ^
2 h( `) n: I1 e( h; s5 w8 O& @
+ Z, P6 }. y, v& T 0 N2 _& |- I6 ^6 T y
% a$ e3 t% ?, O R, J/ m3 s5 `9 i0 Z- ?9 C
& L' d' o5 D& `3 A
" H& F# d( p- }/ S( q# C0 z. O% Q0 t- c. \
下面对这个APP的所有权限进行详解下: # r- w! @( e. K( u2 S4 G
4 F( V% W+ Y' s' W6 Q4 z; G
: y( h) b5 D6 v
android.permission.INTERNET :访问网络连接可能产生GPRS流量 ' m) \+ v$ i% F5 }& X
2 P& ]) l$ Q% N5 b
- A0 h2 G8 k S2 a2 J$ d" Q6 w5 E android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 5 S, _% S; N5 M1 f
- e$ ~# ?# k' _0 E8 e
$ w: J" ^3 o1 S2 S1 a" m6 D android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 * ?9 ?7 Q% n6 c# h! r- x
9 G& N+ n5 a7 e" l1 P
- I! L8 E, v& o: ^7 m android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
9 p" U* [7 `- P) [+ R! t 2 L1 N7 L7 _3 }. Z H5 q5 m) h
6 A, ?' t. E% N' P android.permission.WRITE_SMS:允许应用程序写短信内容
3 S: N9 H. ?$ u% s, ] 4 k! D* g1 U2 n& R- r+ w0 x! s
9 }6 B; C( i" u! S
android.permission.READ_SMS:允许应用程序读取短信内容 / V1 O6 y3 {$ o1 d( j
4 V% k3 ]# T: B2 Q6 c& ?. k( a; F
) H) T2 c- j3 R android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 2 E' m5 D# r- \3 f, M1 X
- q7 @; W! G9 s9 N* {; y% J- ]( Z0 z& _( z# o7 [: z. N* ^8 g* K
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 % v9 g# @( A- f
* d0 l) N8 Z/ n
, p# }, K( R' j3 B android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 $ Q2 x$ k0 z2 Z, Y7 d `
$ a" |* d) h3 K( _6 i/ W
2 B a2 {: n7 q7 h( D9 Z5 W# J( Q! Z android.permission.VIBRATE:允许振动 5 ^" e; i6 I# R2 k0 |6 O
2 X: S3 ]* W, E8 I# ?+ b
9 `2 {5 K8 _! K, @( r8 b4 t android.permission.READ_LOGS:允许程序读取系统底层日志 7 ~# ]! L" O4 \& f, P
/ w9 w0 R" l1 @1 _3 {5 E3 @
6 W- _# `) X+ O+ G4 ^& O h0 \/ ?
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
( ?, {; a; P* u" o 1 u/ s1 w P- D% ]$ b3 W) `- a
a( J' T- H" [
! c `! t0 q% w1 L/ t, v
: c4 s3 ]9 l4 U4 T$ G; k: i1 {8 w0 {+ q% D0 |6 N% {
功能信息 2 \4 d( V8 `2 r$ p6 Z
4 [* d2 }* T$ T/ E& V2 X( G+ Y* S! A
# |0 q) h% p( ]* p0 J S " s D$ G2 L% v- G6 f& {: M" T
* Y7 a+ _8 g' V% [' l" r& ?
' n5 P) }( U6 g 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
& L4 H b+ g5 @) J . S1 J( [5 J, \( b2 g. K/ I# R
0 \, }, | ? A" t3 H3 A6 j" ~! f Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
" L0 T4 b& E- P, Q4 j8 Q- D
( F$ Z r1 O+ d8 P5 p6 e; z* d8 [+ q0 B6 |7 I2 |3 ?
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 : U3 ?' L* m. h( e4 I2 k
/ [7 Z3 |- m, u) n! r1 t2 P! r4 z! z. D* e* S
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 * L7 Y+ U: t$ N, Z6 W- z
1 d4 _" ]/ b9 s: L2 T
+ C; J( N% T2 [, I
# n$ G) g( [0 O9 s* G9 c
2 k, G9 a4 G! P0 m M3 [
1 Y0 t" P7 g( A+ j: b/ @( k9 ~* K
" y* L( u' T* i) z . p* O) K# h* l$ Y4 ^# n1 a, {
, m* m3 [- [/ z, p, p1 \$ z 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ( T. `) D; k; c$ a; w
) H0 o8 T9 V1 |- E1 b# o2 V" u" O4 c' L8 b
8 ~( i% Y+ e% L" ]9 O4 G8 K% Y 6 C( Y6 E1 K) @8 ]% h" ]) r
8 y7 u" l# d3 K0 O6 f: o; S/ K
0 m0 x8 t- I0 ^% T- U2 I * K+ f6 t$ t$ G3 }" \
4 n4 @1 j: a M+ c; }
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 + ]5 q3 u- P( C2 k5 g4 H
& u1 g: b7 f9 O, U v! q
) K/ L1 y) [/ U# V9 N' K
' U1 e' P$ {% W! l5 F 4 N2 z- }% ?2 z1 i
$ l' x* l3 N& T; u, h4 D7 ?! Q' Y, T 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
7 q6 W0 K/ I4 U
4 Z% x1 ~% l8 Y K
+ j4 c( ?* a& v+ c8 C; X# o ! i$ @3 x# {( {( D6 p
* |- ?6 P) D. q/ A
8 V; y5 ]0 _. k$ H. k& A& h! G
" {8 q# D" D+ ~9 G
1 o3 L) S2 _# g: e1 T _6 @! Y, @6 l5 \9 \# s
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 " t) K+ t! S; y2 J/ {
2 G5 w* _/ `9 a( ~) ]3 x5 a. M3 _0 o. t# h# ?' ~
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
# |0 {% A x% K6 A0 t8 } . _. P: Z. M1 A4 g* D
2 }/ n6 t6 P y* f 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 0 b2 g6 Y. A: e8 D. n3 }
% }7 Q9 P+ W+ x; X) t! q P- }4 W+ q, w- J _: a) l
开源的luasocket代码可以参考学习下
2 ]4 L' ]) Q. f$ [5 L7 s h& j, }3 e9 J B( Q# B
* }7 B9 t) W$ e9 |9 ^1 U) T/ n
https://github.com/lunarmodules/luasocket ! i; V6 ?/ z( S
8 j' F: E4 ]8 E" A% Z. f% s* d6 n9 B# M
https://github.com/fengye/luasocket & t. U+ x5 F' ^- K7 E+ Z
* l5 J/ a6 L( {6 B( F/ p, v+ k/ h% s0 f. _; ^% m1 J& ^ j9 |
3 y- t; m+ }* c
2 q$ R/ Z; E0 a2 s: ]8 _3 G$ T' c
: [. p, Z; i/ p5 D) i- p" @3 Q 4 a. U3 s- m5 t. e3 |+ U
7 z+ _, @3 X) E' D: T7 m* B
/ ^0 R1 S$ ?9 r5 V/ F; ]9 Y
! `2 J& I. @3 X! }
( P7 \# f" P- T3 v. P0 R' g3 M* r4 o
% O# \$ \9 V2 ^2 }
- i! `% y: }! J
! D/ G. r) h4 E. u2 r 总结 ; F$ j0 H2 e& r+ I; {$ T3 @, D
1 F( b+ }, f/ q' R& `' f. q. V! o' b0 t
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 , y7 m7 T& L7 J, J* J- x
) j) Y( q& n9 c2 u
6 ?2 t' p: n, M) c" D6 ^( D 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 t$ b, F B- B: f f
4 P4 T3 j6 a/ j
- ~& Y6 h# _2 z) s+ u7 P/ S" u( @ 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
( [7 [$ l6 E& B
4 K2 |. V9 g% n; W0 j0 p5 @4 \( S- ?1 C* w
结束 & ]% r. L: G9 q( ]: {
: r0 |1 i/ h. P9 Q, q
% E$ G8 v1 ^* l% S 【推荐阅读】
( f6 m" Z& {- \% \" m4 i a4 o5 D3 j' Z
8 {: R4 H0 ?* P& X- n: N$ c
对吃鸡APP的分析 & o* n$ Y0 p7 i! x* q% E6 Q, Z; E
6 K4 v4 Z% x2 t# r0 B
! m" v; I" e8 f( C1 I9 c! n 你需要了解的APP安全
+ n3 B( F9 O, i9 s, u
3 W1 z. ~; n) M) _ c& J S! X
Q; `- w2 U4 @0 m 你需要了解的APP安全
( u/ y7 B# Y: ?/ h% }! s6 f 7 g2 Y8 y) C Y9 t% \: [. Q
- J4 H" Y; }5 [4 j: k8 U% o
- M7 h$ G! ^" r) ]7 e5 z- @ |