4 A3 o, i$ L V4 n& u1 L8 I1 m9 V7 G
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 2 d" H7 b: _' x( {% b \
( o$ \8 @, w+ m- P9 n4 {5 J: l
9 ]* Z3 n8 G+ b9 r \
q7 P$ c5 K8 k1 u : I" L# e' f! ^7 O
' s4 i" L. t- K9 |" M0 g
+ V8 r7 R, W: Z" b% c
4 p* q! E% v2 p' i( M/ C. U: Q3 U
- K6 g% l: W4 x& S& W, x2 W9 t 下面就以开发者角度进行解析下这个APP的功能的实现原理。 ; B( G" Z% W e: J" p
$ q. M" K& U! ]1 d7 {' r
' b& u3 v( Z: H S3 F
! r* K. H$ ~' T T1 U1 }# W& e * O# O4 t" s- g4 J2 Y# H+ I
9 d$ U. V4 z, `" @, K. Q0 [ 基础信息 ' N2 c: g5 j; o+ S/ W
- X4 X3 B4 F U. I; b1 k2 X
% }, }2 W" k3 ^% ^0 D 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
; \6 \0 \. J* {- Y; x( d$ ?
1 X# y+ L9 Z8 v7 i h$ L
! H8 T4 |+ p: T$ e& { ! Q! V, d8 L o, o! N- G0 h
) [% p8 p5 h! L4 p8 c2 H9 a1 O: Z6 ^) v1 p. A
2 @. j: ?' Y! F5 m0 \# T/ B
2 k/ D c5 @6 L8 P/ b$ j1 D- S3 X+ D4 l( Y$ P
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 : Q/ \5 g( Q3 v* K
* R0 L3 E: u. e8 c3 a, T% V+ y4 ?
1 I5 w, `$ l8 f: h" q
$ q4 c: W8 E6 h: J0 S
0 t( V$ g- n& r& O& }' a* a5 a0 p) J6 e# _
6 a% D, j) s6 m0 H! H/ d 5 k0 M6 ?" q" w- N1 t$ ^& I
3 ^! c5 i" {* \! F& d+ k
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 0 {, L/ i' R) i
# @' D, i( w/ `4 a6 R; F- _1 J, q: K' h" V. Q' ^
, N# s+ c9 i8 _( r4 i1 M# a
9 y5 e' J! Q. M6 [' G K
% M% c+ B. N5 A. u+ |: C' N / P( O: ^" R. A4 ~" K
3 o7 x9 j* S1 f" j) E4 p6 c4 g
, T/ L c7 Y. f3 P 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
0 P% m9 L$ j$ h C/ P. H& b ) {; Y! I; Q( p5 X4 W
, o0 A7 T+ r& h0 G
# P$ {4 c. Y! t6 L. b: S
* h0 A, |5 @, |$ j, a2 G& n5 Q& Y6 E$ l6 n) a" g
y' L `0 z5 I4 C
& Y \* @, t9 C4 p7 p2 x
6 p# H$ w$ v, F 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 2 V) H8 }; _2 i2 ]# w; }( m
) } i4 C: [% X+ e6 o. p8 m
. }& w8 L; U8 D- ~2 B
2 R+ x; c8 R3 j# [( V) I
5 ?9 ?6 C1 e* K4 b) v3 N8 s7 ^* i& z9 X- J O3 h
0 l' l, l/ L h, U
. T/ T- U1 t4 r7 O6 y8 Q9 b
+ i B7 Z7 n2 X* Z4 C$ R C- U7 z" h+ [# J4 d5 X
5 H$ }* |: t. b' j$ E7 s5 S
) K4 E! [6 W# u: J/ M
签名信息
7 x$ @; R& K: K9 O. l ( z' ^* d6 m* p" n5 H
! C& h' ], A% F2 G/ k 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 2 t( c3 ^- s C: A
' H1 z' D& i( X+ o1 O z; `& x2 S" t
Y0 A1 o e+ @- ] 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
0 r4 \( N2 G5 C1 R% Y. W " O. _' `% T, P4 i. u( u) Z
4 s% T9 k# l: t" r& Y% j
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 & `8 R# w9 h- p
5 a5 H' n$ H8 w! ]" e4 Q% X
. W9 [! Y, U4 U9 H( l
+ e0 x I( P: M. o! P7 P
$ [$ d% f4 u. a+ \4 d: Z7 B
$ Y( H- [" g3 P9 P' H
! A, f8 s2 i1 ?0 C* ^! d2 r
8 I, j# i( I0 r+ w8 h( T
2 t- M0 O" O3 ~, H' H+ W android签名的数字证书的一般都是采用 X.509的国际标准。 - g2 t- c6 I4 }" L
0 m) z E% H% f. G4 I
1 |' V5 Q- s5 t2 G. i. s5 m; { 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
9 b& A4 a0 W' S' X Y
$ y* D6 P: P- t9 Q" {2 P4 T4 P' W# @" Y F: E5 d4 S
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
- t" Z- y8 w# e2 u, r 8 T+ I$ w0 Q$ P5 J, ]( A2 L
2 Z- Z5 n$ ]7 ^9 T1 Y" c5 M# u & u3 ]/ A3 F2 u$ a1 N
2 W$ j8 p% d1 ~. A
+ L$ z* H( ~7 V
q+ [2 i. f/ g2 P! O
: j0 G3 }$ P. C) V% q; r: d- j) C4 K b. e; d; W5 M. n
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
& |2 e Q0 d2 U: Y& |7 w
7 h2 w: ?- ~% O' [; Z
% P2 `" A5 g$ ?. @ \" k+ t# s; n7 N6 }9 s
' K0 r& }- e! ~" i1 V/ W: I/ \; c' ~' f- J0 T6 U! O
、 " |) H6 Q+ P) @ o
3 Y `* i9 s3 T4 l( I
/ c8 q" {8 K8 O
* @0 \! g& n% `7 q - X) a9 }# T! k8 N
! r' a+ M& e6 l! D( |2 n0 m 权限信息
/ l9 {# Y2 r( c1 x) Q ' z [, H0 R* ?1 J7 K6 v
. r8 s" A2 L/ l% I; i9 J; z 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) 9 a" N# n; v u$ d5 ^
! j+ @! g. K4 \+ ]+ o
( ]2 ]& a& B- v( ~! H android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
@& v5 K- d0 v8 g6 F8 r 4 Y. j7 ?3 E, L3 k. `7 ~
- I# E% Q) W2 d+ J' _5 n, p ) A% U' l- R2 g" j8 L; j
6 W" ^% w/ V; E2 k8 X% {1 u' x1 K& ]$ t: v& {" ^: r
" w0 H( x8 P* W1 ?4 B ! e+ f$ T) _* Y" r8 d
3 l6 S, N$ w! n3 Q2 K 下面对这个APP的所有权限进行详解下:
2 |- U# R4 F8 Q5 ?7 d' q) {
3 k6 {( P% J( U$ K% x* d! {. C4 [! O' z" j
android.permission.INTERNET :访问网络连接可能产生GPRS流量
, i7 |3 }) ]2 Z0 n ) e' E0 k" _8 G* h( [2 {% L9 ]9 T
0 B3 L R, K$ x& Y+ M8 V- k android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 * ? _ i* Y) l. i
) w0 P9 `" m7 S$ Y
: a7 Z) j; H6 L: Z android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
0 L- ~) L/ H4 L
+ g) Y1 Y% q1 f ]- R( i* y' a. K, l( X
0 @9 Y- V$ ~* `; U3 Q. A android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
$ x7 ]( Y$ `- O; r) p+ { & ^4 [9 `' J% N L* ^3 {, m6 u
4 m7 B7 b% j) d& _' w: z* E; h android.permission.WRITE_SMS:允许应用程序写短信内容
5 _) Y8 s. W" Z; a( `6 M+ g$ J- m : ?) w/ j4 w0 U9 ?' F% D* y4 M2 S0 |
4 l( [" ~8 ^ h; {
android.permission.READ_SMS:允许应用程序读取短信内容
0 Y1 K. y8 k9 @" t: q 6 J D7 l: c7 q4 {
0 Q# j C+ F, s S6 k9 x
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
) q) B! M" A% W: ]& G
( v( }- C* k2 d6 p' L, i
$ N$ \% F' v: P1 k3 I android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
$ Q0 M; w, v5 y; ~3 S* }5 e( v9 I9 X& {
6 ~* v* K9 V1 V, h% V" [; y0 T. m) [* I B9 K
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 : r5 m9 C" \; } x4 N7 Z
$ V8 a H( X$ e9 N3 U
$ m4 F4 Q6 |2 C \: h* r android.permission.VIBRATE:允许振动 9 W: i! A- b; a6 x: r( h+ [7 F. v
+ m3 u2 c p( s3 f9 C1 C; Q- o* s1 E4 H+ g. a
android.permission.READ_LOGS:允许程序读取系统底层日志
9 _# d* W/ Y' h) w
! F1 K" n8 x4 Q* g1 m3 i9 y- ?0 _! |
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 9 U1 [- n: P6 N: \4 J7 p) f6 \* `5 D
. n. r5 E6 ?2 {5 y3 W& E5 O B0 N- C( n4 k) ?0 M2 K0 k" q
& ~4 z0 A) L9 w" Z4 `
/ Z6 [+ g& P8 n! d" }
* U7 O* l1 K5 k- v( z 功能信息 * F& J3 K* F2 O+ \& i" J; T
2 u6 ?9 q# q1 h6 |. [! ?6 j8 u/ [" J9 U3 s9 O
6 C: l1 \: @* R
& h" ?7 b* y' V+ { T2 B+ T' z. K+ ?. n" _5 d1 u
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 6 W2 X! U3 ?( G0 w
# w+ j6 |/ B- f g3 j' f
) y: K! J" i5 F: I* c Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
! |1 o5 v+ f, J
. Q6 ]& V9 R4 T( X) i0 \3 \7 B* h% L2 O9 N9 z7 H- }( J m
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
c i; \8 X. E5 l; U& z# A
! t. R- ^0 E) }6 W
, g" A2 |' _7 e9 _ 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 4 g# R3 P6 I1 `7 z4 D
& w; D7 U" {# G3 k) M" j" F( {$ A1 c' m: M0 E0 Q: N+ R2 v: {
- q1 C3 ^& g5 j) _) Y1 p: p' v7 q- Y
3 {* u# h, D: N% s) d' {5 l' b$ _, S- V; O5 j, g1 ]3 ]8 q
4 H2 K, r# F5 }
) X) {4 V; ?4 g- H4 @+ e# z, U- `" q1 _" U. q/ ~2 [! G- k" M
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
$ t- A: p4 e/ e" Y' q9 N- ? : H% u: ~6 i5 ?. e' c
4 u0 I1 m+ x4 s5 I% ~
0 T9 V* U: b" z4 [1 Q
. a( Q/ W* @4 G/ B1 A0 l# r
1 {! W L% s3 y+ L+ i, H1 F6 z8 @
* E/ H+ s/ C2 M3 I" v& g
$ n' s) u$ X7 ?4 t. F# m( p# e$ ~- b/ b: [7 @
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
1 a6 I& a% |, w) w+ I) Q7 y ' h. F# Y( }- F
5 x `* [. z" @" j2 q
- l5 [8 }: ^6 l5 x. I
" ^5 I: _2 f& P/ f2 M4 l( Q
4 e0 S p* q8 t3 v7 S9 _# S! F' w4 ^ 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 9 _; N, a. _" G0 k l0 M; t8 n
' Y& h/ b$ m( G2 C3 W( t
8 [& K" |) I9 T" [" P& }- I) j7 J! K2 G
, `( N- n" S/ E }) Z 1 w6 ^/ G- t5 D5 W( d4 Q0 \9 B* W
: v1 n' b3 }5 A; G" i
$ l5 ~. z) [. y. j5 o 9 y7 D# _8 O4 Y+ ^0 y1 H( c0 Y$ ~
5 C l7 a+ m2 O: F7 E p6 Y8 ?
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 * S: W" A2 Z5 ?
. P' x7 ?1 \ R C/ {, `
: L* e- o- C M, d
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 + K2 X8 X/ v" x$ h) |4 I% \
# d# W$ }2 _! y5 z( o( i
# l j) w" v* T- A$ @3 L4 i 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
- Z& J# |! {4 J, s: n- c) K4 ?
) J* E* |8 ?' [/ O* g# M' t- e9 G( f# X; x7 E' ]3 M, [1 \
开源的luasocket代码可以参考学习下
- O; Z1 X2 `, @! Y0 Y( N1 P5 m : y( d: Y* N: `% H$ q, o2 j; k) D
; ^- W. W% o+ P) c! b: N
https://github.com/lunarmodules/luasocket ; a# R L+ r1 \( W7 _
- e' M; ]& B B# g0 I1 x {$ s
* }! Q/ [5 o6 D+ k' F* p/ ]7 | https://github.com/fengye/luasocket 8 ~/ v& A) A5 N9 H( q+ n. T
) w4 Z. l, u8 T( @2 x
4 m( B, m1 c6 ]& x" a9 Z, b: o% s
! E* j1 `" P! w6 u/ w- J2 I
& X$ c' N: z! o/ `2 v n% ?8 k9 l
" J/ A6 F9 J4 P* M+ T2 l- z
) E. U9 N4 l7 H2 l- T
A$ @$ y9 {/ k8 `8 n% B1 n- K5 Z3 U5 y5 f; h" v
0 w" P6 s. Y5 k/ l% p1 r1 {2 h
. H9 j9 {: K5 z1 d- `* Q: t$ T! q! H3 B
( H4 \# x0 {) G9 s3 W
" Z& L$ U8 b ], j. ?3 E ) |0 S& |3 A% Y# |1 T
9 n. M% _ \ z
总结 * _; E7 C1 K7 H: @6 Z" q' a
3 O+ [3 W) i& o
8 ]; r* M' ` Z 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
* V3 }4 W5 f& b: G 2 b* g. A+ `6 w8 g# P+ \2 _
6 W. \9 G. N3 J' I# W
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 3 t2 L& k% t- V8 c1 O% f
' ], W4 M9 Z7 B9 `0 P7 B. Y
) C7 [+ @1 r: s- ]+ S 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ! b+ C7 Q& d+ w0 F. S. N$ `1 Y
* G n; Q0 E3 y( Z
. ^) h3 [" ]+ r5 G( z 结束
" R0 B2 T4 y" U) a3 _ * G% I E6 F$ L" b( k7 @ K* w% P
/ o. x j( ]' C. H 【推荐阅读】
3 k8 h/ ?6 h/ K) P ; D9 V3 r, G) _3 y( H
9 w# U- X3 b Z5 b( R
对吃鸡APP的分析 $ _: I: j* P- D& W( a, v
9 L. o/ P7 k; H- ?- i% k, @1 ?" Y/ i; l0 h% R2 i
你需要了解的APP安全 & U& x+ v1 n j5 M. c
% \3 m- p q: H( w8 w, W, n7 ]
1 a3 A) A$ [8 J1 t% m* y2 b2 i# | 你需要了解的APP安全
. S" D& i6 F- I+ [: j7 Z5 i & J* ?( \0 p) P( b
5 \ l( }( i/ z7 ^+ N5 _3 P1 J
& e. S, a# L+ L: t. j" h; T# g8 W: T |