4 t3 ^$ D- n1 U0 Y# W4 n. o) b" @ 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
2 K. `0 Z& P; k3 c# C2 `5 _9 t* \; u % z: M# n/ e- t1 a: I( @8 h- ~
3 S2 C- b4 z7 ~# j6 m. |& p
, N2 `# z+ y; d( b : y/ ~" k8 f4 y& C J
d3 z8 r5 Z1 H& c2 V ) Q5 h& K# y- x5 M& j
2 N" B; @0 ?! f f, a/ w5 x- w
* w/ ?; I+ ?% |; \, T, H5 g* @3 l 下面就以开发者角度进行解析下这个APP的功能的实现原理。
9 M [% ]7 b3 _% Y( Q 9 U" c c: U' g$ I
& D. ~+ J5 V0 q# s, d+ B8 t$ x$ w
' J B' E, p7 f+ p
( u8 j; O/ H+ K5 |. ?6 I' f) T0 T; P& O8 R2 \ n8 }- F# P
基础信息 . O( d# v& C! K; k1 {9 P) v* u
: x; n: e2 I$ o9 H2 W$ @0 q$ J, g9 n' A: N* Y5 v2 U: z% ^
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 & I% u2 |4 t: F( E* {& ~
3 m, N5 A& i8 [( \- D* c( n3 P
9 d3 \4 r( F& T4 ?
0 t, Z5 O8 U3 ?/ D 7 ^& ?0 a1 Q& j7 c0 W7 D
. U2 V4 ~7 P% c& Q2 ~4 V
8 K% X! G0 P, ?
* D$ L% C* j; B" t; O
9 B6 M; b' B5 k8 { 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 7 s) E# w) I+ T4 V; W, J( Q* N
% P" [$ ^4 s6 ]' w
5 F* _5 O- m2 E0 _" B& ]
: z3 X2 H3 p, Z9 m4 b. E2 ~2 { {% V# H' K2 ?
+ a2 c* P. D' t0 F' c) M M
) k, X; E9 @" H1 z
0 D% o8 a. x2 o7 j
* z! ?6 v6 { w4 I; h 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 / w" i6 W, N6 R5 G3 w. a
' N$ H2 O3 [' q
4 g9 j: o+ z- [5 Q* H% m1 y
- }+ w" P& |3 B : _: Z1 b& S# c# t5 z7 q8 q. o
4 ]2 z, P. A, Y+ U% M) J5 @6 l
5 u7 T0 n5 E1 f: K/ \ + o4 m. U. _, H* n& l8 `
/ L0 {# V3 ?# {, J
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
# k) F6 I# v% ^$ V& |9 r! t' o) F/ m
0 ?. H6 p% h9 ~$ y
/ V% m4 t, H% ]) {- F$ ]
. H5 _) y$ N$ y% j9 {6 }5 ]5 q ! F/ Y6 @7 a; J$ R
7 E% Y$ x5 S& _+ _' \9 _$ ?. R
9 z+ A3 t$ C) [4 N( x ) M- @. s% Z5 }& f$ {6 d, C
5 ?* d2 G2 j5 z- S# v% R 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 , i; U" o2 X$ Q2 i1 [+ j7 e0 R
& f2 x3 v7 o! P, n3 T9 f5 S% }
& T- |# A+ H& | L8 n
3 t( e, `) W+ C
' Z; g5 \. W& b- Z4 I2 D! g" ~1 [/ [) o) ?
. n; a6 \: v8 @2 A" [ ( Q9 F2 ]% Z5 a6 ^3 T
3 Z; q4 j9 z! y5 p( B1 @ W: d
0 ^9 a* H7 X& R- h" N9 M2 c v
) q( W* Z$ b: }" b3 p % x/ H2 ?: W, O. P4 X
: n2 e1 |$ F0 ] ~, F4 A# D8 r 签名信息
( f2 B7 W9 B! m. W, R" z 6 t0 ?4 b, u* M! \* Z2 a
j- n9 d* \2 W1 z5 p
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
% @+ H4 E# w' @( a- |+ N% P
G* j6 p0 G) k: d5 s9 U
* R! d" _0 w3 C% D8 ] 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 % U' o8 x! m) P/ [8 U
! J, d! L: \# s! _
4 s, W8 g+ a+ D8 h& T7 h; h' h) F 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 , R, p6 Q) t$ l; C% A4 n, |1 w( Y
. z: ?3 ]' M8 Z7 Q+ i4 ]. R) y
! v1 g* t8 H: j5 H - a4 O1 l. B# b8 d9 Y8 j
0 w% n* x7 l) H1 q! R6 P% Z
1 c/ U3 A1 R6 }. r. w- Q5 A : I2 U2 p' j5 J y& M% W* b6 J( l
3 X8 o; h6 A0 b
# W M1 {+ \$ V; O) B% a0 U android签名的数字证书的一般都是采用 X.509的国际标准。
5 @+ `: i* O4 G% @ . H2 O$ ?1 c3 Q S' L, F6 i
* N; N5 ?3 `/ f5 k. m
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 - D9 j# O3 s+ y) h
9 a+ F) _' M y) \, R
. m$ n3 T5 |& D$ v" I- I 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
D: E2 v1 W- T6 D 9 q( Y# O: X8 } C
& ^# `4 d4 R9 b) i& X; m % t) T; Z$ Q# o0 Z
; B5 v( B) K7 J T. F! n
5 F2 _ }4 W1 u5 g
' Y6 C& C) [$ }# f8 D2 M2 z7 M $ n# a1 Y- c5 R7 V8 u3 @. @9 f [; X
7 l: Y5 u y7 v, r
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 ' j( u7 R& Q! S! _' ^
! F& x- q8 r1 s+ B y6 N) r9 f J1 z3 T; F' h6 |2 z! G2 n
& K& {* P3 Q: |9 \3 b
. j' y6 K* P5 l* x# b; L! a
+ |' M0 x/ ], m) ~ I 、 ) P/ \( l6 e) N1 g+ d6 P1 ?' ]
4 P7 }, R H S' y
! e1 }! }7 C& s/ S5 d( M: b$ g ) C" q! m2 Q9 x
' b$ f( H1 s. a. G* z& z9 ~- P
# z: ^9 v" z$ q" K% }4 A! `0 z0 R
权限信息 / c4 O8 }+ ?; U! W) w( g! g
, M2 i7 w2 p+ Z7 J# B/ O& ]8 E a& u3 P4 o( u# q/ {! b1 E
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) / [4 |+ T8 r; ~8 ^
; C# G! v8 R4 y z: W% X7 J2 e
4 G* I# E2 |: W* N android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 5 y5 G3 e5 X! f0 z* d* g
4 ~8 i' m9 v( H1 P- d* H! `; f
8 R, P# f+ S4 m; U. M( J. T 3 A2 k# W+ C$ }/ E; @! j
- [0 s9 J! P6 r* {" b3 Q
+ _- ^! v( P$ B" E
# H/ w: u! ^$ Z o
, L& r0 y& @% a2 N4 h! G
* s: u( d8 H9 |: B7 ] 下面对这个APP的所有权限进行详解下: 9 ~6 N! u- g, R6 u/ `. n
( g2 T) Y1 C. c8 i% H/ S
! J, [; ]% F+ h* x% H3 k5 v6 q android.permission.INTERNET :访问网络连接可能产生GPRS流量
3 m' p( H* ?* d3 z& w' k, M: V9 G
) p6 b# ?% n/ L, v* E" V' d9 w$ u
. l- _+ {: z6 y9 j! v; X android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 . N$ I8 ~2 u: s& b4 I& f6 l
* J5 l1 r. z: p+ y0 k( ?, F
' u$ K% P/ O1 J% s+ g- C9 r
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 ! N+ H* C9 ]7 ?$ m
: T" T$ _8 N& X* [0 H! c4 y) E7 V
7 H4 ~: S3 X3 C( B" P
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 3 Q* s/ Q2 W+ s6 i! H
# n# J! n( ?: {0 }, L' g, q$ i; V* S# w9 p: q
android.permission.WRITE_SMS:允许应用程序写短信内容 % C7 @% H5 L$ L
2 H5 n* Z v N' ]3 X7 Q7 M# V8 W
0 d$ U8 r9 [9 n! l" J android.permission.READ_SMS:允许应用程序读取短信内容
+ j7 ?. E, M# G3 b* C 6 o. Y# v7 E) V9 `( T1 y% h& v" ~$ z
: j! Q: d e: S4 J) m android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 . d) T7 c. J$ k% {
6 D( u& t6 ^) z* X$ l7 f; {: E( g, v$ V w. X4 W/ B
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 : D8 q7 P& y/ P+ ^. h
) X6 s6 U8 \* [0 ~" Z; i' ~3 H* C5 t0 D
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 - w; G1 I. x# D' m) ~6 m
' o; u4 [: v, o4 B* v; F9 K: t
; l* D5 j; @2 D android.permission.VIBRATE:允许振动 8 W4 \% S, c E* a) z7 P& e) ^
/ U! ?9 {4 [5 N
7 N: B$ o. u3 F' h& q/ f: Y android.permission.READ_LOGS:允许程序读取系统底层日志 ; H/ `/ p' g1 ^' t- j
1 S4 h$ n" H1 ^: Z+ ?8 R1 z! Q/ ~
4 O1 ~% f$ u, [/ W android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 - ~! B9 z6 _- ]# ~
9 r, ], i( F9 w) Z; H3 A0 `
0 N* G9 b" C. g& Q
5 ~- n" S' o6 s3 a 4 ?" T! W6 n8 @$ x0 x; d+ ]
& s7 g |+ U4 w 功能信息 & X% L7 x& s% f( }3 ?3 E2 Y
% R/ f+ s! x2 [1 s& q, }- }6 _& B, w6 W1 G+ R
; `% x/ H8 p+ j) B$ r% T8 K
2 K1 Y* g; G0 |% t
5 L+ Y" z1 b4 `% }( ?9 L% n3 }
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
/ ^: f, q8 T3 H ~3 g9 T" @! G/ d
' l" g! g8 w- U* o
' p9 o. K% q' F1 B) U) k+ M- H& I Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 $ x! G, z, v4 o3 y
3 M6 Y( W# D( p) ~, j
5 t& [: b9 I9 y( h- w) [
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
) I) g( d- U$ ?6 U/ W
X& j$ |- v) ~, c6 _
3 _: F. [% i- `7 W7 i! m$ x; h 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
+ y u) l1 e9 m2 _" O
8 s( A6 `; |$ t
$ B3 B% F/ E: e1 R- F& a * {$ O. \+ C, ~; ~
/ x3 b' d7 b# l# ^6 ^
" [1 s7 [! a5 s. q* S* u' M& f 5 _* r9 W7 ?# A6 c n
+ z2 H( W# y- c# D+ j4 G" Z' a( Z
* Y: B% m6 R" H0 Z/ H% W 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
( N% v( q8 \1 _0 W. X5 ~) f5 D
8 k% }9 O6 S5 T. n! U/ ]0 j( Z4 \4 H# i4 m9 `8 t0 w
7 e1 Y+ w5 b( l% B P
" r2 D- @: B% j5 Q1 y9 W/ s
1 m% G2 ]6 G3 l }* O8 r' ` / ], O% R2 h2 Z8 s
) V: g6 O2 }; e" y! M' ^1 l3 ], `4 ^6 C2 }% H
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
) C+ \8 B m. i- r9 i * V# z) i$ ^# M
% d" Y9 ~9 g1 _
4 e5 i( |, b% [ F+ O5 { / p r' j. |+ E! I9 D
8 e. Z) A2 U; {/ f4 u 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
. ~ F# M% H% O5 M0 C# Q " u, m( I# N! r7 W0 ^% N3 _, m
& B* \6 e, p3 e6 R0 {/ e" o
& O7 y0 X) i# V
: p. |8 s9 ]7 I
7 H0 P! f5 w8 v; r+ |) W9 H
1 T6 x2 K4 D D ) r- _& g! y3 I( B8 G- ]: t1 F8 y5 T
4 v1 V4 u: R( T3 K3 e% x. ?: C4 m
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
" \8 ^$ ~& n$ b
- d5 w' k/ V/ W1 g. k# w/ T+ y6 t& r% ^$ k' Z( w( E4 _% b
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 . G. r b' E" b) Z! v6 a
Y" q A; s3 Z( Z4 I7 e0 g$ N5 b! t/ A; C$ Y x& O9 p! h2 I
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
6 ]7 Y" r+ q% w$ f3 l' y , j: U5 [/ a( Y/ N T3 k- [7 O
4 A1 L* A, S% q* W9 l3 g# |
开源的luasocket代码可以参考学习下
5 w7 _) y( \ S X7 Z* P3 V* V
5 n' P4 I9 g' K
! |- a4 R* ~+ s$ p: f7 B+ l7 T https://github.com/lunarmodules/luasocket
' v; A8 |- {! l' v4 h( Z
( [6 y9 i' n) l- b6 \' T/ R! k4 \" S. u1 _0 j% b# j6 p9 a3 ? _
https://github.com/fengye/luasocket
& B6 Z5 ~6 m: W- Y& N& ?% s
) Q v7 y+ W+ g+ ^
% F3 \1 l _ c* L8 \% g
" e$ B" x2 a% p4 d, F8 |
+ ]! q$ Y( p, @4 p. e7 m B, s2 ?1 _
+ C* O" `" x% V F7 y4 q3 R1 Z
' f4 B; l) o! @" [' V7 m4 Z
9 e i/ Q1 q8 W# O! T6 U
( n0 F6 L" w3 `% L* @4 f- d 2 \& Y/ _) @9 S5 C& Q/ K
7 q2 A& ~+ z- Q$ f! w
8 Y" t+ p. n P7 h( B
! Z" ~! e; D, H
0 R; \% C. k1 O2 e) \8 p; [5 u ?. e- d3 w2 X* S
总结
% b( x- V% B4 x+ M5 y
. r' I; C: b4 v4 ^; c; A% ~ J# x+ t/ B# `3 @/ f9 j
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
3 t; A4 \; X. m# n. N; _; G 4 W$ x/ A( u: b8 z( A# D* s
9 z, V y1 m) | 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 - h6 e; b+ M5 v" l" K
& X4 E* M: \0 ?7 |8 [0 F& S
}3 F* i+ n; }, M. c2 D$ ` 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 " i0 O- E" n% m7 t
. B3 K4 w: p+ L/ `& s) w
- z, C, _" c; w& ^- L
结束 6 ~* t' x3 w0 \- ^, \1 j$ w
5 k' [: }. E7 X" H/ W5 R |$ u& g4 Y0 f% t% \" Y" E+ q1 z
【推荐阅读】 / L" S. C) W' C8 m* Y
4 Z( D7 l H: R3 W, U- R7 Q: A
; h. Y R0 j3 W" L) i% n5 F 对吃鸡APP的分析
( K" n6 `. w# q) M
2 p1 D: p- m" X3 h$ F9 S* Y3 S8 }& s$ Y$ r1 d7 L. V) A
你需要了解的APP安全 % U8 f( Q" k% C) h7 S
- {# @ a* \* }6 o9 \
9 \* F& J; J c) a: A( q& B: G# l. U0 L 你需要了解的APP安全 : u! H1 a* D) N) P
- @' K* Z6 Y% k8 E- V
6 N9 v# p& }( u) ~& d% C
+ J7 C$ {4 L* G |