+ \4 x9 B+ r3 y2 t1 M! g9 X2 L
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
: f$ M% E( ~8 d: b( ]# s& j , q; e# R. q f! H+ W
; ]2 j+ ?- x& t! L
" l$ | u+ r: A: u3 |
( L$ L8 a& ^! _ T- H L
5 z) k; b; _/ m0 M ( f4 U, {" l$ X
; \' V; k- I/ H- i: W7 C- r: i' t
/ Y, m; h) v `. b% H* A 下面就以开发者角度进行解析下这个APP的功能的实现原理。
$ s+ I- A8 P+ g! T4 e" H
' F, e n* {: o5 S
3 e7 A" r2 X* y5 H ; V7 y, [. O. E, D: d
- ]9 q) q6 X$ y& |7 N5 W" A: [
! |- v1 }( Q5 r' l4 X 基础信息
) `5 A s6 J- B6 c% x6 K6 i " e" u# Z/ j% q3 p
1 |( m- Z6 e2 b: h: h3 X
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 / F& @- ]/ H/ Q W- [& `
a# U4 B6 N8 u0 X/ Y
/ U* M+ c, _( q z& H: h' c# T
/ h* d" m9 k7 C* l& ]- [ H5 e. D
" N9 }. }- S$ L H6 l$ ^' ^* Q- V$ I. c' H1 Q9 `* p2 b' u$ J2 R
9 c7 `! A8 d, E: J S 4 @: }( j% t# a8 k
, k5 m. W! |: F
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 / E8 j: x/ n. K( e
. Q9 M; `. x4 U- f6 T8 g V
. {% D1 Q% k: E2 D3 S, i ) S" X1 v; s3 ^/ Q
- K+ @7 j, `- J- [5 }
. E3 b4 A" i' M8 y3 w# k, z! r
0 i" `5 b0 F) x5 E( Y
# z# f: n: @' _
. G/ U( A+ B* l: [( @ 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 2 f. s# u3 y8 }" Q* L
! u* g, Y+ o. k3 f( v4 \1 p" f
* J7 e& h* x5 B" m
9 o+ x2 {4 j+ o( P6 V# ^7 m" V. m
; T* _/ d3 |6 s& i
% h2 g' _' |3 ^3 e) F
. G+ }3 b+ ]5 ^- {
+ }) R) \9 E/ f- ^1 w3 l5 j7 T; J7 k& l6 }, H) @4 `
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
' d$ V7 o& q! q9 M9 a S3 P8 {) h3 K% s- c+ H1 y
0 s( F4 x# k D
1 R7 V! `$ d$ c
' u, E- v& V7 f% c! Q& C( g
% Q/ w) a2 i) K! W( J: \
( e: {$ y- I" }" M4 S. R, I
" q! G: X& v' m: K
7 n6 E; o& \1 W0 m0 D 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
. y# z5 Q1 M$ ]* R9 B; N* |4 ` % S2 s8 }! a, }9 Y- Y" {- I' F
; I6 ~' T+ d T q
, _! |! H4 B L0 _ / @. P$ R& j3 M# }
$ u8 V/ N* y- d3 Q1 y/ i
+ W' j0 Y) I! q5 ^ . s1 S4 y7 {: y8 V
/ L9 ^% H$ M3 A4 [: K- \* b" `) { / H0 g) R+ {2 E- r; F
* n# ^- O2 w; K7 w
1 E) i5 O3 h4 _6 S' A
签名信息 8 X& {- S% O0 m+ p7 x2 A N
4 Y) x$ S! h6 k9 [% j
1 g1 w$ f. ?# q7 g! U* l, B: T 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
7 u: @, {! f7 N5 i* S( l [
7 M) y( F5 j# |) n6 W& e
5 v2 n2 C, {! B2 B& W0 Y8 ? 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
l; Y; Y8 G8 L( n4 P
& Z% J A1 K; f
( G3 B3 W2 F2 E F6 U/ a 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
/ I D) |+ s! X/ Y2 f
* V1 o- s5 j8 Q' c; @6 C
5 A* I3 V7 y; g* s
8 v8 [* \/ w0 S0 h% W . ?9 D# n( w2 V0 ]- N* _- y' _
1 R, y* A! M l) q/ q
, T( B c8 E8 a) h. _
6 i7 y9 V1 W$ o3 G1 N0 K- ?
_' e' F s3 n7 v6 p5 X( }
android签名的数字证书的一般都是采用 X.509的国际标准。 # D s4 n; M! ~1 u1 [& V. e
! I1 ]/ t/ N f: [" B R
7 }5 n$ \3 [; S: A, ^! P) t* C! D 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
; _2 ~9 L0 w$ \% e' { 5 Y9 N. q2 T! C+ F
1 ^# y/ h" }8 ^4 _, V f i1 R 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
* H, D6 w; K& d( S M1 g
% j: t" `3 w G: N5 n. o8 L; A/ b& \) y- ]. c5 t( I1 R. O2 a
) m/ ~1 W/ T" _" q5 c( F
9 H2 E0 i! [& `" S$ w+ V- q5 T n6 }
3 G L3 Q! H b* Z- Q6 y2 y5 y $ [2 |3 Z+ N0 [" _4 S
+ c8 Y3 v! b. h/ E. [! M- g
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 / L4 ^" H2 Z) _$ P# O
- @0 x4 C$ ^7 W' x
p R* U- p x: M' s( f
, n& V' Y/ S* ]$ Q- D5 A
I2 d( P3 Q; O, e& T' n
+ `; m4 `0 ]! C1 K* ` 、 " O. g" X1 `" h5 C; [; U3 T L
+ R( `/ |4 x( y- d5 g" Y
/ C8 ^5 y2 X. K5 c4 E6 V; F8 P4 K: [
& H0 f! Q- k7 ` " g+ E P# A7 e8 _
1 d' m- K! i1 Y( d' l 权限信息
1 K* h i5 U% W* C - l) l" O5 a! `5 G' }6 _# i5 N1 Z, y
1 u6 T6 |$ d) Q f) Q
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
# M& s" v1 F* C
% N1 V9 S; N D: `3 J$ H: s+ H# h3 l* i
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
2 C/ \7 g. G/ P
8 y( R+ ? k( i. j
5 T4 y4 {3 R7 V& G+ f % v( x8 O4 y T$ M0 {3 R' h* c
8 @' z* ]& _7 X7 h1 q1 u
3 z$ f" w. j' T" ^& X3 ~: Z 5 ?2 |. K, M0 y/ l8 I5 g* V
7 C# F4 o! E0 G H" ~# U
) s% Q% [- n& K
下面对这个APP的所有权限进行详解下: * n, u r+ u y# n
+ t* g' r u8 _4 n8 f
* q! {6 N2 J: ]% Q android.permission.INTERNET :访问网络连接可能产生GPRS流量 ! s! D4 V, g/ t% d/ c; \
' L2 O+ Q D, v [6 r; q! K" D i# k
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
7 g1 g, b: a z$ _
; U* \! i0 e3 V! ^ s+ d2 }- Y. }) ^5 A W0 H6 y
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
5 o. _- R( k4 r3 f% `
+ {- b2 W; d# A. Z& g' h7 Z" y. }4 f, x6 E. f' m$ [( U
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
7 V$ w( L( K2 \7 i1 d( Y4 d( c
, _9 d% R( N6 T8 T, A4 ]- l. Q' }, S# x9 X; n- z
android.permission.WRITE_SMS:允许应用程序写短信内容 5 \1 n7 r5 l* \+ T8 C5 U. _$ I% |
4 s9 f5 Y- E! u; v8 M' Q
( D8 j6 f8 C" s4 e5 G$ p+ f, W android.permission.READ_SMS:允许应用程序读取短信内容
) S% Y: \' K& L- S4 G% m+ I) x T8 M* r; b9 u; s/ {; G
* b: M: z, e2 Y; k: J% S
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
0 m2 x* \3 U+ H7 `
8 P7 U O+ k, ]) I1 ~" Z* q4 {# n2 s. k6 O& i: ?
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 ) ^ r6 B1 W# r
5 R: T$ r- t% p
& l$ j+ C$ `" z+ J6 [& l android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
" H) J. @7 g7 E! I& [7 U
/ Z" [! l! {+ _! {( D& v
/ {+ A9 s, _/ e7 o$ W0 o/ \2 \ android.permission.VIBRATE:允许振动
, I! s7 Q% @5 ? + K4 K( O3 @, ?& L# W w5 a
& u- W7 k1 f7 T) L( _0 X( V( M8 E
android.permission.READ_LOGS:允许程序读取系统底层日志
* C1 e1 k0 g5 z0 T. e! r
# i. G/ |' m8 F7 @! A% m" y$ [2 u1 c- L m; x; ^7 G7 Q1 q
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
9 |/ E3 ~2 H& k" \3 P4 S
, O. _) | a. p- i
, c$ x6 S$ q+ F, ~. T9 c* J" Z
% ?7 a7 E) s1 B2 r& d * d4 M* h6 X% t" P/ W% B, j
' S1 z: F O+ [+ D1 K M 功能信息
$ S% `0 E4 k! ^5 {) x4 \( d+ M
+ b* A! f0 c5 K1 P7 _, V. B
% _' K8 y1 S4 \6 l7 S * [9 \- a( B1 V% v7 b
: l+ Q+ Z, n8 B- E) L
: Y$ J$ q F8 R 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
% `# S$ ?& I1 j3 o/ {/ }
3 Q% X1 x) X9 B2 D9 ]6 H; x
/ ~. _6 o( m" W& j Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 6 f# F% M" o& g% }8 F
) x/ i% d' p6 e2 t' j3 s
( O: ?# Y. F4 y& W# G 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 ; C- O! m) c3 }4 G
9 V3 r4 \' q3 R; g6 V) O; Y$ F3 t$ S) I5 K" B
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 ! ]& C( x- `& \# o% }
9 a3 m3 Y, a0 b5 M5 `
' ^" f# x" p4 [- A8 N$ d& n" { @
' @) z' s7 j1 K9 f 6 f" [7 ^6 X8 Z0 y' t$ c
- j' D" O5 ^% x
# A1 s1 P V, ?" c3 X/ p2 G, r $ T- j* l+ a! \6 ~
& F' K9 y- H! q* T M. u 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 9 z3 F3 h1 M2 j3 Z* T. }
+ z* P f! H- j5 R- H# F" s; H! b8 }8 L/ @
[' Q" ?9 |2 u2 o0 Y8 V
7 l; `7 M- n9 E* J
" }" e" b# f* p c9 G
$ l; K4 s+ W/ m. t5 L: o" V% @8 v
6 T; c: v, R" M4 w( o0 E
. c3 Y8 ^1 {6 @
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
4 ^4 a0 x, Z9 f4 K$ U, O N ~# ?; j& e5 M! X% j
6 \ {1 j8 ]% I+ |' I2 ~! a# B
. @2 Q& Q+ D( H/ v
: R. l9 q. x# V1 u3 z& B; X* D, I3 ^& T2 F+ i* z: [2 p3 I
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
5 f% ?, b1 o% E + t/ k, c' U2 O7 r
9 h$ g" d/ P; ]$ f3 [ ( p; G( q9 T0 B x9 ?
3 `& ~8 q. m7 f1 Y' j. V. U
1 I/ y2 d5 {- d4 e
. @$ ~8 ], m/ ?+ g
' s; h$ P# k1 V) [: _2 Q6 S$ [6 L; U9 g' Y9 b1 H
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 4 r" T0 ~* T7 r
% w- U2 I* F) \& V* B2 t! Y" u* f$ F; R% A' ~, c! o2 q4 w
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 & _4 S! f# J% m! i2 f! ]1 x
" }( A; D/ X- t. ?+ T0 A( F0 E3 Q3 ~$ A
$ r' _/ u5 u. Y) e# S* [$ ^6 V7 D
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 6 K( Y, H; C3 y/ g2 E2 J
3 f; M! F2 ]( C% e" X
" q: [& v6 m# O! {8 `& u1 j 开源的luasocket代码可以参考学习下
( }# r( J6 b1 G# ` 5 o, a6 ^+ ~4 O F2 @
6 m3 y$ ~: x, ] https://github.com/lunarmodules/luasocket
/ q9 i0 W1 M; C1 _5 f$ L . w0 U9 C8 r+ a
9 w2 f& f. g* y
https://github.com/fengye/luasocket 8 |& ?* b7 D; f5 l0 U7 M1 e
( w$ w2 D/ d5 D3 x3 F+ l& q5 }: J: B) f& y1 @& k# y
, V6 p. N# ~$ Z# q: W e. s
3 b. r+ p) u! o( A+ b ]
# w9 R+ f+ s# x8 f! Z; ^, s; [2 B 5 `; j3 h* S' {6 P
. i; V! {9 ?6 a; F& x x* J* Q* f0 D$ P6 j+ g. N2 p
. y4 r1 q! B. N3 a
% B' J. v/ x8 v2 v8 l, t' T$ K
; M# o2 | K9 X* j
$ A) y, l- V8 ~: R : h6 z+ ~+ F! W+ }+ M
# {7 J1 ^& b* X2 f, c% Z. m 总结
1 r5 K) i5 s1 l4 m6 E ) f7 E4 b) ?$ B0 g
& a5 x# z& s4 ^- ^* l
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 : B: _* C- I+ z
/ A' m% k5 ?# Y
) M& z2 r7 _' A6 I5 W 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 9 S) W6 S* `$ ^0 R Q& t0 p0 H
$ v: N9 j# ]8 C7 w/ J0 D3 \( }% v. {: O& W6 r
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
! f3 h4 f" _( b7 v$ B; \ j6 Z% D
. l) F4 T, C7 H' n/ n8 K4 h7 B4 S9 ^, m6 |
结束
/ g. Z$ w8 Z& G4 l # d3 x1 t) s6 O! c$ y
8 W7 n+ A1 b! z- t5 P: S5 {6 a1 R, W
【推荐阅读】 ; I; i2 G/ z: _" \9 z& o1 S; K
* u* t/ z4 @" N$ N6 a/ _4 Q5 d7 U: D; B* O/ a; H- {' l" C6 s
对吃鸡APP的分析
+ {# b" Z1 K) F8 h2 y) C
; r2 D5 h h4 Z, x& L8 \0 [0 s6 R/ y- P9 G0 g: G
你需要了解的APP安全 / t" Q5 x* X. K: w% B( c
& s' U! @9 O7 ]3 E
t1 I9 u" y6 j) r 你需要了解的APP安全 e- p5 V/ k) F
; b4 S5 l/ n: {- Q" w0 V+ r, E* c% L0 K
}6 Z! E- H0 h! v
|