# I6 \. Z8 z% p6 T0 m# P 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
* P4 W4 x& f+ Z 6 u8 v/ r; F7 L; L5 P q
+ f) Z3 ?- ]9 n; i9 _$ X3 @! ^
! s3 f6 N& p- H3 _+ i ' n7 A' j' O: x2 G, @
5 F( ^2 j* M+ b3 N* E' q
: {! c, I, m' e* x: B. J6 t
4 z1 c$ w( j1 \& s- c6 g# p- A" M+ c- ?4 m
下面就以开发者角度进行解析下这个APP的功能的实现原理。 # i0 { u" z/ W0 T, T
& x, L% d8 k# Z% q1 C. D
! W6 k- S* c% \9 X. C
" ?/ J6 ]: U1 p8 h7 f% S2 M: G# e 0 H3 {2 F- `3 \ T
) R' y9 f" V% {( [' ~4 |4 ], ]$ A 基础信息
5 w4 i5 l; v' i+ Z6 s# L & L% \* e/ ?/ X
; L9 S/ R0 z8 Q
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
* h0 r" t: u4 ~3 K9 R ) ~0 Q. ?! r; n' J
5 u8 S3 d1 H' L. C! C2 ]
) E# e! P- \/ q+ Z
- G, t! g& q: V; u
, ^. S) Q5 N1 @: I8 W+ n* t
9 T7 S: e( i0 E& d3 D
" X# n: X8 k) Y! S
. K5 Z* f/ A9 y$ m) d3 g6 O 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
7 y7 _" J- k' r& q" w" a , N C- C4 `/ }( D% ~/ s) t
9 R6 {& U. R" \( h/ c
6 B2 y- J: E: a* Z% G 6 E* N+ }* k( O4 ?9 I$ R( P, s
% x6 ^0 V" K- q: O* W4 u 5 B4 T2 G e$ z5 E9 f* j
: W$ [; V" U8 C# d" a
+ w: B1 f6 [. R9 {, J4 C7 f: i 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 / C6 m" a1 C9 e. g
4 P5 [/ C3 q h: E, j* k, Q7 |& z3 F ^9 p- _
- T. I9 L- b! i
5 X9 w2 a7 A& p) @) d( k3 C1 ^ q( ?+ G& }. X
T9 l- o9 P6 ?6 T
4 z! |& `, [; s- c
8 d; N5 X4 ?2 z8 ~: @
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 0 f6 n3 U6 m, R# O1 L& D. F, }* d
1 k% K- A4 t3 Z1 h* X8 g! a2 K
" \' ~- N. W* W: Y
# z8 q- p$ T. _* m& [6 H. q
9 \! ^9 `& x! s e6 z, ]; _
- g% n1 O$ I" O0 B& d0 n % E6 K p2 U, i2 e5 X$ B+ @: E
) [8 b6 A' P6 l* ]- E! v7 `, \. a: c- h3 p' b; {5 d% b$ r
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 ! v9 e- g* F0 ]6 C
- H7 W( n# R" U- N7 }: a5 W
( a5 ^5 S( s6 J- j G! w( i& l0 A9 B
) w/ M/ L- I% m+ [
@0 x$ |' N ]% Y6 N3 A% Y4 a
; l7 c- m% Y7 z; \$ Z4 y5 R6 S
% ~3 P2 @9 Z6 j# r
7 `# m9 c# v( N5 `3 W6 Q
G" k/ }# u2 b: q z3 P/ W
" R4 o% N: k1 T
% G2 \, M6 T1 w& S( t9 i% j% f# f0 f- r
签名信息
* B! n" K \9 Y: x; Q9 u
: I) J8 V V' N- T: X; f, ]) z a: o L) q! v2 B0 @4 g
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 : D; C# f9 N, U" Y! b+ a
; N, S( m/ ^# z6 q
. L! o! d2 Q1 l* V' |; K5 ~( T 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 6 m7 L! h$ j( ^. _5 K1 y# X. R
6 G& i, @ p3 P3 O. g, B0 Q9 Y5 x0 c2 A; k8 k2 t5 W/ v$ N5 g
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 # L6 g& L' P- S, `
- W) H/ n6 ?) G
+ E0 r; W8 A' Z8 j' P 4 J- {0 E4 J$ O; V
4 ]* [6 V0 B, @+ O7 o
8 H% x( Z; ]) Y; w2 u 2 D3 r( A9 ]/ z' t$ ]- y V# _
& l# h6 Y5 d1 C4 H
% R$ Z& C- F" Y android签名的数字证书的一般都是采用 X.509的国际标准。
7 E5 @( h# n/ e. ^5 e % f$ |5 G) t& V! q* U; p2 w4 h
0 I6 ~3 u- m5 M$ \' B/ D8 F" \
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 3 k( N* _1 Z2 V
3 y) w, R- q6 o) A! N
0 i) E- ? ]3 [# I 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
% f) j( p/ g% w, o7 h
( A4 {, a4 D5 ?% n; h2 Z+ ]% y/ A
* a& O6 A( V, }, \6 _( @
! V7 @8 A* r/ j& S7 }) e5 u
) [+ g0 y3 r8 w- k8 F* _% W. G4 i' F. k* G8 s- @& E
; l1 \: X0 q9 u: {* l. n
5 `' w' I4 U7 U) R x# {4 }2 X! F7 s( O1 t
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 . b( i; X; o; o+ w' ~% p& `- u
( p4 {" Z1 L9 o( B5 K. w& e
, g% k/ e- Q: a0 M7 v7 R3 g( f * V* }; y- p; R" W
5 K! w4 m. k% p" z9 e
$ o! h4 `( t5 M& r3 Z; ^ s4 O 、
E9 A4 s6 k/ U% g0 n 9 ^7 H9 u! A) A0 p& b
# Z, Q# \& r. v) l# {$ H9 q
/ |3 L6 a/ e- d: }8 z % C/ c# z; B/ Q0 G
F- ^5 P w' V( ~ 权限信息
( D1 ]- ]5 [& _' @4 Y( V' w 1 n" a; R: \- I6 M* r; N' Y: q% Z
5 q; b+ P1 }% B! c" }- Q0 n
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
/ R R9 G! @! u& ]% Y
1 Q! Y& u9 X' D
$ {: c( w, l# x( X android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 $ \% a- p1 a! L8 G9 `4 ?& c3 V V
- U+ O2 F5 @( O( L
, U# v9 {+ f- S ! E; i3 @+ T0 T
" G: C+ K- X9 c! n) K# R H0 n3 y2 r) ~/ q+ y! V7 J
4 G1 X; L A+ U$ C( x
. Q7 ^9 M+ v. o' ?. e8 N" \
# G& [+ G `5 ?
下面对这个APP的所有权限进行详解下: & d$ U8 r- x+ a- g' ]/ B
! ?5 [4 y) f% k8 }
7 n9 @, a' n5 o android.permission.INTERNET :访问网络连接可能产生GPRS流量
! V: E; M9 ^( v: ~7 H9 b) \6 o + }0 f' k" z) N& v
2 R. s# M/ h' H) C. y
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 " @: V3 H0 [9 R, W) b
/ {* k3 y2 Y% Z; M- E" @
, @0 \5 s" L) x6 T0 ?
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 2 f, l8 W2 }9 T! p5 o
1 I4 h* L5 s1 |: S# ^# d/ ]$ }. v- j3 @5 U- r c
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
$ d& Y1 ?5 A' n3 m- B* @2 k' t * G, K; t* t, x9 D' Y
/ o# d' {+ g9 {) e O# z z4 c android.permission.WRITE_SMS:允许应用程序写短信内容 * G- t, `; P( p. Y& q6 i
3 I, J" I8 ?1 x" y2 z* j0 C# R/ |2 t7 x$ I# t0 W F7 Z: B
android.permission.READ_SMS:允许应用程序读取短信内容 4 ^0 C9 ?6 L: f
# t* G1 K0 S) }6 Z% B( V
# ^) X3 T& ^+ Y5 X3 _- w6 k; ]6 v android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 ( M. h2 l3 K! k0 Y% b7 L
4 N3 d1 l3 r8 ?2 K. V n! K: ~9 f$ |- S& |. \3 h- N2 k
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
: M' K; Y0 G3 g" d c7 Z* g( a; [
# ^# E1 y2 F+ S v3 B+ l/ I7 P
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 $ \8 a5 j5 q0 ]
! r% g- [6 v, N4 N& B* D$ u1 A2 V M# b# o7 h- v' \ ^
android.permission.VIBRATE:允许振动 6 Y* ]% w" a8 o
4 e3 W1 u- K, k) ^" N% X8 n0 G7 w. [( |, A' h% f
android.permission.READ_LOGS:允许程序读取系统底层日志
5 o( l: F0 k8 g* c
% H$ n' `9 |7 g B! b9 i5 C3 H3 H- e; `) y4 s; N) `( B, y
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 ; A, _" w# [) m- z, h2 x5 S; [3 z9 O
$ z. ~( u7 }* [; V- Q
! B, \& y- t8 J& v
" f% D$ F g' Y
' [0 X$ Z2 b; H
" A$ C' ?" s5 V7 b! X# O% a; O; w 功能信息 5 B0 g; x; Q- x. U
2 K/ X) `1 m4 t$ a
% T ~& J4 s' R9 x
" S3 n. j7 J# g6 ?# C3 u
, Q" Y: v0 a" ~" n1 P1 n% A6 x0 v
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
" k) H: v/ ^: I0 k% i- }
/ V8 N! |1 r" [. P
$ [/ C- |5 q5 c; f8 w Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 ' `$ p+ k2 N' `! i1 o8 m8 p+ u
2 I$ b ~7 ^. q% J
T8 I6 ~% f2 }& V7 Z
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
. w6 _4 b6 o T3 {' O9 a9 K; G $ u# f h' X& J* w
# q) |' ]6 j7 a0 f: q 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 5 ~. S# x" j+ r) f0 P# m4 ?
- h" s0 e; H1 j
! c/ t- O4 r; p5 [1 C( y3 k1 h1 {
; O* ?- M8 w5 u! M' C6 a 9 ?! Z x( g1 e/ M6 J Z; h
+ B0 {# N; p! G' [+ q0 C ( K! e5 C8 G! v" [0 {
( I6 e4 ^, O, J. \! E
1 x! q4 @* Z9 l- o u% z5 }3 J 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 7 {) `0 r& T% U$ C' ?
9 w3 k2 O' x5 _+ [6 h" s) V8 A$ h- x' o# T* v
8 f/ Q: L- E# Y! f( L9 Y- ~6 ?# c& M ; V( u$ L3 k; c$ N1 {, o; O
R& @; l; x1 r) M; `% r 2 Z8 [3 b* N& `: c0 T' A
9 P. c$ I7 v( V! d" P7 R4 N- D8 @) H) m5 R C
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 0 N ^1 f/ M4 a/ `1 k. a' R5 z
y" h) G7 x; ?. c) ~9 F# t. |6 M( H5 s( `0 G: a/ j
! n M2 d8 m7 S
( `0 N: Z/ d' f% o. u7 U- O% n; A# q6 O5 R
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
3 l! X I% I# n! i8 \) C
9 o" w* k3 |' ]6 w& X9 Y- @* A: l) @
3 t' k8 {& ?7 J" d Q \4 P6 t
( {1 k0 R: P/ P- {- z
* v0 @$ j! V) k+ O( Q* p: ^& ~6 n& Y
& E+ n# l5 s% t/ B * W8 V& H$ r- b1 R
9 \5 N5 U3 H% W' t B/ ~0 R
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
0 L' v6 s% M7 ]8 J8 l3 R, ~ $ h- Y" f9 S/ V, A
7 F9 H) [0 a3 b* ^ LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
* u' y+ H$ h) o' t! A9 } o# N* h) {' |$ Q9 h
8 {9 n6 g9 h0 s/ W# |5 k5 x( { 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
$ ]: U8 ^; P& Y9 E
1 `9 B7 @# R( b& U& V! Q! O- r) H* v, L
开源的luasocket代码可以参考学习下 $ @3 _' X8 Q" u/ f
4 j @. E+ x q. N1 z; w
8 L; M8 |, U! o https://github.com/lunarmodules/luasocket _7 `0 k& @7 a6 u% C; a9 g
# f" [5 m' x0 Q; r
4 f. B% t: Y/ x; \ https://github.com/fengye/luasocket 3 i9 W) m5 k) D3 |4 J) J6 R
1 U/ b2 g8 ~) ~* T
2 u9 q8 o8 `0 \- t! K
9 E8 Y& z. n, H
A& h8 f1 {: h1 Y$ }6 T) ~
/ r5 O& b; |- h {4 R1 a+ N) _ : h* e5 d7 v3 r/ U4 D8 k
! e2 `" `1 h$ A2 j R4 {! t( G0 S% T$ N8 a/ Q: d4 M
# @; A( i- Z V8 b9 t. Z " ~; w% h- Y- ^3 Y( [
3 X0 L& d, k0 }
' D0 {3 L3 L Z* Y7 y- R. I7 g1 @ ' r# p) y: q8 ?, R; \ t9 {
{0 P U& _( ` 总结
. I/ t% m6 c1 s. R" Z3 Z4 h+ n
" B) W! @: _7 U% n; `
! J! q5 f* u; n/ ? 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 % z9 ]- N7 {$ r
, r" \9 h2 p, k$ P
8 W" x; O) U9 B/ Q 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
5 ^% M, {* N' I 8 t0 V2 m9 ?5 }8 v( F4 Z
9 X8 C( J$ N3 C R, z& @( l2 E 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ! f+ i/ B% b- A/ ^, S9 a3 O
2 g! J. H. L J7 n9 C( q
( `7 ~, o+ A/ U9 O+ \8 W; P# j 结束
% i* q8 U. {( h
! t5 X- i$ Y# {3 {% L8 r" i! ?' K
! {! Q3 O4 b- o% b$ ?) Z) H! ^ 【推荐阅读】
: S& w% l! @! ?0 P' \8 G 1 e% b9 J# i) h; X. u
. O5 d# H7 W% V* ^ 对吃鸡APP的分析
- v$ ]2 `3 `6 G' s' w8 L f
/ H `7 {4 x. ^& _) Y1 Z$ x% B# ~1 h$ W" V9 S
你需要了解的APP安全
! t& P% a! i2 R% V4 J- s; t + L L$ ~9 V" e( |3 l3 p
4 @1 m6 c# G B! `
你需要了解的APP安全 , ?2 D) k; @4 V0 _
, o4 E) k* d# A3 y5 s
+ l# q* o4 M0 q; U8 t7 E
8 y3 s& r5 p3 c4 x# n5 M |