1 C7 l' R+ E3 W/ E5 ], p 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
5 V! d- O* f1 z P7 S 8 s+ j2 x( g! q; o! q: y. c
$ G6 e5 ]: E2 w$ S( ?6 Z2 K
1 G* B" x( a3 I! s7 m
8 F" L; ], e1 {( y; D' v
9 S# C5 k% _, }& G- S6 ] . I6 g! N6 y7 a7 F
1 |4 m; }/ O" f% e. G. v- K, y1 o3 \: P. u# Z9 u! I
下面就以开发者角度进行解析下这个APP的功能的实现原理。
3 K# k V5 M0 Q0 m1 H # ]0 O# [* D3 E3 `( s0 c; _5 N/ X Z
* ?* i0 v1 C' K$ X# Q
+ p0 K; [. V) O* C% z# t 1 W# D, f s7 K1 J+ c9 [! f
4 Q$ a* H, I- C 基础信息 - b/ u/ g9 M# i7 O9 D; W
5 G" K, K4 M1 \$ C
; H u( m Y& ~ 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 , j- V* I' | S( z6 W6 G' t( ?- ?
5 i% f- a% g- |) e2 c, Y
' s7 \7 x! z3 E8 H
6 ^& C; g3 h. I' J* M. U0 [* _& @ d9 E2 n% P& a# v! m- ~" i. H
9 U/ k. r0 B% @2 S+ F+ S
$ y, u$ N; z9 c6 ~9 x% h* a# \
* o4 s7 B$ S$ j7 P& R
( p( \9 k: J! A- a& n+ Y! B2 F 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 1 J$ z! g) z$ E$ x" k( Z1 J
' `$ t+ c( e4 [& R* l
+ p( ^5 ?9 Q. b: q- l
/ C, i, o+ Z( \$ q3 \; z7 W6 e
; `" Q) b( ^/ Z* T1 p+ r2 [( h$ g( F: ]( m, R
6 `5 D$ `1 v1 Q
% L; {8 |4 ?, o5 `# t1 H+ C3 T
" \0 i$ @: h5 j) H5 R; D& _! M' w 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
6 H! g9 @8 S; { W7 [ 7 @ ]6 A4 P! U4 O; R( P
% H3 R6 N7 |/ j: G- L1 C1 @6 [
/ r* ]0 f0 M& a- n6 p
t/ ~/ N2 N9 k4 T4 E c$ R1 f6 C3 q3 K8 F3 N. @/ d+ Y2 J1 c$ w
- w- w+ ]: g7 u, s
6 z8 H5 d! V2 }: R( e, \( S4 g5 _/ j
& {0 |7 P: m$ e3 p8 \, n3 y' V 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
+ D* f3 q; c4 q6 E. _6 D ! x! A B$ z l
$ c e' n8 |$ j& C" @# @0 p
: b+ y: }) ~8 W/ |; y. Z. l1 ~ ! o6 |! }) f; A8 s. |
8 |! p5 J' w7 a6 v 7 j4 P0 h7 D8 ]# ]. c' r6 K
4 L6 o- Z; o9 ?4 \' M
d8 F; W# }. @# x% k- M 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
! ~1 W: j* ^+ z9 K; o : B; l2 R4 q% C5 T- @
! g, Z. s$ Z+ M, }
' C [2 q5 V, i$ o. Y5 {
: U$ Z* c) o% V) n& _+ x( K, g& a# r. F+ S
& z2 ~# B( T& o( z3 L! p9 W4 z ) u* R1 m7 m( l1 ^) {- ]
* Q' f4 v" l, Q9 _2 h
# e* o/ ~; |, U8 ` 6 V9 E8 v O- d% }2 J* p3 T
0 ?* @, c( X- ~# y3 m; S! l) g
签名信息
4 J4 b$ _4 M0 L" y7 g ; @( x; G8 B7 ^8 l, w
4 D6 h0 I+ h8 a1 f' A
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 B% P; b1 o: P0 @" p) }
# c6 z! D- }! g1 C) Y
7 D( E6 m7 y" ^: x8 o 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
& ?2 y, h# z R1 g: C4 K ; A8 q N- v7 e! l( O8 l8 K' u. S
. b- i1 v6 ?' W+ p% Q
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 & u8 ] s$ G- m% q f; H: I& M
: ^3 G- S+ l# d
: K8 {2 X, Y8 M. O1 G" u- q
& B4 z- L/ @2 ~8 S
; }( P3 ` }( E% c) Q" }- R: _2 q3 k0 u0 K$ T
/ o* z; r6 R" o: X+ ^
M( }- D0 @4 ` O
}. x7 f9 ^& f3 n android签名的数字证书的一般都是采用 X.509的国际标准。 - k3 a4 Z3 D1 L+ H
1 T6 H2 L9 t9 z) a
0 b' D2 x! G3 S+ L; h I0 S 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 5 M4 a/ O0 q; `3 B$ Q) u/ {, I
; o9 O* D2 v- @3 M
6 `5 `- y8 I" a- ~% T2 P3 b: h9 j& c$ B# } 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 $ M9 V( S- I. j( S; W4 e- c2 v: J
6 y& b( J& w# H1 v/ Y
9 x) @/ P+ g$ y2 k" B) | d) J
" K* p5 U5 |* ]# |( ^
- z6 H1 w2 {2 d9 e& q G$ h m" O6 w0 o" v, x Q% L
6 {, Z7 @- U( i- B# \2 S3 Y& p
8 q7 ?7 N% v: K a; x/ @
C6 l& s, v, n! ^1 q, B1 ]& i 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
$ ?: e& E$ [! x1 m: r/ H ?
! a: B+ `) ?3 i0 v9 e1 P: o+ ?/ H2 N* X$ I# D0 d% x3 J! A
! B9 w& E" Z* |( Z
5 {# t" G4 D: ^; B
, e8 y% K# U/ y" q 、
; }% s" _+ g% S" i
" d1 d5 R" ~) ^6 J
6 N! N& a2 w: { 6 T, }$ ^8 m2 o( y; D
& @, Z- \. H& `3 I+ Z( s" ~- V6 W2 ?5 n5 N( `
权限信息 + f. F+ `3 M& z6 [- S7 @9 l( I
/ p; O: a( s6 N) }- @: C& u4 P
7 z- A u7 ?" {# R3 a8 c
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) 4 J- V. U2 a0 I& I. k! q
' J: D5 o% H: @2 _& E% B4 \" J' z) {: \- N' w8 t* P
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
1 ~' v r/ D0 J / ]% [4 {7 R1 P- [7 u) K+ f
2 g1 l4 \8 e6 L8 c5 q: v( ?) g
# i% E( x5 J& {
' q, H* r! W5 K5 E& P. {" ^' P' D& m' D
4 E( ]- U1 s% l3 j J% x
) x% c8 T8 g9 s' D( J8 M b+ @8 p- l' `
下面对这个APP的所有权限进行详解下:
( d. W$ I+ K6 o) a8 ~6 @: c6 Y8 M/ D
* c9 S4 a+ G4 o0 x6 r8 C: S# ?* e i$ Z
android.permission.INTERNET :访问网络连接可能产生GPRS流量 @% E5 S! s" h% A
. m& o! l. {8 |2 \0 H9 X( s
% h! h# v/ X2 ?5 w
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 6 T4 \5 K( C4 C Z' b
+ o6 f) ^/ V9 K: r
$ o+ m7 @7 V u, e$ V6 U% q2 ] android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
5 c2 I3 F8 q. u( }6 q 5 x% N# C# w3 q3 o/ A- v
! s4 Q# r, V$ D$ L1 F0 O' l android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
; \. R( E" M, [9 u3 r g & ]4 M& e" O9 T& B
B0 G' V7 z, _4 o2 J8 i, u' W android.permission.WRITE_SMS:允许应用程序写短信内容 B, }* K. m: M. H! ?
- J, S( }/ \4 m
: p5 v' s; R& ]! M. ?- U android.permission.READ_SMS:允许应用程序读取短信内容
4 A+ [3 O# x# k' A# ~
8 |! t' ?9 C6 {# A$ C
+ F) C$ D: z( c8 C android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 & s3 F R" P+ d( L' P+ s7 g
9 i! f0 E4 J% D/ R* w6 F3 k! B
8 \/ q6 r4 }$ S! I/ ?2 q android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 # x* f" L6 L# f8 J! t2 k
" m7 T N- n% h" z# Z ^3 ~, ~) a" j+ G: t, t
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 9 B2 L! u ]) I( _$ _) W/ r
! ~" c' R o* E: H" _8 W% N" C A; l7 P) d, a9 ]
android.permission.VIBRATE:允许振动
s0 D; k; o7 N+ g / |9 r. }; _. B% u5 t- g+ d2 Y: C
+ e! I4 ^- C0 k/ K8 ^. h' i: I
android.permission.READ_LOGS:允许程序读取系统底层日志
5 ^1 J b0 ~* Q* a) ^ 6 p5 k5 \) i; P% Q9 o) @8 h
# s0 R! `' l' @/ o( H# E$ Z android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
7 R& A2 ~ a) X2 P. q ( V& U/ T, R# n
( S5 ^5 ~' E& B. G8 d* b
0 W$ q8 E5 i3 L4 b* S / \! {0 w; z9 f/ R2 P5 {3 K
4 |' s5 |6 L |, b. x: y7 N9 U; d, b
功能信息
+ o1 Q- Q7 f9 H% r( `" W6 V 0 P. F8 k% f" U
; A# \+ L, v9 D. Z9 k# K2 z, o
9 d) x$ }0 O2 C
1 Q7 W9 W( J) u# ^# r
4 Y- j/ R5 t/ s' N 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 * N1 c0 o" [3 z& ~
7 n$ H" B, w* r3 @5 n* b7 g5 A% A9 p
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 ) |( I) G# v, Y3 Z' U
& T. v! a4 E: Q- P
( A3 x3 y- i8 d; E; T 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
% T- Z6 W9 _6 `+ x) ]. ?
$ F( Q: _* Y3 a' I8 o" Q4 @: a- N7 c, p s& {1 h
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 - v9 J1 I9 j5 @& U S+ O) b- {
7 H% G+ z% ^" Q+ c
t, Y! _# u1 J5 r/ p% u " k9 o y% i6 X* v
$ l( O8 i$ l- m, o: b0 c! b* `5 r8 t( h
: s3 b9 x7 L6 m& F% l3 @ 2 W5 S# @9 _, }( }( k- \1 D
+ L+ h1 M/ b1 I 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ; W9 B* ?& D; y2 {# e5 b# \& v; C
) G! X' V& B! M0 A; m* V: {& e2 }, _; [
: w( M- z# }. [0 B
' Q6 b& p5 F# ~" E9 J* o. K# N' {' a2 u# z2 M D
! d: d) Z/ F7 @) @9 I$ B3 `, ? ) t6 }5 Q/ v: `# F6 `& \. h: P
( p9 e# j9 G$ F 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 & X9 q3 \1 ]% _
* J* q( {2 {' w' Y, ?6 Q: ]/ x
) F2 T8 K! d1 |. w6 S) e6 P
5 B+ t. E. v% t4 N/ B ! J) ~2 E4 k* } b# y1 B" E
3 [3 [/ h2 T5 c" s5 Z: x! E 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 5 t, x6 b* E- ]& b! s
1 l0 X0 n, d' Q/ D7 |2 ^- B2 F
+ C# _! r+ w- x% e4 o9 V 4 `3 w* P9 h8 m% d
2 u9 A' z2 o6 o4 U3 r; _, l( o" H; V2 J3 E& g' k# e$ t$ i
' J' u; Z: f/ ?
* F% H& B; a" |, E6 N3 e2 k
( V( Z6 D; _% G+ `* ^' B 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 ' w5 y; [0 A5 U* @/ }8 X' ^
6 W. Y: y: {& T, c
; s, `, S9 ~5 ^: q ^ LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
$ f" {, Z, m- ~# [2 ] m $ {, `! G3 I, S) B) D. A; a: I/ s
3 }# C! R6 v8 _/ ?+ j( N* h
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 ! v Q& I1 ]6 P' N
: v5 R2 C! u2 z- W
& I) b; L+ d, T9 A 开源的luasocket代码可以参考学习下
0 [" L' Z; X! v1 _1 M6 h6 w+ U% O
# n+ {4 o N" W9 v! T9 K& c5 A5 U% i5 j
https://github.com/lunarmodules/luasocket
$ P M) Z3 n: R5 b
- G( P" n8 P4 x" _/ ? h. ~; [6 a8 d$ O' j% p! c
https://github.com/fengye/luasocket
2 c& c# N$ J! u1 }, m0 f' m % Z8 M: S4 T5 N) R. W/ f
! E8 N, ` A- A! ~ ^0 _% D/ I ( ~/ u* i5 [/ P+ ^, ?, H5 l8 n' A
" N! z8 G4 F- O6 V
6 G' k! Q, @8 W/ L4 {
1 e& C8 N* B$ a5 g ; w2 _" D- q" m0 O- Q2 K
7 `; U8 {) q. w& m+ Q# i5 F3 u
, F0 ^8 h* o5 E2 E" C
" k; r$ q. s7 X
1 a+ R l% N5 E y$ j
" O4 v2 x3 D$ H, [: E* L/ W9 M+ a1 H + d3 x% ], w8 k: J' ~+ R7 C# |* G' V
* i3 D. y$ o" N/ `+ I p 总结 7 X' }7 w: S$ V, {3 l0 V
% T. X% {, |" W: @6 e8 ?
; k% i) m B& ` 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
1 m$ E' Y9 f6 o% w/ \
; R' X3 s6 }: _; X$ J: x- M* h" S9 T& e
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
6 [9 |) U& u$ r+ F1 C2 s+ l- w 9 Y+ ?/ L5 _! p, W
2 V( L. u& t3 \ 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ' d8 K7 }: t1 B# |) ]
+ q- e' K" y+ k$ {+ W3 P' l* e
4 n$ E1 k: x4 Y' g+ \6 |
结束
& ~9 d4 k3 ]/ ^. v+ L( N# O " Z7 V) [# G. n5 k, l
G! r+ E9 ^8 Z: Z! \# m: d2 K
【推荐阅读】 1 B6 N0 }/ O. g/ e
7 {, a$ ^. j H+ o* j# ^3 Q
, X4 r P9 L/ \
对吃鸡APP的分析 ) f ~9 [) f' K, Q
' O+ n1 }3 O: N% c$ p9 l" D* S6 G" C% [" M6 `
你需要了解的APP安全 + P9 R) \; u$ p/ ?6 i
# _, l4 o' x6 ]
% _5 ]$ W% V5 { 你需要了解的APP安全
- j; i2 p% B, B7 y1 j, w/ k- D
6 B( h/ w- e% l9 n; e/ P+ v1 e8 G& R9 v( p9 K9 V5 @) M5 Q
1 u3 l O1 F1 S8 w. E |