找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 4320|回复: 0
打印 上一主题 下一主题

转载对小绵羊的轰炸APP逆向分析

[复制链接]
跳转到指定楼层
楼主
发表于 2022-7-8 21:25:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

3 w' s7 d7 ~; n( D0 r1 W1 ^" U# I' d" F 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 9 {. S% l+ ?! j7 d& L6 S; A: Q# e

$ A& K# U+ |, H2 u1 X, H

5 S! y! f/ p' Z vshapes= 8 }' k% s' G- _4 r

3 Y8 o0 I1 ^, n7 W

! ~( `+ x* c* U2 m) y. [   ( D' a' A6 F: H) A5 H

' e" ^8 ?) u, W T. H( k

6 m& L; D2 R; A" |5 [ 下面就以开发者角度进行解析下这个APP的功能的实现原理。 * @1 ^% ^" N# o( W

, p& J6 H- J: N9 W' q, D5 B

6 m! \, P7 a# X% t   ; H% @: a" }7 C# L4 O0 T* B

4 ?; @9 x( m5 {0 U+ n$ u: s

3 w2 e* G& ^% a% V0 g6 [0 e 基础信息 3 K I- k; K% k+ d6 g, T. I

! O1 e( l3 r+ f% d; e# M( h

+ @4 u3 K( Y' U6 b t& f& | 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 ! j6 J- r: k; D* ~& G

6 J; {3 R2 q9 k9 v

; X% f0 E/ Z! j: u vshapes= . o' a9 ?. r: \5 i6 \

4 [5 @: E* W' u/ @4 R+ D

8 k1 m5 k! [9 |7 I4 X R) F   0 H# j8 k1 H: z* ^

0 |6 U3 U6 T. q3 I" J. }/ h0 y

1 o3 _6 {6 s" P2 D 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 w! h. L; A- G* w' w

/ {& x: h: A3 \# [

% u1 G6 R) ~% a/ ?4 _ vshapes= % ~5 ~1 n6 T! ^# E' E

' i+ l1 O2 V6 z/ J

3 z/ q- R8 c3 m   7 T6 n6 \, ^; G3 I7 y! q: y

$ U, l2 m( t* R* J6 r# F/ k% n+ J

/ A! x+ ^/ M% G 通过jadx工具查看,该APPJava层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 7 a0 @4 ]8 R$ n: x% t6 ^% x- N

: M0 u: i \ [) D& L- R

" n: W; M% g% m2 G% F2 M6 \1 f vshapes= ! G2 P( ?/ b+ E6 [ O

+ _0 W1 L% r7 e3 K; p3 {

9 ~: c! K8 [. j E( s$ U6 O   0 ~, T! s) y3 l9 r" {+ Q, `0 `

9 X' P. q |6 p# w7 Y) @

o s, ~9 M2 ]* [0 i; s 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1EditText3Button控件组成的,也就是下面的截图信息。 % L) W4 a7 s/ b8 Z

9 H. W6 ^! S5 m9 g% W3 k

' Z3 a m; ^$ z! J/ q$ X9 e5 H! Q vshapes= - v6 s) P. s5 V* X* P5 n/ `

# _0 L9 x3 t" ^' d$ _

, g$ D2 D9 |% p3 f   5 i5 C1 `7 m* t6 _2 M) j$ {

- K, {- a1 G- p# S, A' j, e; I' O

* H* F G8 u. S+ ] 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 + V, m9 g. {; G f1 X7 F

. |6 J; R. W$ V* u) s

2 U6 C9 `/ ?; Z# b( t) |) c) r; P vshapes= % e. B7 ]" s& v

2 D, g7 @9 ]$ \' }: v" m+ |

9 s1 M7 Q% Z, g" ^( G9 E/ f   9 O* r( T C9 M$ \) ~: D7 a; @

7 a6 T3 L6 D6 E4 T

+ [# W$ g- H- r. ?1 C6 f   - U' l' b4 q. A& F

7 n9 U7 I3 c7 |+ ?

% D+ S& k9 A6 a, T- G- v. Z2 C 签名信息 + O1 H! f X/ l. P' j( h! U% ^

, f, Z% x# W0 w! Q- X

* m& X4 }; {1 K 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名 5 P. G# c7 `' ^' v

" ]0 @; i3 q0 b

$ e; Q! ^" c6 [) N0 |" K0 { 目前APP中大部分都是通过V1V2签名相结合的。并且这个在签名过程中要保证按照V1V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 ( ~- y3 i4 x8 `3 k

6 M) {& W: R8 g3 {+ t4 w+ @

- q) n t! {: h( c; a androidapp开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ; G& d. F2 x5 N* U& F# e

/ H+ F" |& r' ?" u

: v2 s; E, \* u" D. t" G vshapes= - [, \ K, B( B& S, j X' p$ g- \

5 L% }* m- ]- _/ z2 Y

6 g9 U# X1 a6 F7 |0 {. I. x   ! s, w) E- M D8 G$ p

4 y, F* b6 f, T9 [ l, I' o

2 K9 p1 O: j P6 C8 Q s android签名的数字证书的一般都是采用 X.509的国际标准。 - B" G0 j# @- E# H% J$ s

* g) [2 l/ l! ]( q

3 U3 M- @: q1 {* s; E; ^ X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 1 _6 u' ?3 W' s7 I5 V; S5 u

7 x4 D, B+ |5 V% P- }' c9 q) B8 o2 t* @8 b

, A$ V& i I3 J' u5 n; } 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 ' o- h: e- Z; r; x K* N

1 g! M/ E" E( Q6 q8 b% i" f1 y g4 B

: r/ W7 [# Z0 @/ P5 o vshapes= $ ^& B+ E5 {+ u! u5 z2 D; D- h2 B

( ]3 ~* |$ v* ^' u( l. p

6 f8 Q$ Z+ B0 Y- W" L   4 C4 S6 T: o3 N! v7 x2 I

; s) y9 a7 O, g

9 Z. \: M ~9 k* H6 R2 B 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 $ I, Z' G+ U. y- Q& E

0 c* i! w) }+ H- L

j+ a5 N0 V8 s$ P2 p" c vshapes= 3 Z* S- Y6 ]6 U7 }

6 ?5 X! t/ N( [1 b- ]) E3 Y F7 P

: Q4 e" `# V: H+ k4 @' A5 I / ?* t4 o2 S2 P1 m8 m

3 l3 R/ N$ p4 f7 F% f* v. M$ M

% ]+ V7 C0 Y* C. N9 J9 G8 E   6 F1 F( d" V2 z) D

2 |3 }# n F( |! P+ e

; e% A4 F# i: U8 | 权限信息 2 \2 Q' C1 F8 Y9 C, r

" g# Z; P% ~& b

# J6 h3 T8 Q5 T* G) s: G 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) 2 C; K5 v. S6 y) Y3 B% f3 v4 {

: d! q5 b/ X+ ]- b0 G

( B& q6 F" X7 a+ n android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 2 p$ n0 z: H9 ]( Z

9 c, B* e* V/ K

, z9 a ?: A4 g* v/ O5 o: M4 d0 w, e2 x vshapes= 8 J+ Z5 x9 f" y( @4 M

* H9 S! g- Y' H' o# |

$ j, E' F: n8 r   : w% ^! y$ m4 h6 b1 u) d3 y

/ h/ E# M1 g: l: k. @: E* _' r

* @; U% ?. c: N& _: K4 W 下面对这个APP的所有权限进行详解下: " M3 I2 W {# B3 J

5 ~" Q" X& W* z; ^1 w- r

, S3 W7 w) B! N: j android.permission.INTERNET :访问网络连接可能产生GPRS流量 ; [4 T: `0 J' k* j% n/ u- V7 j

/ r: R% H" ]5 R+ T0 N1 f

5 s9 R5 T9 E# r2 P1 K3 B* c android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 - K: Q4 d% _& N" ~

* @: m6 Z. w. C

9 h" A8 [0 m7 ?1 i# f$ \/ t android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 ; {* }0 e: f- L7 J2 q. |1 _

* ~0 Z* t( ^/ E/ ~4 m; V/ |. x+ c" x

( w9 K1 U( e1 I. g android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 - L, b3 d! r$ h- Z+ R. z

" j1 P, P% ]* d! X" |

& w- Y8 y4 n& Q' N: Y- A0 i- ^ android.permission.WRITE_SMS:允许应用程序写短信内容 ' m) d9 Q' o+ n- U

1 `# N% h: f/ D8 P1 ]3 ?

" T9 ^ ?: Y" c android.permission.READ_SMS:允许应用程序读取短信内容 . G I d! w' h7 E

. @* b$ C; N* O; F

: t9 A# T- O) E1 B; B android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 % N3 `9 f4 `+ l. X0 Z

, P* O6 s' N" A, P6 X# X

4 [2 n8 q0 b3 t0 F+ }8 o: R android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 6 y- H2 p" m" W# B9 c. @) o

. K+ G6 J0 b- t6 x( ?- [( `

7 a/ S* H& K- `! V H M6 \1 S android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 # e2 i i! ~$ F. D

1 B! s/ [" q; A. R+ O

/ o- g" p. `3 P& R: H' G android.permission.VIBRATE:允许振动 4 `1 b# j0 H& d: ~# F b5 V

3 ]. M( L5 @! O. W e

( r5 i( m) {+ N( `+ v( W android.permission.READ_LOGS:允许程序读取系统底层日志 % w q Y0 ~ s; ~; X- x

- J8 J; _3 W, o

* \" L6 l- ^% K Q- [9 N android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图  $ n7 m7 S$ G& z

) `1 r) s2 u: a5 l( h0 d

+ ]5 V# w. z; t   + G, a( Q2 F" \" Y

' i0 h& Y; r4 O+ [) k1 ]

6 g4 g8 {, b+ i+ K4 U 功能信息 & q, I9 ~' z9 t, \- D6 L

+ @8 s4 `2 x* ]" g2 ?2 {

, q) V$ F$ I B1 o- V5 |   9 X: ~2 O, H7 k2 G2 U9 f0 s# r

% E6 |( x) |8 R! d

4 }* T% Q! [( L3 Q0 G 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 5 \% x4 q" E6 P% r3 D

5 x0 Z: [3 u9 S+ s" e

1 a l' g. R( D7 ^/ V) R Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 2 X0 B: O" h0 g, z

/ t! w* C. Y; u

- w: R2 _4 ~5 X$ |- t8 p# { 1、需要用JNILuaC库进行封装,这样才可能在Java中使用。 9 V8 D0 ?8 e$ S9 v

K: F9 Z V% y: u+ e. H

# h3 A5 i2 w9 u8 i$ B- a' L 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 ; [! x4 U8 [3 ]3 O

0 s7 S8 Z3 X9 `" ^- g

' h0 x1 U& r) I! Z' S vshapes= % S" T4 f% W8 [! m

7 i* t+ C% J, N( k3 B; F# y

4 [) a& u% o" I) b* L   + [5 A% |1 s9 P# v* o

5 \5 k1 j! q" l+ Z2 y' I

/ k& X& X; I1 p; N: d 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 2 d% b% y0 @$ M

% o% j' A3 R+ h" B, F' z& `! x

$ ]$ i. c+ g: f+ P- k vshapes= , F, a( @! ~5 ?9 K" {8 S

' G1 A/ ]5 P3 m! f1 e: D

, s- V4 O# w4 @7 Y- f- J$ `2 L   ) S* k9 X5 R* D6 |2 K0 y8 E) a7 Q. ]- i

/ s) ?. B$ [0 L3 |

$ `* ^& ^2 L5 s3 h lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP其实破解这个验证很简单,直接将文件的禁入信息清空即可。 . c8 l# w: e! H, h: I) \

2 P8 n: i) p4 m9 @

; T% k% V# m2 t7 V: d3 d vshapes= ( \' T/ ? p% d7 d8 f

1 }4 a& h9 o! l1 ^

6 ^" _6 S- a. Z, D2 G 下图的这几个so是网络上luasocket通用的so文件,并没有什么可研究价值。 5 Q, f/ F& }! W, J# u: h0 j' O2 Z

+ i( ], q9 O5 L7 h

$ z) ]& Z k0 t# ?4 Q2 q5 ^+ I vshapes= ; a$ s/ {) X' Y& P

6 _3 M: s; g* W0 B* C

$ `0 z& h3 G8 T5 S( ]   $ e. e- \# l0 Y0 F, o, {$ I+ k

$ S+ |9 ]9 O: M/ o C

: Q$ y% z! a3 U1 o6 { O& y/ A 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 ! Q$ x% \- Z# z: J8 |9 `6 i

% f$ t3 Z8 O( F! g0 {) i

. @) o& J$ R: E5 Y4 D( q4 o+ A LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCPUDPDNSFTPHTTPSMTPMIME 等多种网络协议的访问操作。 9 F% O- `# J8 k* S) f

[- G, w7 ?: P

! E- m& [- E" `4 t+ f `6 B 这个luasocke一部分是用 C 写的核心,提供对 TCP UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 8 i7 f9 M1 P. y9 ^

# D _2 T0 n7 J7 B

8 p7 Y/ P# k/ @! g. U 源的luasocket代码可以参考学习下 ; p: S: S: @( d; n/ C/ I

" p* m1 q! [- L- \

: U1 H* Z$ A9 R @" _ https://github.com/lunarmodules/luasocket ! F" Y3 A- h. ~! p6 }4 h7 e' e/ V

8 B% D8 j( B1 a$ {

3 A* t% x& o" c4 x5 Q! H https://github.com/fengye/luasocket 5 {/ I% [* f( q! c1 i

+ G# C# D5 o9 Y: q) Q

8 V$ s6 @8 t, ^   8 C) _6 J* ]4 k3 H7 w3 i

+ a# b* n) J: m* I8 D

; {; `+ S' O" h5 O. J vshapes= ; b2 r" k4 `" _7 n

* g7 F8 {# c; r H/ v: e1 o. f

2 n6 x0 _, e/ F; F; _, v0 T0 S   " r9 p3 q. r4 `. E3 T7 g* o

7 D% B* s- z, p0 c/ I0 I1 c

; ^* {; P. ]2 _   c! j# u. q, h

2 i4 z0 F4 V$ b# V! O* _

! H. `1 `" H" m! I' U; Q 总结 / u6 | e2 e! n$ @

& e/ s J; G1 K# g# s) [

8 u2 G, _, q" \3 o, w+ W 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadxcharlesidauiautomatorviewer)工具就可以将功能全部分析清楚。 & X# Y Z# d0 \% y

2 R9 d" Y% g% H4 L

9 c- B+ ~( n( S 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 1 {5 s2 }( s" W

* W3 R1 L$ i& u

+ U p' m, J, T2 Z4 @; ~ 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 : R; b ?) K. [! A( m! O# }

7 x+ v6 J" _; _ x% T- x4 d" b% @9 f

4 x3 T3 k, \) c# D. e1 i' t* x1 v 结束 7 e" M, J& |, e/ d! B

) N* k) h1 G" y9 x4 c1 [3 ?

# \! y0 ^: Z# ?$ ~# p  【推荐阅读】 ) A# E* ^; o# z1 H7 E' @( J

9 e7 x: U& I5 A% e' ]$ `

" S: F/ q Y( u 对吃鸡APP的分析 : x, a# W: D$ P

9 _. k4 n7 |4 F i/ ]

; m" C3 p4 P" O2 z0 [% a. e 你需要了解的APP安全 2 ]- g n8 N1 d8 d- h2 I

. `" a. N0 K, \: [* N8 E

5 {$ ]! t& T( G 你需要了解的APP安全 + J! ^4 q5 d- U9 {3 _& Y. W. y% U2 ]

9 J& ` X. w" G/ j+ \* j3 i3 D# s

$ g( ~ l4 N' n   4 ~+ B: F( w* m5 k- w" q+ K

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表