X" R" } l4 M/ f 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 - O) M; V7 n; f3 n
2 B6 @2 l2 X! _5 c' c2 a# a+ U
4 Z/ j% i7 c* o9 V6 @7 j
% u4 ~- E4 v2 q( ~6 x7 x" T* [
2 F# A( q6 U( Z, t
2 T h0 J( [- I5 g 9 G9 K( }: w6 {9 J" g
" r6 }. u. A+ Z; n1 s8 b
0 B3 ^: A! y/ I: `6 c. H# @ 下面就以开发者角度进行解析下这个APP的功能的实现原理。 : O+ E& {6 d1 c5 V, \% q
# L }6 U6 u" m# g6 S2 Y" r
8 e% \# i5 _3 | ) T5 e* c4 i4 ?& t2 X# R9 W
& L" y/ v2 `# P& v% b2 l1 e1 m0 K1 Z! Z' [! D8 c, h
基础信息 ( ^$ A9 S3 {. w; V( ?; L/ a
8 n$ ^# x" S0 o7 J( t" J4 D3 T: k, V% h4 q% r
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 ) S! i9 d4 Q, R5 [
% U9 M) y% c& ]
o6 ~& m7 @$ z$ d) Z) ] ! |1 l) k% g6 N% \
5 z/ A8 R6 N& g1 b F/ i0 R$ v1 n
' z3 Q6 S( d- z2 V
q$ P2 A, `* X3 w' K* o9 x0 _; g
+ I2 N" x L7 H. k 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 ( Q2 R- C, A8 [2 t& O( t) i
" ~( V/ n, B* r
( O. n1 s: ?& K1 C
: Q, b" p( u* O* x2 \* w" I # ?9 ?) R2 X( V# U
$ D3 C; |4 [4 e$ D6 Z7 \
- k4 J. |5 L7 F6 ] M2 \ ( ?) `1 V1 E( ^, f9 m1 u* S
" C( z) t& I7 h; e+ H) t5 M' b 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
7 @6 G) k7 U3 a# u " m( L8 _0 [8 O Y
k5 W6 z: X3 J- t% A" T1 ~; M! Q0 v . c5 O; S: L# _! w- g
- C0 [, Z5 F S3 [+ o2 P2 g" q$ ]; I- J
g) f8 y; O, w8 `5 p- x; J ! I) N8 h( v0 }9 J
+ j% r1 l3 T' H8 {- p7 X( r0 ` 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
+ {2 u4 k, I7 D0 I) J7 d7 _ : ^. ?; m0 k% m$ o0 s" t
/ Y, {, B5 @1 e
1 ~6 O) t; b5 D
- @6 h- W/ k7 Q% I n
+ g* k% {0 d) O# N! V
, T% X6 D2 \+ k: T' {1 K+ K: D ! Y5 C/ W8 j+ v2 X) E0 O0 G
5 p& d$ [8 ~4 \) D
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 9 b; E- q. l, x* D/ i
9 h1 x' z# e9 P
; Y- v( W" b% Z0 |1 o
6 W+ u+ Q8 Q/ m% r ^& G
7 z* y1 f+ Y% ], \ N; H8 J$ w) ?$ _) p1 F+ q$ y# [( | e6 C
8 D. ?9 c& v" z& P+ } ( h( ^. ^) D9 k V+ ~% {
5 n8 L1 E# g( S8 i$ N" w
, Y# y# O V5 a! K h. v) j; m
1 K- G q" d/ c. r/ P9 X5 T) g/ z0 m( |! `+ @
签名信息
) I5 M% M, c( i! P7 K, E; m8 P ! B ^* Z* m5 P. X& U2 F7 T+ y: I
( R/ E9 L/ M. }7 R, B7 z3 U' p( i1 [* ? 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 7 C# v, R7 J& @0 x" c V8 Z
" b; _- X; k4 @. c, C, V6 P
4 ?% A. [$ @; g8 c7 w S 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
8 e- L9 R9 @* w/ z; R# u
/ A; ]1 p4 I& n& l* {& q" y- b# z4 d# ^
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 5 b; f8 |& z- ?2 v- o1 k0 g
P; N8 b% m$ ^# i, \
. D$ [/ v0 C) [# ~
" v0 e+ l( t/ x) l; j% _
! J k7 v+ d3 M6 [- Z' [2 S2 m3 |* U) _! w1 I8 t# K
+ ~: h: L5 F& b) c5 A( E8 b
: O$ P g( c! |4 N% a2 k9 x. Y8 _- t- f* l' e5 l! ]/ r
android签名的数字证书的一般都是采用 X.509的国际标准。
6 [7 U! A0 g2 ^ 7 C, k; I5 A- L. q4 r
6 S6 o5 U& d9 K j3 h, @9 W 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
, `1 d+ M2 ~& w% Q" v* }$ U& o
& q3 G$ ]( a% d" l( M V7 h/ B
* c1 j3 u/ `' s' d, i/ f 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
# I/ M+ ?6 h3 t- ]; V' m& h
, s- m' V1 S/ U1 m- m/ y3 b; K& X: Y) R- ~
7 v% O& w( u3 i0 p. C; j
1 l X2 F8 Z9 i- I2 Q V2 O# ? r$ n3 B7 S1 [, j
' b1 B9 \4 r* o$ q. D4 L/ W( o
- X8 m5 n0 W/ \% e' Y) O! {% s4 V H, `# A
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 . v6 \6 D4 _- x1 j# w
& D1 s+ I2 R" s
' a# c' q- B6 _3 d ?
+ q- d( q( c1 l1 e " R; R' l _/ u8 \+ o
k- h" q( Q) P! M3 w) X) Q 、 5 |* [4 P' g) l+ n
. C/ O+ {" ^* s! @. t
9 y6 i( g2 |0 z9 h. {( h& f
7 W- D/ A! ^5 Z5 Q+ P! V % y% t# l/ p) v8 m" F
4 X4 i. y% p6 @6 s: \9 k 权限信息
1 z2 P# G0 u. l4 _( Q " M$ y0 g! U8 f' E
* t" R% M6 W/ I( `
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) / _$ D1 Q9 P5 o1 Z: R2 H
+ W; C5 D1 O, z5 g% {' i4 v
# ^' Z6 D& P4 m0 }4 C android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
0 O8 b9 F# g% ~9 d3 F
. n3 F4 J9 D2 v- B6 Q- F/ F! }5 P. \! X0 q
: V1 a4 H/ u) g4 b8 l 2 f4 M: B2 ^# V6 r( y
3 I3 l: D0 I7 F( R0 V! u
' A5 q* Y! |- j8 [$ k" Y 9 f. i& @# d( B3 N4 c+ N
: [" {' C w4 _- x 下面对这个APP的所有权限进行详解下: 2 }2 c1 \/ M- I0 _
0 k( o# V5 H! B' d8 H" n7 b5 b$ t- l( h" ]+ K
android.permission.INTERNET :访问网络连接可能产生GPRS流量 # E: D: @: r; z% P, |- g; y& \: x
5 U5 f W" y- ^
3 q! B2 F# |! }- ?7 Z- b4 q5 q android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
5 r5 [, `0 v% H1 b5 x % q1 I+ U0 ~3 G
) @4 p8 D5 q7 i7 G0 l' w android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 7 x: S4 W1 `+ M% C9 v3 M: V8 X
( q- X2 Y* P2 G' s0 \6 _5 {/ x$ o- ^8 d2 y9 f& t' n# `
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
, N6 b0 F/ M& U' y6 ~4 w
F( u: l9 m* i! H- D, h/ _) E' H: @4 ~! a' c
android.permission.WRITE_SMS:允许应用程序写短信内容
: `! l4 h+ J/ ^+ ^/ ~9 h 8 |* s q. ~$ \$ q, [" k
: F/ Z- R9 M' J/ i3 Y, W0 p' U8 } android.permission.READ_SMS:允许应用程序读取短信内容 / T& Y* \3 x' g5 x1 f; p0 y4 a
3 x0 T) }9 |) T7 J/ D$ u. ~) n' p, z5 g+ F2 O9 j- Y: `' u
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
# I2 j0 `- b5 S; y* ~1 `- Z 5 a+ X# N# P, L6 w( s
4 `5 ^7 d0 r* P android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
2 e F5 n( Z* G$ M, W 6 b6 K! p* z& P) |/ S' m v
- p% M4 {, _+ }5 y3 Y$ @ android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 9 K1 q- u. Q1 [2 A; r
/ h2 ^+ \" D- ^( ]7 j
. s& |& [, K+ i0 ?' E1 \. e5 a
android.permission.VIBRATE:允许振动
$ h8 h3 l% o4 K6 e! ^- a% L
: |" P0 S, W h" J" h/ ]/ ^5 ]) \# }: S- Y/ U5 C" L
android.permission.READ_LOGS:允许程序读取系统底层日志
/ A9 i: x0 p: B3 s* i: \
+ p8 R5 l! o _0 x
) j' k# v, R% A: ~1 F( { android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 - Y3 J/ X4 ?+ a' f: P$ ?
8 |7 j4 ?) V1 b
2 |. f6 K* }" l2 d( }0 h5 [
, O C9 K. U) o+ C5 S3 v% y! W
0 S2 n1 K0 W p9 K$ S5 k2 A/ G* p6 A- M3 y+ U
功能信息
, s5 ]- P( G0 j
, o" |& X2 |% t2 y* |$ x( X
; i6 C# v! w- n3 @. }( k9 s' ]
3 m' W- e! H. _2 |$ r1 V & H% u0 [. k" _( `
+ d1 [% d) U C2 e 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 - v% b# s" K$ i& V( A1 P0 u
+ N) U3 l# ^/ K& I% `: D
% ^' O9 `% t# x: s/ A4 y Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 % D# a) \7 k* ]9 y8 k' E- Z. u
; q1 }! G' n" I" H1 {7 }
% N: | L1 @# u' ` 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 8 v' S2 A( v* E0 E+ \
4 f$ ~% [. D0 b$ H
( P! ~- }/ |) q6 y6 t {' c9 Z! Y' K; G 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
+ R) \! w' B- I/ _- n% Z+ S
8 s2 Q6 _) H+ m [ W$ B o# C( V8 E4 U7 m( ^8 D# Z
4 y) K& `- ~6 o2 I7 C+ V' ~ " |' I) a: N; S0 o) `. i$ ]
6 p. t1 c3 y1 g5 e ' }) H5 e/ \, I6 M6 t# J
6 U0 S7 t1 F8 F
" P5 q" [8 C) p+ ~. q 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 : P& E3 P0 }. g5 _1 W- t, U8 D ]
4 W7 H2 B5 {5 b' T! X8 V4 c# n8 A7 V
* }' k$ w; Q' W6 H
' g3 s4 w) Y# R5 r$ u8 }4 S8 R& _- {5 n9 _3 k. Q
4 s# W3 u8 X$ g. Z) o# l: n; h
% X8 Q9 z( u' Y( v) t7 f/ a6 _' q3 L; r; X2 V
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
+ f3 O, O: L8 B e( i
: p; i& L1 d- s/ V7 X# a/ x
' h3 H) t9 W; Z# ~9 | 4 f9 e% ^6 V. f' g- c
( S$ X* U. h, f3 T& B! t ]; ^6 W" }
. f5 g$ B5 r6 L9 S1 R" y 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 - v$ ^) ] H4 @8 k2 x! s* }3 \
( D# _) W9 b1 F/ c, N2 L. Y
) y7 p4 {% f5 |
/ Y, J- i. A% o* m3 |4 C
( K8 F/ A# u5 W* k- M! P5 ?: D8 D" c: z8 v; V1 }. I) ?$ ?) R* R
Q; A1 @. B" u4 y
' d: R6 A5 k/ G2 x% O" b" C; q) } D( p, K) Y! e
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 $ S8 S1 N' c2 d: n( M, b
2 P2 Y8 _ b8 i/ ]$ v% u3 }' [- ^! F
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
9 ^+ l, k- O& a- `1 _- z ; l& R* ]! K2 K( y. v
+ {7 ~& Q0 Y1 T! |( A' B& w
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 & _3 _% a/ a! X
! t% r6 U$ f' L* I" O9 B. D
, S, U, N3 ?' N3 z) } 开源的luasocket代码可以参考学习下
5 q, k9 E' `( V7 Y* ~/ J: R! e9 H1 O
( X7 C7 h: r& a. h$ H7 c( l
) v0 g& @; F. _1 ]* ] https://github.com/lunarmodules/luasocket
5 J7 H" V3 l7 U- N4 B# \0 t) B* q$ w# H ( v' f/ o S/ l, ^& k0 o1 `
& t8 i8 Y- z7 Y8 ]- C# G' ?/ k# G https://github.com/fengye/luasocket
' {& _8 E% A) \6 e2 F . {; O" G1 G% _( S; D
( ^& t7 h+ [; t; O ^7 g
9 p: W8 K1 N2 d, Z; F. x; X& J
: T/ `/ q' Z: t
! O# X0 k# n0 j, g$ D) U$ C , K( n0 G Z2 a/ E7 u( D4 F9 L' J1 x
4 Y) y. K+ Y# d* W
+ g' Q+ h; w" k% e7 C
- ~! I, \- {6 \1 k 2 d' x1 v0 p: f( k0 [. m) v0 r
8 y* a) b( l6 {
" K3 H1 T" L5 v R. V$ | * a) y) ?& W$ P# ]
" r, ]" q3 m% z; G% m0 f+ c- X
总结
0 o6 P6 M. X# }4 G- p
5 q* y8 r! @# n# h( V4 A% v
& a- h+ S8 p$ }5 Y3 Q% X 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
/ O* W6 o8 `1 }8 @
S. j# K# @) D3 ^$ S1 u! j! b+ K' y8 _. q7 ^
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 4 r! z% S7 l& M! T+ e
S2 M" t9 g1 r7 c s D' l, _3 N
8 ~+ t/ S P% L/ ~& {- r 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
, _2 u6 u; P! P( R$ y
# @9 j2 [6 G* y
3 _5 o# \3 K* i9 d; `( W( X( S 结束
& ^9 Z- v2 `5 {- m& ] 0 I8 H8 N# D+ f
& h+ y2 F) }8 C- l+ [" [ 【推荐阅读】
1 z* A4 j9 _' f
8 v# A& |! |9 t C9 @0 Y& J/ g' S# [$ n- H7 o
对吃鸡APP的分析 , {# l2 J9 @( O" e0 O: }
9 Z7 s. U; `! B D, A; D" R# z5 T: {+ w" U1 f$ N% D6 Z
你需要了解的APP安全 & {/ t! f5 |; d9 X0 u$ a h
6 ^- Q" w# u. ~. C5 m
# [8 Q: E3 P& q1 `0 i
你需要了解的APP安全 3 H7 A* P% t8 D
6 A9 q0 h* |2 }) j
) }7 F" c* e% B2 e% @# b _
9 ~: v- Z- c% W. P6 ~8 v* D
|