. ^9 ]% n. Q; g; [' A, M# j, U
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 & L/ \7 v% u% B h M( H. s
, C9 Q6 \! |- T, |2 N: K% O/ ?' c0 @
; a. m. g$ u: ~0 y6 J T 8 C% Q+ C1 Q4 v0 g
8 k4 ~ R3 s4 t. z5 T
" e( n+ E$ N2 r4 A# a9 e
4 h* s, u; C% P7 @
7 L# h2 U, B3 q G' y, ? 下面就以开发者角度进行解析下这个APP的功能的实现原理。 / r6 E, Z. ]! N
0 w; [0 h+ u4 Y& C
2 M! s4 Q+ n0 h
: j5 F; u; I/ I$ }8 I8 e' R" _
8 a4 c) x/ l# {, |, ?4 ?
5 }. a* b8 G# [0 Z1 u 基础信息 2 a# u7 x& ^. u9 @$ y! U
" z# i8 Q. ?3 U# m6 }& R$ K8 G" I0 Z- E
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 + t) L7 s+ Z5 e; ?# T! w
. K, ?. d8 C! l" n& L1 y+ V& g; r; ?4 \3 {$ d! u+ e9 k0 j
1 L3 ~% k% a, d+ E @ w
! T$ `1 h3 \ ]; l0 Q+ p0 R* {, w% X# P- a5 {# y! E! t
/ d7 l1 K9 g1 Z' |
# G) T, u6 L3 A+ h$ R5 z
+ w# q1 h @1 \ T 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
1 @& y H2 G* H0 t$ q
. ~; D P f8 W2 x
2 c( ?8 s `% I/ b' a1 R
3 r) R5 g! y" o1 q3 p, [; w" V
* Q' H5 [! y7 ?! o4 ]+ a
( a' d1 Q U( j: X* u " y9 e/ h" S( K# x( g
5 q+ P t" h% m3 [
' ]' b& R9 \0 x3 l5 I2 X# T
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 ( L+ ?/ m+ W ^3 N1 H( _+ c
' _4 l1 |- e% }0 q7 j9 }" j5 E& d! j
, G/ D% {+ i4 R6 _ x# `8 s
/ B% |& t7 S8 T, w# n, U ) C* I/ i; w# b" T/ K
4 t+ j1 ~, w) D. m3 c- `* }% o
" H6 f% `- j+ q9 z7 M* E0 t U1 N0 \2 o5 L0 U# f
1 X6 g. ^8 t+ P, m( k3 _ 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
5 r0 x0 Q/ b# o % d; M `' m7 v2 z9 ?- ]3 g0 D1 t
/ Y% m' k5 z; X3 ^
# w+ U1 G4 u2 f7 `. `* t. [
0 q6 m. Q9 a1 a
+ ^- |1 Z3 H8 o7 r3 V5 v a8 D
8 U3 w* [. i4 R& I$ U3 }
* `7 ?2 U i/ E! a* j2 j j
0 G5 [' F2 j1 F" ]: [7 `5 Y! q* |3 h+ ~ 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 6 b: }7 _+ O9 `6 p
& k) d7 P$ R& M! ?) O
/ t9 L1 A4 a0 q, G" T$ s# S2 f # Q% u i; ~: I; z# q
: E- e: a5 o* J* A8 N. {' r0 z5 h K) r
; P: m( o# ]0 \# b
* N& ]$ L* H7 f4 U0 h. ]! Y4 v b# K5 |. `: L+ r
/ m C: j8 k1 I5 g7 G
' q( B# K/ ~( ^& ?4 d% l) q2 D4 i1 X8 v/ \9 i. j1 i
签名信息
. z* j0 ~. B4 ?5 Q
( T u3 K, S+ [" T. @! [; Z
4 f0 i+ G8 p2 B+ C3 A9 B 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
8 z; w' m- l8 M( ~! l
( J- y& {* Z5 D5 [0 j( ^# V
! W- h) ]7 ]* B" B. v 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
+ J o3 h" |- d" ?: w6 l " ^% O% ]) j' |' A& i
/ ^- V% k) D( U5 i( L4 `; l( } 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 + L# }" }. s" T$ E% H' s
+ O) V, N; `6 b) q [
. C) @+ \% v J) M0 I- _
: I' a( w" c. }# d& \0 T u
! [. @/ M( ^) R# x% w+ n& J" [ S! j5 s; ^) Y1 V6 H( k" T
2 P( X- L! h+ \: \1 c
4 }4 Q; U: F7 K5 X
% ~. \" z& q# N( k; v8 a android签名的数字证书的一般都是采用 X.509的国际标准。
. H( {0 f# X) y
. t: a X; ~# v, u+ a( H" h. k9 a7 l4 g5 e, }
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 + [3 t4 v8 g+ s, i' C+ k. Q! Y
: b! _' z3 ^. _7 P
( U9 E, n& w& M/ \
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 ) c* t1 V# }- X5 p& ^
1 h- G V1 q, T8 R+ F; E7 @# z% |! T3 J4 ~7 }( a6 o7 h# F" {
; `. i) k3 L% e, I: G
, b& n% e, g) X- c3 f& q' `
0 Z" v1 t% J* p
9 W* y0 K( T* S# }& m; k/ L G
8 |" R9 ]3 K7 z) Z5 B
' h$ [: { \1 |; {# a5 h; m6 n9 S 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
1 ]* a L0 \$ M7 |# g9 P8 L / Z: T: M7 C8 \8 p; P. H5 _
6 {% \; t& I' P7 ?1 w$ a
4 b2 o9 w* {6 J9 r; f( T& o4 B) T# n
% ^ J% s$ p* F- [6 R# B) a* U* p/ Q0 ?! i
、 0 o( U# t9 |0 k" u
8 T7 }% V, @. |6 B& m) z: N, e% g) n2 `, N3 A
; \5 Z8 O; n$ U* o
+ `/ p: c& I% H P2 w) O
. t( G9 O v* z9 c! s/ h) j
权限信息
: q, A. v1 {7 k $ ^6 g& ]1 O8 k+ N9 u
. ~6 t. H7 u5 Y% [
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
! {8 s% X q% p, c" X1 k) J9 x0 U . t# S8 V5 f% x7 {
% Q- [6 Z+ V, t; J
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 & p+ T D* p' u: X* f: ~
c; `/ B, e. {. {0 I' R0 o1 j4 h s% Q/ ?( w' A
5 H1 j/ s/ u9 w 2 y3 a" L' ]2 _# v
L9 ]" b& V/ ` i
; w$ ~- p& d: ]4 z
' L7 m8 l6 y; E' t/ O; ~+ U0 r- ?4 g+ c2 v( v0 }5 J
下面对这个APP的所有权限进行详解下: 5 @9 n) @# O; i$ W: V$ C; c3 L4 _
$ W7 P/ @. r4 S* @3 X ]9 y8 }( I8 M$ @# ?) d
android.permission.INTERNET :访问网络连接可能产生GPRS流量
/ ]' l7 M! T( Z$ j) n5 q' T$ u3 r; u 5 [5 l5 G* X' ]5 z6 L: y* {
& T3 W+ b8 K3 _2 _
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
* s }- s; T% j4 [! Y. c- Q, b
8 X h/ P5 J. O5 x* l" C, \
' H. V( s, D; L. M3 k# Y- E android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 * K- C3 [6 ^6 d M* ^& Q) ]* C
& u- `' o7 M6 u1 Z0 G" @) F
7 e* V! [3 o6 i$ w3 N: U4 E. i0 w
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
6 C4 h+ j& j+ ^7 l T. {% o5 T & G5 @4 t9 K; a' I
4 [+ e4 h: [8 R6 Q android.permission.WRITE_SMS:允许应用程序写短信内容
! p1 x. P6 B3 Y! b 7 D5 J9 \& M$ B6 `
) V+ L3 l' Y, V0 |: L8 n! v" F
android.permission.READ_SMS:允许应用程序读取短信内容 / n. J3 |' \1 i* B+ X& B3 Z! z
. Z# J5 [' E& s/ w( t0 H* m& Y' y, F
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
9 \% q8 g4 o" ~6 U
1 [3 s% n" M* Q( K; {" P0 L; [4 c+ k
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 . X. Q9 V+ f$ U) L4 ?% Z
9 V% N3 _ n$ O0 X
+ @6 r: X! M, W( x2 { android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 7 H# E* B( T, m( B* v( f6 V3 A a
7 [* C' e4 u( _% N \/ o! H& D& {& z
& r1 k& Q5 w0 q: N6 e& k3 V g6 k1 x
android.permission.VIBRATE:允许振动
1 w. u$ F* u8 m9 u* o9 {% G. _# j) R
, \$ p- m( C9 m% q. Z& ^
% d" O, Q5 R( `) x4 A android.permission.READ_LOGS:允许程序读取系统底层日志
+ h! _. ~; W2 K4 k
% q- c7 j6 h6 p9 A$ X# S
5 z+ N+ P! H0 o# p2 w; S$ f& m android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 8 a% E0 g) {" V5 t6 A- |
" H; t0 C; a; M. |. }- B, c ?( Z
1 Z: x" z4 p) v1 \& R % Q. R4 x- x/ c1 Z
0 u3 t6 c- ~5 {$ O# e
5 r( r$ {6 J r" W: O
功能信息 ; n1 Y0 j8 ~/ e: i
% h# z, e- y+ B" B% b7 s$ x
% Q; ^/ A* l$ n% j4 U: u3 G* D
4 N1 z; B5 {# T3 L- | 5 R* M# D4 k5 M# |4 M& r$ [
) E' [! s8 m* B, D/ }( w
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
0 S! x# }% v' G7 k! P( s w : B4 G( H" Y6 |; S: G6 I
6 i$ x: W& A# r* e$ U Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
/ o5 s4 z$ o5 U
7 F* ^" p: V! l3 R5 s9 X) t5 ^* h' L6 |+ @+ S
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
: c2 _; Z- ~; G) E" j: x
: I/ U: Q: u7 t0 e" u% X8 w
" V3 H( n y: ?* ]/ J8 e 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 5 O+ ? i; h$ h6 X$ X5 ] j( L$ |
" k/ d" \ C' m% Z( q/ L' B; F1 c5 {5 S: m$ s
$ f. {1 [6 y' E . U$ s5 ^, s" M& s/ G- z' y* I
+ _1 P. l D2 e9 ?
2 ]6 u t- c5 ^1 |. m: C
& Q4 F2 b7 ~9 Z# G
* _9 g* n- I7 r5 V! F$ x 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 M* f% ]4 [' p
/ m9 ]: f( M* N n/ U+ Z- \
: P" d; z# x9 i& k( l
0 g! a, C6 `9 P. B1 Q4 k
. t' D8 k+ n9 B) Q- w
2 R# U: S' c% |, A- o* Y $ U; s3 C g( z2 o% N! `
1 P( d l, ]% F& T
* f/ Y( T, l+ F4 G9 G% Q$ {
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
2 P) ]) R2 r) v# f
0 Z( U) P/ m' v% i p7 c" ]5 Y! O9 I
- x1 z9 a/ r) P5 [" C 9 a: y7 k" M) w
; }3 _& |! H% W, ?3 c: r* M3 X
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 8 |8 O4 x \: l! U/ N/ I
. o- S" V4 n# |; t
! v; q0 E0 \7 i6 ~* F @$ c . w# q: g m' b6 i5 { r
8 q4 t2 ^: B- V. A& t# v
2 W/ t. `7 d1 n6 s9 g
6 a5 Y/ I5 w6 \0 i
2 g8 {+ j$ ?% P4 x- n! Q
( u6 i) G$ d, e$ a1 s4 | v 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 ( K5 M1 Z, f, _9 Z) i
T% L: a+ m2 @# P, H2 r
) U6 L# r3 l6 S7 r4 E- V9 C LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 / w" s: X% L: C: V
7 g5 s* [4 X& D2 |9 o4 U* n4 Y D" y; \+ \
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
. s! E2 t: L5 e+ \ ) z% ^" D/ Y; i; x1 p
, `. ~) J; i! y
开源的luasocket代码可以参考学习下 3 c' v4 H9 t$ _& r/ ~ s2 e
+ X2 i3 _& Z) f( n! @
8 U" F/ j! o B" A8 g: A https://github.com/lunarmodules/luasocket 1 p2 m, g; Y2 N0 e
6 g8 V8 ?' d) H
- b# ?& X$ V- y* V: ?* \
https://github.com/fengye/luasocket ) z6 }! ]4 B' Z3 I+ {( Y
- r1 [7 |0 y4 `0 H
1 x' c/ U) j1 r 0 j. ^- R' W+ i' E
$ Q' x& }8 o) c& y# u& G- }* Q& m( e& z4 [" \
" n% m2 f& }( h
G1 n6 g6 U6 G1 q, j( a) f% O0 A- w2 }6 [* c
w# J+ s s1 o; Q! w T) B
; E m, v ^) W% X( P4 ?
) K% n* Z, e( k% o " k; b& o8 _8 q) B5 o
9 K! ?4 o$ s0 y$ k& b, J6 B/ A/ D
" t! _, i7 L2 @" C# S 总结
( U; z. } R3 U
C* }( Z. k: H1 E2 s7 a- h q Y
% S+ N: S, J- Q4 x 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 8 @+ ]5 P6 H8 Q# C: f# f' P3 M
: b i% Z" k1 `4 w! t- F
r" F" q8 B% {
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 0 P# b+ v4 g& Z( R" c6 m) n
% j% K/ U: G' W' x( Y, i
" f3 O4 M* o c% D$ w E- I K6 Y6 L 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 2 G. y# t- a" d
3 O, Q+ X+ y5 l, i% p$ F7 f
1 @' b9 e% O' ~4 V# a) w& S 结束 & R# q% o& O' q6 X8 l+ Y
" W' b/ Z2 P/ q$ g$ G2 z, ?& ~3 Y) R5 d- h! H2 U6 R
【推荐阅读】
, C; {, `/ c' ~3 U: M: M6 u! J * K& P1 c$ U# h$ ^( O/ p$ o0 t
; a/ v( J$ V0 F+ y* ^# S i! s
对吃鸡APP的分析 6 z! {- v1 E2 ]
. ]0 k5 v9 P6 j# a d g
, |0 b. y. I- p6 Z6 \) N
你需要了解的APP安全
( t+ p9 v% M, J
/ z) J: A* n9 R9 h0 K
0 _( \( O$ J1 j4 M! ] 你需要了解的APP安全
! ~. a' \( V( n4 [ + L# o# ?5 o6 N
0 U. u" t. e# f0 C8 g; B
" f3 X7 i. }. {& G; Q* N |