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

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

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

# 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 @! ^ vshapes= ! 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 ] vshapes= ) 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 vshapes= 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工具查看,该APPJava层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 / C6 m" a1 C9 e. g

4 P5 [/ C3 q h: E, j* k, Q

7 |& z3 F ^9 p- _ vshapes= - 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的界面主要由1EditText3Button控件组成的,也就是下面的截图信息。 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 vshapes= # 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 vshapes= ) 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中大部分都是通过V1V2签名相结合的。并且这个在签名过程中要保证按照V1V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 6 m7 L! h$ j( ^. _5 K1 y# X. R

6 G& i, @ p3 P3 O. g, B0 Q

9 Y5 x0 c2 A; k8 k2 t5 W/ v$ N5 g androidapp开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 # L6 g& L' P- S, `

- W) H/ n6 ?) G

+ E0 r; W8 A' Z8 j' P vshapes= 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 _( @ vshapes= ! 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 vshapes= * 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 vshapes= ! E; i3 @+ T0 T

" G: C+ K- X9 c! n) K# R H0 n

3 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 A

2 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 H

3 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、需要用JNILuaC库进行封装,这样才可能在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 { vshapes= ; 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) V

8 A$ h- x' o# T* v vshapes= 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 vshapes= ! n M2 d8 m7 S

( `0 N: Z/ d' f% o. u

7 U- O% n; A# q6 O5 R 下图的这几个so是网络上luasocket通用的so文件,并没有什么可研究价值。 3 l! X I% I# n! i8 \) C

9 o" w* k3 |' ]6 w

& X9 Y- @* A: l) @ vshapes= 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 的网络模块库,它很方便地提供 TCPUDPDNSFTPHTTPSMTPMIME 等多种网络协议的访问操作。 * 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) _ vshapes= : h* e5 d7 v3 r/ U4 D8 k

! e2 `" `1 h$ A2 j R

4 {! 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和动态调试这些操作,只要用几个(jadxcharlesidauiautomatorviewer)工具就可以将功能全部分析清楚。 % 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

回复

使用道具 举报

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

本版积分规则

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