找回密码
 立即注册
查看: 5293|回复: 0
打印 上一主题 下一主题

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

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

' {4 t% z8 t' e+ W1 r1 z7 {/ R# R 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 0 }2 N- X6 A) b: W% k

3 l# Y8 _. ^4 V0 j+ {0 b& c

a, P5 z! r5 X7 ~' l1 j ~ vshapes= + E( Q9 x0 @3 q8 F" T1 A

' e5 y7 @$ j) w0 Q5 E

' r! }+ H; O# ?: F* q; q6 `   + m; n8 `' i0 n

( t! z; w9 e* B$ w

* A: d7 g5 K" \' j, B- x 下面就以开发者角度进行解析下这个APP的功能的实现原理。 3 d2 s1 P% A" D& r) f

' E; {' s1 u7 q& B9 Z+ n

) E, L7 U; S# u, C   9 D9 B4 n! E3 t2 n. b5 m

5 p8 R) n: x- K" Z

% W/ v' b" I ?+ J2 P- C 基础信息 8 b" I+ P9 a9 ?1 `/ K

' H9 L. c& L2 r( k

* n' q. R, S5 U+ M7 S$ a/ c 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 : b/ y: L4 a5 P

' {, A$ _2 \+ T

4 J: C9 X$ D5 V: k! U3 F8 J vshapes= . d) f2 ?+ t; l6 ~9 q, ]+ z; s& |$ c

Y' k7 U9 m1 I& S. S p. l( G; ~

) G( \3 r& X; [3 v; L   : x/ d( E/ ^5 v

3 I5 }3 r- l5 X: S3 b

1 r4 Z' M1 W& J- a- _5 |. j1 d 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 4 H% n4 g% T+ b9 Q# {

; U4 t& w) S) C

& d% O. ~: p/ r& z$ o. \ vshapes= % [% g2 M( G2 ?( K! A7 Y9 f6 V: s

F8 x8 M! j7 C: x Y c

2 A. O( ^; i7 A, y d8 Y# r5 A   " w# V# _/ G, x, n6 g( K

9 S+ n& l5 }* i% ]4 w x

! x6 Q3 J6 _" y* B 通过jadx工具查看,该APPJava层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 * N, q, B. R/ |+ G4 _

! G& c. A# k2 X

0 v1 `2 }, \$ s9 S6 A vshapes= 0 S2 {5 s4 `- k9 P) S

: W: J' c7 A( G- T8 q/ x% H a+ T

2 T! S/ d% {4 Z8 ?   - O8 Z3 \* v" b

% B' z- ^' k q A

( j( {5 `. @ W% `4 l& P 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1EditText3Button控件组成的,也就是下面的截图信息。 7 H$ _( D; e' ~2 D) B. t2 \ k

4 s K2 W7 J/ M5 f0 R

% O# @2 @/ D) q, ^$ O0 a) `1 ? vshapes= 3 I+ q6 ` b8 ~' t( x$ L6 w

, z m4 E* a' { Y6 b7 z n

8 w4 ^2 ~- [9 d: _' e2 J   , c M* G& G2 R$ C! Q

5 p8 o9 l* c( C- J& a

3 Y$ @3 }) r- f: J3 @ 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 " w: X. u- ~- f+ u5 W% g9 Z3 m

" V1 o v# |5 ]) |. Q& b$ {

0 u# N+ @) ~ P9 s$ M d$ H vshapes= 4 J0 U% J; I6 w; ], b& M

" K+ J. l' R% m; h" c$ i* l5 s

9 V/ E, Y2 a S/ L   1 T# h1 { R' L) _- }& q

) @+ P, U3 a% ]& e7 u# \

6 z; A+ y9 Z) o   5 q: `7 u7 W. x1 X: I

" @' ]7 b/ l# \0 c+ }3 r8 k! m

* O: `# q$ ~- [- }+ T 签名信息 8 `" Z* x5 r2 }1 |7 f

. @5 f9 O6 t! t8 |. p- c- e

, q6 ]( g/ l: y 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名 5 f0 U7 q0 U2 S4 n( G

4 j, L% L( U7 O

7 `6 R+ ?6 I, c( n+ v 目前APP中大部分都是通过V1V2签名相结合的。并且这个在签名过程中要保证按照V1V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 1 ~& `/ S- o# C7 S& h

$ i; I" n. o7 `

6 m" p! Q7 K) J! O) S6 Z( t: Y androidapp开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 7 l5 z2 {/ r( m" \* B9 g9 ~; `5 Q

' G2 k0 _. @& m8 n2 J

y4 g2 s5 W6 o4 ?- m vshapes= ! O" L" |2 b, [5 ]6 L

! j2 X& }6 k6 F, ~' a

! c9 J. n1 X$ T7 H   - S$ G9 u8 M! F" ~

3 E7 g+ w9 Y3 D7 |; F- [2 \

6 K1 w: H& J+ x android签名的数字证书的一般都是采用 X.509的国际标准。 % ?& d7 D( P* `% r! M

9 ]7 y; Z6 Z7 n7 s, j7 m3 ?/ p

% K2 A+ ]5 }& h, j- o1 J* p2 u X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 / k' u+ H7 o$ P

! Q6 G- F4 s( l- V3 u

/ A- {0 f: ~6 V r 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 - g% q; u- W7 o5 v4 B9 J

3 H! }, J; X5 H$ E

- _% Y, ~3 Q' K vshapes= / q c! h4 E+ \( }! q

- H0 f" D: {; e: O# R# K

. k: y1 A" I- A5 n   - ^: Q, ^( h1 ~% [5 j+ ^

+ j0 O) M2 P1 R: O5 @, p0 W$ m

* A5 `2 O/ z' G, w# _+ ` 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 + [) u/ o n7 M

3 E, s5 Z- {# B6 q& M4 R N

: Y2 b( i6 j; d8 ?4 }9 o; p/ G7 j/ o vshapes= 6 Z6 z7 S9 W) q

' b9 J: d8 x1 A/ f4 O$ a

0 a; [: K% Q9 n' { 9 I5 @6 ~3 c3 [

0 l9 \. G7 V1 ^. r. j/ o0 S

+ {# `5 H/ F, Z0 i- R" A7 h2 o' I. O   ) ~6 ~& t0 S0 A8 Y

) Y' T1 I9 z+ s' T& J m

% B( J& F3 J6 [2 `2 t 权限信息 - X% p6 A# a5 b% S) M) K+ T

1 h0 B( K) _8 T. M& W8 W

+ \8 I- p: B+ K+ o 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) 2 q5 X1 v7 Z; L( a# h# L: X1 |

- j1 ?" y" j3 b$ O u

3 o& V- G/ l. _' h% p android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 - p$ v O" |. P1 \

7 l) C* W. A8 D

/ p9 t- R+ b L. J0 C# d, z) @ vshapes= * [( C& \9 V* _! c

3 R1 O, L1 Y$ l

) g& N/ ~6 |' Y5 H, A   ' P# M' j: Z o) ?- ^

" |9 \) V4 P4 C+ ^" E6 j3 B/ V

" V+ F/ ^& {3 ] E 下面对这个APP的所有权限进行详解下: ( z9 H1 y! L& Y5 o& o

X7 ?" m+ e! c g" Z

( @8 U+ Q+ E5 b5 T+ U) {/ W android.permission.INTERNET :访问网络连接可能产生GPRS流量 G- V$ ]7 _ m9 h+ o

& m, k- C1 [" A/ u2 \$ o

8 V2 }' F0 {2 e) ~ android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 ! k" r9 c. i- J! I, \, l

3 n6 e0 ~" X, {7 {6 k8 U! w) Y

) }1 m `, D% ?2 \! I5 i android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 $ d* g% y+ h$ h; ?

. z' i( ?' U; V# A. y% r

6 @9 M# q- N2 Q( { @4 ] ] android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 1 N; L: R0 u! z9 R1 C

( l/ p+ e; _$ q3 ~! D4 o" E; D

( f: W. Q" w2 m+ _; U2 e5 K$ x android.permission.WRITE_SMS:允许应用程序写短信内容 5 P2 O3 s: i: o: y# q" o2 \

6 J7 g! o: x) I" ~

, b. y6 u/ n+ C6 Y android.permission.READ_SMS:允许应用程序读取短信内容 % \) H6 @: f5 |# b

! t. U8 F3 g5 ^

. z* e S6 S+ A/ m android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 0 a" R$ |4 Q- y# e% X$ W& _

4 O/ b' C. \4 z7 f2 t

: L. v2 o' O2 w4 U5 y android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 8 S" E7 m' J$ f" s& H

& ], ?8 Q4 r+ `5 ~; J. [

; Y6 |7 @/ J. ^* \ android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 5 X: \6 J3 O% y5 ?! ^

3 _+ R6 K& y9 h8 b$ _5 k; X

& w7 n3 J3 ^; l `0 \0 h V# _ android.permission.VIBRATE:允许振动 ! k$ V) T* R7 g

0 _- h% W$ A+ {( w; j+ }- f6 o

4 t6 [6 ~ v- V4 e2 B y android.permission.READ_LOGS:允许程序读取系统底层日志 " H7 X) u% H4 A- ^6 X

0 `) b, {$ C/ Q& L

* @3 N2 s* N$ H android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图  6 [) I1 H# ~9 {: }, L5 j# a

+ c# t. h: S! Y1 ]9 n4 _3 _; B

) ^5 e# d- v' B; ^   4 M3 |: D5 r4 X7 K7 ?9 O6 G

! e1 b2 ?' i. G9 L

1 Q! _" J0 T1 ?& r( R8 w' {% u* i 功能信息 : B; X$ C: _8 v& W- v' s& n! m

$ k" x1 z# o: {$ _( d

* y2 U- p+ f$ O' e% E* O   4 v6 x: t# F/ S) B. U% r0 I; q

" A; v1 T) ]5 b+ ]

0 Q- W2 Y2 j4 Z& ~; g* _4 d, Y 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 & m6 }* e4 `- m6 ?

1 z9 X) `1 t) x4 h

) v/ i7 V( R' J Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 , _. _7 A/ x+ h* [9 J# ~- a/ ?

1 q8 `, _) ?* O

* _5 V! d- f: `" B- M9 n0 g 1、需要用JNILuaC库进行封装,这样才可能在Java中使用。 ' w- u0 {/ g* `9 g7 F5 f

5 e" R/ Q* S( W9 U

/ j5 S6 J7 I$ z2 D$ U5 \5 f! \ 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 $ S4 m# P: {& ^* S9 @1 G

% J$ c \ h- [. |/ A7 \( D- h u" y

6 w! h) Y \5 J% E# B1 ^: I vshapes= / D0 H2 j# r# H

- f2 e- _, O3 W3 z# ]

- _7 F1 G+ S) |0 Q6 }0 S4 y3 l7 e   # x, x! H& l- L3 y

( G& [8 m" i! Y% A

9 E6 V& y' m1 V+ C- }. {- k7 H9 J 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ; H# [3 h) q8 [/ b, V) J

/ Z: E$ W- N& x) E/ M5 r- H

l( o8 t: O( V vshapes= ; h6 ]5 K( D0 X8 d+ n! G" u

' C. e, k0 k- |( i! e- T# c& U

4 M, c6 k# l( [4 h   * t+ n" `+ R6 J) [8 T% c

c. J# O7 v4 @1 p7 {

0 J5 a3 b4 o$ h) c4 |9 E$ D lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP其实破解这个验证很简单,直接将文件的禁入信息清空即可。 + j/ X9 ^% @6 k6 ^0 S

; O1 l( e3 g5 |2 U' o5 Y

. B8 s- t5 t7 j) z5 o vshapes= - r( c+ b- H+ q

6 \( j$ V s/ U

) o/ N; t. E6 U! V. q( I1 w8 z 下图的这几个so是网络上luasocket通用的so文件,并没有什么可研究价值。 , O" |# f8 y; J& u# ?7 y

# u5 r' X$ x& n& M7 }" _% ^

4 a5 V5 E- ]+ \/ h$ @ vshapes= " f; R: A% { ]: m F

: ]* z2 L" u( W e0 o r

3 h3 Z9 y9 U# J# g0 g   % A" @! a( Y% n# ]. R. I

9 J1 C% o: j/ O% g, k

+ h y. m3 A# o1 D+ c8 w, V, V C 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 7 r: b! _ C- G* T/ y* W. v+ t

0 W; f; m' ]. j5 E- s& P; b

# C9 i% [1 H) z9 } LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCPUDPDNSFTPHTTPSMTPMIME 等多种网络协议的访问操作。 1 n Y% d& F% P3 O+ r! G. t1 _

/ N8 ~! b( U. _

~2 h% X. v- k 这个luasocke一部分是用 C 写的核心,提供对 TCP UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 ( b; B! B3 y. q5 y. t+ X3 ]- W

7 ^# r' D: D/ S5 k9 @: H1 G1 F

3 m/ I$ o: o$ `# x! O+ D0 h& _% @) Z 源的luasocket代码可以参考学习下 & M& J: ]8 y3 z2 k# y7 ]

; m' M: n; }+ @: r+ Y, P6 _

/ F( s" Y3 J" f0 x9 P https://github.com/lunarmodules/luasocket 6 t9 W' G+ n" x3 t- X, l

1 k! J7 A7 c) e+ c C) p

! \: {: X. g9 N; G$ b https://github.com/fengye/luasocket 2 r8 y/ o4 ?3 f. B5 y5 s3 Q

! d: b7 S) J5 G

% f" G! Z+ I3 p6 S8 f; r) m   # a, v6 B- X8 l4 w7 h

; |: w9 a* Q! }# s- W3 W6 |

) u0 M, a* v( |6 U vshapes= & V& P _. ?# u( N- J' i7 N

# F" }' r* ^) _- V) o

& U6 a3 e e8 F! C* p   # l7 I" I; f' p/ S# \. g

6 k5 [# ~: }" L! [5 a K

1 G6 p; j# R/ Y r* ?: A   * d5 ]8 j" S% d0 _2 s j1 \

- V+ `% H- N. I% m5 I z2 ?1 A8 [

' V- u& o, g( y3 A% Y 总结 ( t$ \! o* L p: q9 N' U

. C* o/ U3 M6 G9 a& B; G

: ~' [( u; ~; c$ u4 X& E% N" w 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadxcharlesidauiautomatorviewer)工具就可以将功能全部分析清楚。 # {* z, G# r5 z' W6 _! p

8 w& p5 e$ t+ m5 X, h

7 c+ c! z7 ]% l) U 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 - e( o0 _' H9 j* W. B: T

/ B3 ^) N9 D) C, S/ j

6 p: A$ e P, L0 Y" P& h# W. r 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 6 S4 u* ?- {8 m" W% q4 R. Y

3 |& \ ~0 k9 y6 J: I E

. Y! U2 h/ y2 C/ u3 P 结束 2 j- r. H* A) D- O3 w

% M7 }2 o" N! L& c( Y

' s. s8 o) j$ D. s: Z- b- Z. x3 T  【推荐阅读】 1 X2 t g2 I2 D" m' v" `

. e* c4 Q# D3 D+ [

: f, i8 Z! l' k7 J# [' E 对吃鸡APP的分析 ; I4 J$ u& l, W

. W& m9 ]: u" o' a2 p

7 h" @ h: B( P8 S n) `7 L 你需要了解的APP安全 ) g0 S' N4 }0 V' Z

6 P6 I. u2 \( [2 N O

2 g! g8 D* r" [3 H 你需要了解的APP安全 1 u. c' `4 _4 a: T% M

0 B& @$ U j+ [7 A6 a

% K5 e: G/ B5 W2 p: E   6 z# m$ O. }4 d; P2 M

回复

使用道具 举报

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

本版积分规则

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