|
$ Z, a; K7 o) f1 m; O: V
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
; v0 E; `# m9 U/ o5 ~8 R4 i9 M
5 n% O0 j# d6 c1 O
! E" J; w" I% i ) p4 M# M& n5 b0 P7 n" q% I% o( y- F
; Q2 X& ~8 f3 D$ k' \9 h
' V7 e1 X" F' L/ P 6 ?6 t8 ]; w& ]3 A
3 p# b" G6 S4 o1 y0 j. g/ Q
( m) r2 Q. w, f* V1 K- ]- @
下面就以开发者角度进行解析下这个APP的功能的实现原理。
7 V; e- e' g' y H8 k; l( t) w' A# e
& I J4 C+ ~! i3 z$ B
9 ]5 Q. r$ G8 E
l6 o7 L% E) @+ G3 A, \" R( N ( s3 b- y' z' p% X1 N R8 l
* @' v( }8 n1 {- I
基础信息 / P Q. s" t9 j/ w" z$ v* Q
( I6 t" d' r7 z3 {
4 x6 o/ S) _! W
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
) S1 I. _* s. ^: v/ C* \& K) Y6 n
4 p# ?2 ^/ d3 ~7 P: N, z2 q: h8 R
$ j: J! S# g& W( }, u# D
4 \" s& V5 _% U) }' G ) y- b5 h3 F* d6 g9 b; _" {' W
3 N' X- P0 c5 p. ~3 o+ c+ o
" s! A$ K8 e- R& P p! F0 B0 Q
+ u6 Q: o% }2 ~( K/ F, D9 M; F1 Q& S3 E; I& A
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
# Z- I* j" V! \; R& \! i3 Z
8 ^ T: O8 k5 s! V0 o! |' I, h) G% S l/ u1 @
1 B5 H* @" H( @) @$ A% Z6 {& u
2 O: r4 F( K- J! I4 N8 f! y
$ l; ?) b* ]8 a9 r& E" P9 E g 0 e: v* C) y9 W4 Z& m
' b$ r/ v1 N( E. d7 o7 L; Q
# M5 [% r$ ~: n; [- G/ D 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 0 K$ g3 p6 ~8 H
6 ]8 w; ?* Y% ?
0 q* ?3 b# a! v7 R1 @) c& i
) L8 A0 Z1 q# ~
+ L( c1 D* D% b( E
6 I W, E; T) E7 R2 I
6 A" R& }+ z$ \; z: F 0 l' _! U* @' H9 ~4 T: k" p
* E/ K, X+ w+ X$ p
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
4 c- B- o* j( d" _ `5 I ) K9 c0 G' g3 P+ T- s
! H3 V4 X( z% ]
# c* J) I! ` v+ n+ c- r/ h" N4 {
! w$ _* _8 ?3 i5 M
: e! C; N- a$ U. H( T
( ]1 Z: K+ y- J) p; B
2 d' X; {# r( T! i! F3 _2 F p' v p1 a% p2 J- ]) W6 N5 c& c
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 K# p5 g$ g1 j1 \
5 B- F$ f+ h: W# H
% P- J4 E- {$ N' ]+ ]: J 8 g- z0 Y/ E: i8 O
8 @' U! y8 s. l( a6 i* N' Y- X
3 K- p6 i( ^; w" @: n$ s6 v
- R+ o8 v) v0 R/ F1 n
; v4 x# R& b7 o! h$ C8 B
; J1 _ H# o/ _/ {! D
' n: f6 g( J7 ~" y " y( n$ g( y$ u8 S
3 g8 B2 N, |6 f) p2 ] 签名信息 ) J! L6 x# J# h* m
; X% r0 z7 }: `5 U
8 j, F' U4 S2 Z# `1 I
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 / Y; C: L G+ I: r6 F
7 g4 P7 q1 x0 I, P( H4 Q# l
/ g, j2 D" X4 M& r
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
7 C: c$ C; T7 k- k4 | 8 X7 [( K- d6 r& C
7 v. ^# ^4 }% U 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 . _$ R& p! k1 u' [! g! W6 r
% ?4 s) I. ^) g F3 u2 ^! B$ k' L b y# J
1 Z; L2 v* ]; G' x3 B5 I/ c
( t( M) Z6 w1 e: C! i/ S3 ^# a
1 A" s( |1 v7 T# m5 e
4 z" [ p7 G9 W9 `4 r' R7 U* l
5 B' X. U0 U1 G9 [
- C) j! `) _! v$ q& R, E android签名的数字证书的一般都是采用 X.509的国际标准。
; [, L4 B- z1 e1 T2 \
/ j4 C: b: i; H6 r. @0 W' A
3 Z3 U1 e; h: C/ _& z `1 F 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 $ R5 p* B" A. ^) o
( h! \" `; v5 e+ [* Y5 M2 W# S. ?5 w2 R
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
# V) o- w3 u6 i9 `; k 6 N$ Q8 B4 C% _! J9 r) h4 U
8 a0 q7 b! V5 t! y7 j/ [
3 h" i- x7 y n9 m, N
& M2 u( h% w* N& ^) J: d2 u+ |
, [/ A9 g+ Y' ^# V: ? ' s: w1 I/ f5 S* N
+ l3 i8 I, g' U( M& |
8 l' n h& U4 S6 q- |1 w! e) a
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
: c, W5 D& O4 n. O
7 n4 V% `; b1 S, }9 m! K, `& I8 i- G
3 S( H9 n) a# w. T8 E
( f0 |* m% ]# e, ]2 k6 o, D$ e2 ^! g+ r/ M( a
、 9 ]0 A& d# {: Q: ?( [+ ~
9 Y8 U3 I( k3 r# J! I, u
" }5 Z9 R: Y6 S! ]+ s* ?( j
8 U( x' J: z/ F. i0 P5 T ; w2 C" k% V' v, S
# }2 h$ t" g3 B% N
权限信息 9 C' J" ]6 \6 q5 y4 p
9 w5 @0 O( C- k; `. w; y9 b2 R! O3 G: v
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
$ i4 {4 N* l! D1 }7 F: a- k
+ h# h" D2 W& n' h& ^2 j" }5 F' {) b( `8 l
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
, T) {! x5 ^1 M' H
! N G; M! g5 c6 _5 B, _+ o, N3 ~5 E
' p! u' x: ?5 \/ u
' s! T# \+ f" u/ w3 R/ Y) Z
$ ?$ m% u2 l! Q! F9 ]& ~
. y# w& r. j: }$ f, z1 p3 S% c 4 F& i E! n* ?* a; G: U
& w0 J; t' w. y7 d 下面对这个APP的所有权限进行详解下: 5 R7 Q, U1 f4 H" W0 z
. P& F; A7 k5 C' i7 K& I4 r* {
8 P* ~1 i* y0 k( t, K android.permission.INTERNET :访问网络连接可能产生GPRS流量
8 i- m' M3 B9 W+ V 2 }% v7 [9 W3 c3 T* E# R/ N
% |: Q6 N8 q& L' V9 b; A0 Y% L0 p2 n android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 6 U q7 e5 o ~; |
6 z; `4 M; \6 N+ j( O) w% G/ Q! _, k% D/ t6 Q+ K) Z
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 4 |8 m. i v& h( m2 @3 t& n9 d; B: C
j0 |" p" ^9 {% _
' S3 u$ R( z" b android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
4 U# d: S5 [$ m1 | & @8 h! H: L' @% z. g
. K3 U, P' h0 k& h/ _9 J android.permission.WRITE_SMS:允许应用程序写短信内容 # u- S8 q- f& D! M+ z
4 y0 V" B% |) O0 D9 I5 j9 H$ K T
2 p6 q# F; O) V( V
android.permission.READ_SMS:允许应用程序读取短信内容 4 Z+ m! Y% D8 N/ Y$ t1 m h
4 n5 r% p/ j8 V9 z
% ]- k; y& n$ k0 h- @/ A- U# A& ] android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 + O n$ a! L; _/ Q ?& ?
. z& b6 F% K* O* y3 u( S, R0 Y2 j
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 5 I+ ]- W# ~9 q
. L, x e# j8 L/ |6 V
7 }' l' Q3 Y3 R4 ]! S3 U$ s android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 4 X+ W ~1 Q/ ^6 H( O8 x- M
/ _) W4 V! C/ |2 h' z" L: s6 x: v1 J$ R4 }: s% R6 Y
android.permission.VIBRATE:允许振动
/ c$ J9 s, v) Q# Q# z' s9 q; T2 a 4 P4 R! R% }5 u! @
5 Q7 c" v' n" o9 a
android.permission.READ_LOGS:允许程序读取系统底层日志
3 P- @) r! Z; b" m . e: r9 t: x2 f R4 w
7 m4 m/ A' h4 Q9 g
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 7 C; R6 E8 c5 }6 y
. u e. R/ p# f9 ?- o
5 e# m. r; V0 {5 T2 \& X L1 e " b5 |' t; R9 m; M, I& W" s
) x% z% m' e/ T1 N; a2 e5 ]& u8 e
( O3 z) p+ B3 K! Q3 i4 D 功能信息 9 c9 m. z+ d* j. s! m* F
# g8 c/ h# R* F1 V4 Y* h N3 Z% a0 x: c* U
; L- c, r0 M# l& ^$ y/ |
6 o0 j' A O) }& A* Q; B/ e3 Z: Y% E! M3 J
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 + C: y z. v1 k* S1 @% n! A4 ?
' ?' z. G' L1 |6 o
" O* B8 K, s( M, C7 k/ ]3 l Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 7 U9 T$ L& x) W0 k3 Z/ O- V
3 N O$ _3 }, c# N' C# Q
! o' P2 d. E/ L7 U! P 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
$ G0 E# G/ ]. E
! k" g5 `# M. u' {& `6 p9 v( O% |& z6 u
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
. n& _) c2 Z. c: u+ ^% b! Q ; p# T7 L" E/ h* y9 C: h1 }
4 p; R9 g( o% U" T5 g& \ d
; o4 v/ _0 j" l9 l- l6 V8 P $ s# J; o0 R, ?2 }
6 c" [6 w c- U3 m: o* l6 T) T
- s& u4 _/ I: c$ ?4 ~
; W! Q, V; k0 l! d' p' T/ n% w0 [" u9 j' P
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 0 z |# s) t, u) ?0 F3 Y
6 H7 u3 p% w6 z8 x
# Q4 t8 D' I- d+ s, s1 A& v
( D( ?( b& r1 ?* F7 C0 i+ S ( u& N& d: }- v3 r$ U5 l8 r1 w- { B
. E* A( a: O6 K7 v6 K 6 a5 b' P) c D2 J! B
) v% O6 ^+ G2 L* z( H6 u; F: ?
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
5 |0 [, \1 H* O6 H# m3 ?, q
0 [3 z7 j( s( b, } }- }/ z
8 K# \: F/ }" H $ v7 m4 o2 z3 U9 z% f7 n
; N# ^3 u3 G8 m/ H) ^ i
$ A1 r% [/ x% V) X" I7 O4 ~ 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
- |6 x5 F0 ~; `% k2 Z: ?! p
' l; J. h$ h' L8 f, j2 [" R: z2 p' ~) J) r. i- c- f4 F
. ]8 H c* _- X4 @" d ( [8 d. p% i: ^- `( P, P
' @2 f, W; r" t' j! Y! [* P; H 5 O3 s4 s7 [/ H7 D% x8 H$ e
, Q. }- l, z0 S1 G8 K; T
5 p) ]8 q/ G1 f: P+ f" D3 P 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
9 l' Z( ^% I) a1 y) S3 p 2 ^! V# y' S9 B: `% E0 ~. Z
, ]( Y* `4 {( A5 n' \3 O
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
+ J$ U* m# C' k8 I! L% R ) U4 O$ B/ Y: t9 q$ a
. B D$ |6 [/ p0 s0 @. \
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
( [5 S5 q9 b* K& q 4 K5 l4 N' T0 _, _& {* b# ~
; R; R' M( _: b' C U5 I 开源的luasocket代码可以参考学习下 * x* N* z! g7 s; ?3 t/ v
: A: [3 f$ m+ \3 Y3 X$ u* Z) M- L/ \6 u, L1 }! }
https://github.com/lunarmodules/luasocket * w m5 \3 O& p. P% W
/ H. m4 Q/ e- b2 y0 N; l
6 e6 q7 x7 g2 R: u
https://github.com/fengye/luasocket 4 b: u/ \1 f) Z8 \8 m: l& |
6 f& q( j' L, d: a# e. F. Q4 M5 I$ ^4 L) _4 ~
) Z" @. k3 ?6 B5 X. x; {
5 |& D8 B; d& W/ R: {
+ d; M/ m4 h" u6 ^3 K
% ?; c( H( E( ~- E' p2 Q$ t+ A/ q : Y1 d: R/ m3 @4 k: `( D7 F6 a/ [
/ m6 ~# r3 P5 |1 N2 x2 R; K) o/ o0 _
% l2 r$ A( W z6 T
6 P7 M4 Q1 v) {$ q7 ^
- I6 K* u, t* x
' v! @: s0 N3 T" N7 b( O - t* B6 H' D8 g* c F
( |5 f- G9 d- C! b$ T& e2 y( g 总结 5 T+ y# N& K: d2 C8 p- z: j
" J3 y: W; `" a9 o( I
+ R! U, }7 O# t3 F9 H1 m8 R/ ?9 A 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 * f; C. N7 E! W' `& {& n
& W% t& |; {$ |* a7 Z8 d# O9 l* u
% Y$ Y4 D5 z) y5 `1 f 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
0 e4 n" m- v$ Y" j# p3 K
9 b3 J+ g, X' c( e ~/ a# n2 Y2 f) ~
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 $ ?$ x$ f; u" k) O! p
, r t! s, n8 ^# P' ?
) C) u y% s) |: I1 V- U1 C
结束
2 f6 s! W: n0 z1 Y. L- {2 B( s8 P( H " H! c8 u% Y1 K. B1 C6 K
. k, s! j0 U2 L8 ? e
【推荐阅读】 % m! l5 C8 n7 p# K2 a2 j9 h
, c# V! D7 m! ^9 b, Z B0 P6 h8 a
+ Z$ b7 W0 X0 ?! p4 b/ p3 e
对吃鸡APP的分析
' K) P$ W# d( h
1 ^% D! V6 l; d5 i( B, [- u1 I1 E: W) U+ \3 n8 @) ]
你需要了解的APP安全
. k, r6 D6 H1 Z, _! I f* D6 f/ e" S 7 y/ O. }' V" U
$ d$ h% Q. D! \& y& _ 你需要了解的APP安全
* Y m |) x/ X1 n; B5 [, U / b6 r( s' Q E6 J* \
; Z) u6 y. u" }; O % S N* Z) k/ V
|