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

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

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

+ \4 x9 B+ r3 y2 t1 M! g9 X2 L 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 : f$ M% E( ~8 d: b( ]# s& j

, q; e# R. q f! H+ W

; ]2 j+ ?- x& t! L vshapes= " l$ | u+ r: A: u3 |

( L$ L8 a& ^! _ T- H L

5 z) k; b; _/ m0 M   ( f4 U, {" l$ X

; \' V; k- I/ H- i: W7 C- r: i' t

/ Y, m; h) v `. b% H* A 下面就以开发者角度进行解析下这个APP的功能的实现原理。 $ s+ I- A8 P+ g! T4 e" H

' F, e n* {: o5 S

3 e7 A" r2 X* y5 H   ; V7 y, [. O. E, D: d

- ]9 q) q6 X$ y& |7 N5 W" A: [

! |- v1 }( Q5 r' l4 X 基础信息 ) `5 A s6 J- B6 c% x6 K6 i

" e" u# Z/ j% q3 p

1 |( m- Z6 e2 b: h: h3 X 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 / F& @- ]/ H/ Q W- [& `

a# U4 B6 N8 u0 X/ Y

/ U* M+ c, _( q z& H: h' c# T vshapes= / h* d" m9 k7 C* l& ]- [ H5 e. D

" N9 }. }- S$ L H6 l$ ^' ^* Q- V

$ I. c' H1 Q9 `* p2 b' u$ J2 R   9 c7 `! A8 d, E: J S

4 @: }( j% t# a8 k

, k5 m. W! |: F 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 / E8 j: x/ n. K( e

. Q9 M; `. x4 U- f6 T8 g V

. {% D1 Q% k: E2 D3 S, i vshapes= ) S" X1 v; s3 ^/ Q

- K+ @7 j, `- J- [5 }

. E3 b4 A" i' M8 y3 w# k, z! r   0 i" `5 b0 F) x5 E( Y

# z# f: n: @' _

. G/ U( A+ B* l: [( @ 通过jadx工具查看,该APPJava层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 2 f. s# u3 y8 }" Q* L

! u* g, Y+ o. k3 f( v4 \1 p" f

* J7 e& h* x5 B" m vshapes= 9 o+ x2 {4 j+ o( P6 V# ^7 m" V. m

; T* _/ d3 |6 s& i

% h2 g' _' |3 ^3 e) F   . G+ }3 b+ ]5 ^- {

+ }) R) \9 E/ f- ^1 w3 l5 j

7 T; J7 k& l6 }, H) @4 ` 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1EditText3Button控件组成的,也就是下面的截图信息。 ' d$ V7 o& q! q9 M9 a

S3 P8 {) h3 K% s- c+ H1 y

0 s( F4 x# k D vshapes= 1 R7 V! `$ d$ c

' u, E- v& V7 f% c! Q& C( g

% Q/ w) a2 i) K! W( J: \   ( e: {$ y- I" }" M4 S. R, I

" q! G: X& v' m: K

7 n6 E; o& \1 W0 m0 D 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 . y# z5 Q1 M$ ]* R9 B; N* |4 `

% S2 s8 }! a, }9 Y- Y" {- I' F

; I6 ~' T+ d T q vshapes= , _! |! H4 B L0 _

/ @. P$ R& j3 M# }

$ u8 V/ N* y- d3 Q1 y/ i   + W' j0 Y) I! q5 ^

. s1 S4 y7 {: y8 V

/ L9 ^% H$ M3 A4 [: K- \* b" `) {   / H0 g) R+ {2 E- r; F

* n# ^- O2 w; K7 w

1 E) i5 O3 h4 _6 S' A 签名信息 8 X& {- S% O0 m+ p7 x2 A N

4 Y) x$ S! h6 k9 [% j

1 g1 w$ f. ?# q7 g! U* l, B: T 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名 7 u: @, {! f7 N5 i* S( l [

7 M) y( F5 j# |) n6 W& e

5 v2 n2 C, {! B2 B& W0 Y8 ? 目前APP中大部分都是通过V1V2签名相结合的。并且这个在签名过程中要保证按照V1V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 l; Y; Y8 G8 L( n4 P

& Z% J A1 K; f

( G3 B3 W2 F2 E F6 U/ a androidapp开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 / I D) |+ s! X/ Y2 f

* V1 o- s5 j8 Q' c; @6 C

5 A* I3 V7 y; g* s vshapes= 8 v8 [* \/ w0 S0 h% W

. ?9 D# n( w2 V0 ]- N* _- y' _

1 R, y* A! M l) q/ q   , T( B c8 E8 a) h. _

6 i7 y9 V1 W$ o3 G1 N0 K- ?

_' e' F s3 n7 v6 p5 X( } android签名的数字证书的一般都是采用 X.509的国际标准。 # D s4 n; M! ~1 u1 [& V. e

! I1 ]/ t/ N f: [" B R

7 }5 n$ \3 [; S: A, ^! P) t* C! D X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 ; _2 ~9 L0 w$ \% e' {

5 Y9 N. q2 T! C+ F

1 ^# y/ h" }8 ^4 _, V f i1 R 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 * H, D6 w; K& d( S M1 g

% j: t" `3 w G: N5 n. o8 L; A/ b& \) y

- ]. c5 t( I1 R. O2 a vshapes= ) m/ ~1 W/ T" _" q5 c( F

9 H2 E0 i! [& `" S$ w

+ V- q5 T n6 }   3 G L3 Q! H b* Z- Q6 y2 y5 y

$ [2 |3 Z+ N0 [" _4 S

+ c8 Y3 v! b. h/ E. [! M- g 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 / L4 ^" H2 Z) _$ P# O

- @0 x4 C$ ^7 W' x

p R* U- p x: M' s( f vshapes= , n& V' Y/ S* ]$ Q- D5 A

I2 d( P3 Q; O, e& T' n

+ `; m4 `0 ]! C1 K* ` " O. g" X1 `" h5 C; [; U3 T L

+ R( `/ |4 x( y- d5 g" Y

/ C8 ^5 y2 X. K5 c4 E6 V; F8 P4 K: [   & H0 f! Q- k7 `

" g+ E P# A7 e8 _

1 d' m- K! i1 Y( d' l 权限信息 1 K* h i5 U% W* C

- l) l" O5 a! `5 G' }6 _# i5 N1 Z, y

1 u6 T6 |$ d) Q f) Q 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) # M& s" v1 F* C

% N1 V9 S; N D: `3 J

$ H: s+ H# h3 l* i android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 2 C/ \7 g. G/ P

8 y( R+ ? k( i. j

5 T4 y4 {3 R7 V& G+ f vshapes= % v( x8 O4 y T$ M0 {3 R' h* c

8 @' z* ]& _7 X7 h1 q1 u

3 z$ f" w. j' T" ^& X3 ~: Z   5 ?2 |. K, M0 y/ l8 I5 g* V

7 C# F4 o! E0 G H" ~# U

) s% Q% [- n& K 下面对这个APP的所有权限进行详解下: * n, u r+ u y# n

+ t* g' r u8 _4 n8 f

* q! {6 N2 J: ]% Q android.permission.INTERNET :访问网络连接可能产生GPRS流量 ! s! D4 V, g/ t% d/ c; \

' L2 O+ Q D, v [6 r

; q! K" D i# k android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 7 g1 g, b: a z$ _

; U* \! i0 e3 V! ^ s+ d

2 }- Y. }) ^5 A W0 H6 y android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 5 o. _- R( k4 r3 f% `

+ {- b2 W; d# A. Z& g

' h7 Z" y. }4 f, x6 E. f' m$ [( U android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 7 V$ w( L( K2 \7 i1 d( Y4 d( c

, _9 d% R( N6 T8 T, A

4 ]- l. Q' }, S# x9 X; n- z android.permission.WRITE_SMS:允许应用程序写短信内容 5 \1 n7 r5 l* \+ T8 C5 U. _$ I% |

4 s9 f5 Y- E! u; v8 M' Q

( D8 j6 f8 C" s4 e5 G$ p+ f, W android.permission.READ_SMS:允许应用程序读取短信内容 ) S% Y: \' K& L- S4 G% m+ I) x

T8 M* r; b9 u; s/ {; G

* b: M: z, e2 Y; k: J% S android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 0 m2 x* \3 U+ H7 `

8 P7 U O+ k, ]) I1 ~" Z* q4 {

# n2 s. k6 O& i: ? android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 ) ^ r6 B1 W# r

5 R: T$ r- t% p

& l$ j+ C$ `" z+ J6 [& l android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 " H) J. @7 g7 E! I& [7 U

/ Z" [! l! {+ _! {( D& v

/ {+ A9 s, _/ e7 o$ W0 o/ \2 \ android.permission.VIBRATE:允许振动 , I! s7 Q% @5 ?

+ K4 K( O3 @, ?& L# W w5 a

& u- W7 k1 f7 T) L( _0 X( V( M8 E android.permission.READ_LOGS:允许程序读取系统底层日志 * C1 e1 k0 g5 z0 T. e! r

# i. G/ |' m8 F7 @! A% m" y

$ [2 u1 c- L m; x; ^7 G7 Q1 q android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图  9 |/ E3 ~2 H& k" \3 P4 S

, O. _) | a. p- i

, c$ x6 S$ q+ F, ~. T9 c* J" Z   % ?7 a7 E) s1 B2 r& d

* d4 M* h6 X% t" P/ W% B, j

' S1 z: F O+ [+ D1 K M 功能信息 $ S% `0 E4 k! ^5 {) x4 \( d+ M

+ b* A! f0 c5 K1 P7 _, V. B

% _' K8 y1 S4 \6 l7 S   * [9 \- a( B1 V% v7 b

: l+ Q+ Z, n8 B- E) L

: Y$ J$ q F8 R 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 % `# S$ ?& I1 j3 o/ {/ }

3 Q% X1 x) X9 B2 D9 ]6 H; x

/ ~. _6 o( m" W& j Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 6 f# F% M" o& g% }8 F

) x/ i% d' p6 e2 t' j3 s

( O: ?# Y. F4 y& W# G 1、需要用JNILuaC库进行封装,这样才可能在Java中使用。 ; C- O! m) c3 }4 G

9 V3 r4 \' q3 R; g6 V

) O; Y$ F3 t$ S) I5 K" B 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 ! ]& C( x- `& \# o% }

9 a3 m3 Y, a0 b5 M5 `

' ^" f# x" p4 [- A8 N$ d& n" { @ vshapes= ' @) z' s7 j1 K9 f

6 f" [7 ^6 X8 Z0 y' t$ c

- j' D" O5 ^% x   # A1 s1 P V, ?" c3 X/ p2 G, r

$ T- j* l+ a! \6 ~

& F' K9 y- H! q* T M. u 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 9 z3 F3 h1 M2 j3 Z* T. }

+ z* P f! H- j5 R- H

# F" s; H! b8 }8 L/ @ vshapes= [' Q" ?9 |2 u2 o0 Y8 V

7 l; `7 M- n9 E* J

" }" e" b# f* p c9 G   $ l; K4 s+ W/ m. t5 L: o" V% @8 v

6 T; c: v, R" M4 w( o0 E

. c3 Y8 ^1 {6 @ lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP其实破解这个验证很简单,直接将文件的禁入信息清空即可。 4 ^4 a0 x, Z9 f4 K$ U, O

N ~# ?; j& e5 M! X% j

6 \ {1 j8 ]% I+ |' I2 ~! a# B vshapes= . @2 Q& Q+ D( H/ v

: R. l9 q. x# V1 u3 z& B

; X* D, I3 ^& T2 F+ i* z: [2 p3 I 下图的这几个so是网络上luasocket通用的so文件,并没有什么可研究价值。 5 f% ?, b1 o% E

+ t/ k, c' U2 O7 r

9 h$ g" d/ P; ]$ f3 [ vshapes= ( p; G( q9 T0 B x9 ?

3 `& ~8 q. m7 f1 Y' j. V. U

1 I/ y2 d5 {- d4 e   . @$ ~8 ], m/ ?+ g

' s; h$ P# k1 V) [

: _2 Q6 S$ [6 L; U9 g' Y9 b1 H 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 4 r" T0 ~* T7 r

% w- U2 I* F) \& V* B2 t! Y

" u* f$ F; R% A' ~, c! o2 q4 w LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCPUDPDNSFTPHTTPSMTPMIME 等多种网络协议的访问操作。 & _4 S! f# J% m! i2 f! ]1 x

" }( A; D/ X- t. ?+ T0 A( F0 E3 Q3 ~$ A

$ r' _/ u5 u. Y) e# S* [$ ^6 V7 D 这个luasocke一部分是用 C 写的核心,提供对 TCP UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 6 K( Y, H; C3 y/ g2 E2 J

3 f; M! F2 ]( C% e" X

" q: [& v6 m# O! {8 `& u1 j 源的luasocket代码可以参考学习下 ( }# r( J6 b1 G# `

5 o, a6 ^+ ~4 O F2 @

6 m3 y$ ~: x, ] https://github.com/lunarmodules/luasocket / q9 i0 W1 M; C1 _5 f$ L

. w0 U9 C8 r+ a

9 w2 f& f. g* y https://github.com/fengye/luasocket 8 |& ?* b7 D; f5 l0 U7 M1 e

( w$ w2 D/ d5 D3 x

3 F+ l& q5 }: J: B) f& y1 @& k# y   , V6 p. N# ~$ Z# q: W e. s

3 b. r+ p) u! o( A+ b ]

# w9 R+ f+ s# x8 f! Z; ^, s; [2 B vshapes= 5 `; j3 h* S' {6 P

. i; V! {9 ?6 a; F& x x* J

* Q* f0 D$ P6 j+ g. N2 p   . y4 r1 q! B. N3 a

% B' J. v/ x8 v2 v8 l, t' T$ K

; M# o2 | K9 X* j   $ A) y, l- V8 ~: R

: h6 z+ ~+ F! W+ }+ M

# {7 J1 ^& b* X2 f, c% Z. m 总结 1 r5 K) i5 s1 l4 m6 E

) f7 E4 b) ?$ B0 g

& a5 x# z& s4 ^- ^* l 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadxcharlesidauiautomatorviewer)工具就可以将功能全部分析清楚。 : B: _* C- I+ z

/ A' m% k5 ?# Y

) M& z2 r7 _' A6 I5 W 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 9 S) W6 S* `$ ^0 R Q& t0 p0 H

$ v: N9 j# ]8 C7 w/ J0 D3 \

( }% v. {: O& W6 r 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ! f3 h4 f" _( b7 v$ B; \ j6 Z% D

. l) F4 T, C7 H

' n/ n8 K4 h7 B4 S9 ^, m6 | 结束 / g. Z$ w8 Z& G4 l

# d3 x1 t) s6 O! c$ y

8 W7 n+ A1 b! z- t5 P: S5 {6 a1 R, W  【推荐阅读】 ; I; i2 G/ z: _" \9 z& o1 S; K

* u* t/ z4 @" N$ N6 a/ _4 Q5 d

7 U: D; B* O/ a; H- {' l" C6 s 对吃鸡APP的分析 + {# b" Z1 K) F8 h2 y) C

; r2 D5 h h4 Z, x& L8 \0 [0 s6 R

/ y- P9 G0 g: G 你需要了解的APP安全 / t" Q5 x* X. K: w% B( c

& s' U! @9 O7 ]3 E

t1 I9 u" y6 j) r 你需要了解的APP安全 e- p5 V/ k) F

; b4 S5 l/ n: {- Q" w

0 V+ r, E* c% L0 K   }6 Z! E- H0 h! v

回复

使用道具 举报

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

本版积分规则

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