技术干货 | iOS逆向工程

前言


1.ios逆向工程指的是在软件层面上进行逆向分析的一个过程。如果想要达到对ios软件较强的逆向分析能力,最好能非常熟悉ios设备的硬件构成、ios系统的运行原理,还要具备丰富的ios开发经验,比如:拿到一个App之后能清晰的推断出这个App使用的技术,包括引用了那些FrameWork,那些经典的第三方代码,以及整个App工程大致的文件个数等。

2.逆向工程的主要两个作用:首先是攻破目标程序,拿到关键信息,可以归类于安全相关的逆向工程,其次是借鉴他人的程序功能来开发自己的软件,可以归类于开发相关的逆向工程


3.与安全相关的ios逆向工程
ios 逆向工程最突出的应用领域就是与安全相关的,比如:通过逆向一个金融App,来评定这个软件的安全等级,安全专家通过逆向ios病毒,来找到杀毒的方法,安全公司通过逆向ios系统电话、短信功能,来构建一个手机防火墙

a.评定安全等级
ios中那些具有交易功能的App一般会先加密敏感数据,然后将加密过的数据存储在本地或通过互联网传输,而如果安全意识不够强,就完全有可能将重要信息直接用明文保存或传输,安全隐患极大。App虽然可以将低维的攻击防守得如铜墙铁壁一般,但是挡不住高维的逆向攻击,不过不可以据此得出App不安全的结论,因为ios逆向工程的使用均来自一个前提:ios越狱,在这种环境下,我们使用这些逆向工程技术来分析评估目标App中可被攻击点有多少,可攻击点越少的自然就越安全。

b. 逆向恶意软件
ios 是只能移动终端操作系统,它同计算机操作系统没有本质区别,恶意软件就是通过逆向工程定位系统和软件漏洞,利用漏洞渗透进目标主机,获取敏感数据

4.与开发相关的ios逆向工程
开发者可以逆向系统调用,在自己的程序里使用一些文档中没有提及的私有功能,还可以逆向一些经典的软件等


a.逆向系统调用
开发者编写的软件能够运行在操作系统中,提供各种各样的功能,是因为操作系统本身已经内嵌了这些功能,软件只是拿来重组使用。绝大多数的App的实现都源于公开的开发文档,而不能使用诸如锁屏,关机等文档中不涉及的功能,如果你的程序面向Cydia,那么不采用非公开功能将导致程序几乎没有竞争力,故可以通过逆向ios系统调用,还原系统实现相应功能的代码,并应用到自己的程序中。


b.借鉴别的软件
逆向工程最受欢迎的应用场合就是“借鉴”他人的软件功能。


如何判断是否越狱成功?

• 桌面是否有cydia


• 工具判断(比如pp助手)

如何使用cydia安装软件


二、 Mac远程登录到iphone

我们经常在Mac的终端上,通过敲一下命令来完成一些操作,iOS 和Mac OSX 都是基于Drawin(苹果的一个基于Unix的开源系统内核),所以ios中同样支持终端的命令行操作,在逆向工程中,可以使用命令行来操纵iphone。

Mac 和 iphone 建立连接如下图

为了建立连接需要用到 SSH 和OpenSSH
SSH: Secure Shell的缩写,表示“安全外壳协议”,是一种可以为远程登录提供安全保障的协议,使用SSH,可以把所有传输的数据进行加密,"中间人"攻击方式就不可能实现,能防止DNS 欺骗和IP欺骗

OpenSSH: 是SSH协议的免费开源实现,可以通过OpenSSH的方式让Mac远程登录到iphone,此时进行访问时,Mac 是客户端 iphone是服务器

使用OpenSSH远程登录步骤如下
* 在iphone上安装cydia 安装OpenSSH工具(软件源http://apt.saurik.com)


登录方式 通过USB进行SSH登录

• 22端口

• 端口就是设备对外提供服务的窗口,每个端口都有个端口号,范围是0--65535,共216个

• 有些端口是保留的,已经规定了用途,比如 21端口提供FTP服务,80端口是提供HTTP服务,22端口提供SSH服务,更多保留端口号课参考 链接

• iphone 默认是使用22端口进行SSH通信,采用的是TCP协议

• 默认情况下,由于SSH走的是TCP协议,Mac是通过网络连接的方式SSH登录到iphone,要求iPhone连接WIFI,为了加快传输速度,也可以通过USB连接的方式进行SSH登录,Mac上有个服务程序usbmuxd(开机自动启动),可以将Mac的数据通过USB传输到iphone,路径是/System/Library/PrivateFrameworks/mobileDevice.framework/Resources/usbmuxd

• usbmuxd的使用

• 下载usbmuxd工具包,下载v1.0.8版本,主要用到里面的一个python脚本: tcprelay.py, 下载链接

• 将iphone的22端口(SSH端口)映射到Mac本地的10010端口
cd ~/Documents/usbmux-1.08/python-client
python tcprelay.py -t 22:10010
加上 -t 参数是为了能够同时支持多个SSH连接,端口映射完毕后,以后如果想跟iphone的22端口通信,直接跟Mac本地的10010端口通信就可以了,新开一个终端界面,SSH登录到Mac本地的10010端口,usbmuxd会将Mac本地10010端口的TCP协议数据,通过USB连接转发到iphone的22 端口,远程拷贝文件也可以直接跟Mac本地的10010端口通信,如:scp -p 10010 ~/Desktop/1.txt root@localhost:~/test 将Mac上的~/Desktop/1.txt文件,拷贝到iphone上的~/test路径。

• 先开一个终端,先完成端口映射
*cd 到usbmuxd文件夹路径

•python tcprelay.py -t 22:10010

• 再开一个端口 注入手机

• ssh root@localhost -p 10010

• Zhanghua123:~ root# cycript -p SpringBoard

ps: 切记第一个终端不可以关闭,才可以保持端口映射状态


三、 Cycript的使用

Cycript 是Objective-C++ JavaScript Java等语法的混合物,可以用来探索,修改,调试正在运行的Mac\ios App

官网:http://www.cycript.org/
文档: http://www.cycript.org/manual
通过Cycdia 安装Cycript,就可以在iphone上调试运行中的APP

使用上面usb链接的方式进入iphone
Zhanghua123:~ root# ps -e,会出现很多进程,看var开头的,可以看到开的进程,退出cy# 可以使用快捷键 control + D

• cycript 基本语法

• https://segmentfault.com/a/1190000011720125

• 定义变量

• var 变量名 = 变量值

• 用内存地址获取对象

• #内存地址

• 查看已经加载的所有OC类

• ObjectiveC.classes

• 查看对象的所有成员变量

• 对象

• 递归打印view的所有子控件

• view.recursiveDescription().toString()

• 筛选出某种类型的对象

• choose(UIViewController)

• choose(UITableViewCell)

注入手机
cycript Zhanghua123:~ root# cycript -p SpringBoard


添加一个view

cy# v2 = [[UIView alloc]init]

#"<UIView: 0x111b90ab0; frame = (0 0; 0 0); layer = <CALayer: 0x11002fe40>>"

cy# v2.frame

(extern "C" struct CGRect ":frame"(id, SEL))

cy# [v2 frame]

{0:{0:0,1:0},1:{0:0,1:0}}

cy# v2.frame = {0:{0:0,1:0},1:{0:320,1:200}}

{0:{0:0,1:0},1:{0:320,1:200}}

cy# [view addSubview: v2]

cy# v2

#"<UIView: 0x111b90ab0; frame = (0 0; 320 200); layer = <CALayer: 0x11002fe40>>"

cy# v2.backgroundColor = [UIColor redColor]

#"UIExtendedSRGBColorSpace 1 0 0 1"

cy#


Cycript 封装的一些库
从下面地址下载资源
https://github.com/CoderMJLee/mjcript
然后安装在手机的 Device/usr/lib路径下


具体使用如下:

Zhanghua123:~ root# cycript -p SpringBoard

cy# @import mjcript

{}

cy# MJAppId

@"com.apple.springboard"

cy# MJAppPath

@"/System/Library/CoreServices/SpringBoard.app"

cy# MJDocPath

@"/var/mobile/Documents"

cy# MJCachesPath

@"/var/mobile/Library/Caches"

cy#


四、sh脚本文件

• 将经常执行的一系列终端命令行放到sh脚本文件中(shell),然后执行脚本文件,可以通过sh、bash、source命令来执行sh脚本文件

• sh bash

• 当前shell环境会启动一个子进程来执行脚本文件,执行后返回到父进程的shell环境,执行cd时,在子进程中会进入到cd目录,但是在父进程中环境并没有改变,也就是说目录没有改变

• source

• 在当前的shell环境下执行脚本文件,执行cd后会跳转到cd的目录,source可以用一个点.来代替,比如“.test.sh”

cuilinhaodeMacBook-Pro:~ cuilinhao$ vim usb.sh

cd /Users/cuilinhao/Desktop/usbmuxd-1.0.8

python tcprelay.py -t 22:10010


• 使用: 命令行直接执行 sh usb.sh


五、 ios 脱壳

• 脱壳就是摘掉壳程序,加未加密的可执行文件还原出来,脱壳主要有2种方法:硬脱壳,动态脱壳
硬脱壳就是直接执行解密算法,动态脱壳,执行壳程序,将真实的内容解密出来,即热内存中的可执行文件是已经解密过的,则我们可以直接导出,由于手机程序比较复杂,ios 中常用的是硬脱壳。

• ios 中有很多好用的脱壳工具

• Clutch:

https://github.com/KJCracks/Clutch


• dumpdecrypted:

https://github.com/stefanesser/dumpdecrypted/

• class-dump
class-dump的作用就是把Mach-O文件的class信息给dump出来(把类信息给导出来),生成对应的.h头文件
官方网址:

http://stevenygard.com/projects/class-dump/

下载完工具包以后将class-dump文件复制到Mac的/usr/local/bin目录,这样在终端就能识别class-dump命令了
常用的格式:class-dump -H Mach-O文件路径 -o 头文件存放目录
ps: -H表示要生成头文件 -O用于制定头文件的存放目录
权限问题:

cuilinhaodeMacBook-Pro:脱壳 cuilinhao$ class-dump -H To-Do -o Headers

-bash: /usr/local/bin/class-dump: Permission denied

解决方法:在终端输入如下命令

cuilinhaodeMacBook-Pro:脱壳 cuilinhao$ chmod +x /usr/local/bin/class-dump


1)下载源代码,然后在源代码目录执行make指令进行编译,获得dylib动态库文件

2) 将dylib文件拷贝到iphone上,放到/var/root目录
3) 终端进入dylib所在的目录
4) 使用环境变量DYLD_INSERT_LIBARIES将dylib注入到需要脱壳的可执行文件(可执行文件路径可以通过ps -A查看获取)
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib + 可执行文件路径

5) 后缀.decrpted文件就是脱壳后的可执行文件,该文件在var/root路径下

6)检验一下是否脱壳成功

otool -l To-Do | grep crypt

cryptoff 16384

cycptsize 2490368

cryptid 0

通过查看cryptid字段为0,故脱壳成功。

7)导出头文件

class-dump -H To-Do -o Headers


MJAppTools 使用

1.下载

https://github.com/CoderMJLee/MJAppTools.git

2.放到Device/usr/bin目录下

3.如果权限不够则执行 chmod +x /usr/bin/MJAppTools


Zhanghua123:~ root# MJAppTools

-sh: /usr/bin/MJAppTools: Permission denied

Zhanghua123:~ root# chomd +x /usr/bin/MJAppTools

-sh: chomd: command not found

Zhanghua123:~ root# chmod +x /usr/bin/MJAppTools

Zhanghua123:~ root# MJAppTools

-l <regex> 列出用户安装的应用

-le <regex> 列出用户安装的加壳应用

-ld <regex> 列出用户安装的未加壳应用

-ls <regex> 列出系统的应用

1.因为该工具含有正则表达式,还可以指定查找

Zhanghua123:~ root# MJAppTools -l WeChat

# 一共1个应用

-----

# 01 【微信】 <com.tencent.xin>

/private/var/containers/Bundle/Application/D1F83FA2-BC91-4584-B459-4E1F926003BF/WeChat.app

/private/var/mobile/Containers/Data/Application/A8964D5A-0046-4C27-AFA1-37882F27F17F

Universal binary

arm_v7

arm_64

Zhanghua123:~ root#


七、 Reveal 安装

• Reveal 是一款调试ios程序UI界面的神器

• 官网: https://revealapp.com

• 下载: https://revealapp.com/download

• 破解版 https://pan.baidu.com/s/1lz9lwTKXD9bS8DnvT9gkBQ

提取密码:b31u

• 建议下载至少Reveal4版本,支持USB连接调试

• 调试环境配置

• iphone上安装Reveal Loader

• 软件源: http://apt.so/codermjlee,不要安装其他源的版本,有可能不支持新版Reveal

• 安装完Reveal Loader后,打开[设置], 选择需要调试的APP

• 找到Mac的Reveal中RevealServer文件,覆盖iphone的/Library/RHRevealLoader/RevealServer文件

• ps: 在iPhone上没有RHRevealLoader文件夹,可以自己创建

• 重启SpringBoard

Zhanghua123:~ root# killall SpringBoard


八、Hopper 安装

• 百度下载安装

九、安装theos

• Theos是一个越狱开发工具包,Theos是越狱开发工具的首先,这个工具是为了后面对逆向的app进行代码编写使用。后面再讲tweak时会说到。


一、 安装签名工具ldid


• 先确保安装了brew, 点我

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"


• 利用brew 安装ldid

brew install ldid


二、 修改环境变量

• 编辑用户的配置文件

vim ~/.bash_profile


• 在.bash_profile 文件后面加入以下2行

vim ~/.bash_profile


• 让.bash_profile配置的环境变量立即生效

vim ~/.bash_profile


三、 下载theos

• 建议在$THEOS目录下载代码(就是上面配置的~/theos目录)

git clone --recursive https://github.com/theos/theos.git $THEOS

使用Theos来创建一个使用工具,并进行编译,编译后安装到我们的越狱手机上,使用theos目录中bin下的nic.pl命令,在执行nic.pl命令后,会让你选择新建工程的模板。目前theos中内置的是12套模板,创建tweak,那么就选11即可,编译完成后,我们要将项目进行打包,这样我们的越狱设备才能进行安装。
cd 到一个存放项目代码的文件夹。


四、 新建tweak项目

• iOS越狱开发中,各种破解补丁的统称为Tweak,通常意义上我们说的越狱开发,都是指开发一个Tweak.


基本上,tweak都依赖于一个名叫cydia Substrate (以前名字也叫mobile Substrate)的动态库,Mobile Substrate是Cydia的作者Jay Freeman (@saurik)的作品,也叫Cydia Substrate,它的主要功能是hook某个App,修改代码比如替换其中方法的实现,Cydia上的tweak都是基于Mobile Substrate实现的.


iOS的tweak开发可以有两种发布方式。一种是只能在越狱设备上安装的打包成deb格式的安装包,另一种是直接使用开发者自己的证书/企业证书直接将补丁打包成ipa,这样不需要越狱也是可以安装的,只是这种非越狱的限制比较大,通常只是用来给某个app打个补丁或者类似的功能啥的。


• tweak的实质就是ios平台的动态库。IOS平台上有两种形势的动态库,dylib与framework。Framework这种开发者用的比较多,而dylib这种就相对比较少一点,比如libsqlite.dylib,libz.dylib等。而tweak用的正是dylib这种形势的动态库。我们可以在设备的/Library/MobileSubstrate/DynamicLibraries

目录下查看手机上存在着的所有tweak。这个目录下除dylib外还存在着plist与bundle两种格式的文件,plist文件是用来标识该tweak的作用范围,而bundle是tweak所用到的资源文件

cd ~/Desktop

nic.pl


选择 iphone/tweak

填写项目信息
Project Name

项目名称

Package Name

项目ID (随便写)

Author/Maintainer Name
作者, 直接敲回车按照默认

[iphone/tweak] MobileSubstrate Bundle filter
需要修改APP的Bundle Identifier (喜马拉雅的是com.gemd.iting )
可以通过Cycript 查看APP 的Bundle Identifier
[iphone/tweak] List of applications to terminate upon installation
直接敲回车就可以

Project Name (required): ting_tweak

Package Name [com.yourcompany.ting_tweak]: com.mj.ting

Author/Maintainer Name [MJ Lee]:

[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:

com.gemd.iting

[iphone/tweak] List of applications to terminate upon installation (space-

separated, '-' for none) [SpringBoard]:

Instantiating iphone/tweak in ting_tweak/...

Done.

五、编辑Makefile
* 该文件类似于配置文件,用来指定工程用到的文件、框架、库、使用的SDK等等,将整个编译、打包、安装的过程进行自动化,在前面加入环境变量, 写清楚通过那个ip和端口访问手机
THEOS_DEVICE_IP THEOS_DEVICE_PORT

export THEOS_DEVICE_IP=127.0.0.1

export THEOS_DEVICE_PORT=10010

include $(THEOS)/makefiles/common.mk

TWEAK_NAME = ting_tweak

ting_tweak_FILES = Tweak.xm

include $(THEOS_MAKE_PATH)/tweak.mk

after-install::

install.exec "killall -9 SpringBoard"


如果不希望每个项目的Makefile都编写环境变量,也可以添加到用户配置文件中,编辑完毕之后 source ~/.bash_profile 让配置生效

$ vim ~/.bash_profile

export THEOS=~/theos

export PATH=$THEOS/bin:$PATH

export THEOS_DEVICE_IP=127.0.0.1

export THEOS_DEVICE_PORT=10010

$ source ~/.bash_profile

安装完成之后

cuilinhaodeMacBook-Pro:~ cuilinhao$ cd theos/

cuilinhaodeMacBook-Pro:theos cuilinhao$ ls

LICENSE.md bin lib package.json toolchain

Prefix.pch extras makefiles sdks vendor

README.md include mod templates

cuilinhaodeMacBook-Pro:theos cuilinhao$ ls -l

total 96

-rw-r--r-- 1 cuilinhao staff 35367 4 26 10:04 LICENSE.md

-rw-r--r-- 1 cuilinhao staff 754 4 26 10:04 Prefix.pch

-rw-r--r-- 1 cuilinhao staff 829 4 26 10:04 README.md

drwxr-xr-x 19 cuilinhao staff 608 4 26 10:04 bin

drwxr-xr-x 3 cuilinhao staff 96 4 26 10:04 extras

drwxr-xr-x 3 cuilinhao staff 96 4 26 10:04 include

drwxr-xr-x 3 cuilinhao staff 96 4 26 10:04 lib

drwxr-xr-x 25 cuilinhao staff 800 4 26 10:04 makefiles

drwxr-xr-x 3 cuilinhao staff 96 4 26 10:04 mod

-rw-r--r-- 1 cuilinhao staff 655 4 26 10:04 package.json

drwxr-xr-x 3 cuilinhao staff 96 4 26 10:04 sdks

drwxr-xr-x 3 cuilinhao staff 96 4 26 10:04 templates

drwxr-xr-x 3 cuilinhao staff 96 4 26 10:04 toolchain

drwxr-xr-x 7 cuilinhao staff 224 4 26 10:04 vendor


进入bin 进行查看

cuilinhaodeMacBook-Pro:theos cuilinhao$ cd bin

cuilinhaodeMacBook-Pro:bin cuilinhao$ ls -l

total 80

-rwxr-xr-x 1 cuilinhao staff 491 4 26 10:04 deb_build_num.sh

lrwxr-xr-x 1 cuilinhao staff 29 4 26 10:04 denicify.pl -> ../vendor/nic/bin/denicify.pl

lrwxr-xr-x 1 cuilinhao staff 21 4 26 10:04 dm.pl -> ../vendor/dm.pl/dm.pl

-rwxr-xr-x 1 cuilinhao staff 892 4 26 10:04 fakeroot.sh

-rwxr-xr-x 1 cuilinhao staff 148 4 26 10:04 install.copyFile

-rwxr-xr-x 1 cuilinhao staff 313 4 26 10:04 install.exec

-rwxr-xr-x 1 cuilinhao staff 213 4 26 10:04 install.mergeDir

lrwxr-xr-x 1 cuilinhao staff 29 4 26 10:04 logify.pl -> ../vendor/logos/bin/logify.pl

lrwxr-xr-x 1 cuilinhao staff 28 4 26 10:04 logos.pl -> ../vendor/logos/bin/logos.pl

lrwxr-xr-x 1 cuilinhao staff 24 4 26 10:04 nic.pl -> ../vendor/nic/bin/nic.pl

lrwxr-xr-x 1 cuilinhao staff 27 4 26 10:04 nicify.pl -> ../vendor/nic/bin/nicify.pl

-rwxr-xr-x 1 cuilinhao staff 980 4 26 10:04 package_version.sh

-rwxr-xr-x 1 cuilinhao staff 801 4 26 10:04 post-update

-rwxr-xr-x 1 cuilinhao staff 437 4 26 10:04 target.pl

lrwxr-xr-x 1 cuilinhao staff 12 4 26 10:04 update-git-repo -> update-theos

-rwxr-xr-x 1 cuilinhao staff 1030 4 26 10:04 update-theos

-rwxr-xr-x 1 cuilinhao staff 552 4 26 10:04 vercmp.pl

cuilinhaodeMacBook-Pro:bin cuilinhao$

配置路径,使nic.pl 让在任何地方访问到
在cuilinhaodeMacBook-Pro:~ cuilinhao\(下
ls -alvim .bash_profile
: 表示路径是并行的。
\)PATH 是引用环境变量的值
PATH = ~/theos/bin:$PATH

export THEOS=~/theos

export PATH=$THEOS/bin:$PATH

配置完之后查看

cuilinhaodeMacBook-Pro:~ cuilinhao$ echo $PATH

/Users/cuilinhao/.rvm/gems/ruby-2.2.2/bin:/Users/cuilinhao/.rvm/gems/ruby-2.2.2@global/bin:/Users/cuilinhao/.rvm/rubies/ruby-2.2.2/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/cuilinhao/.rvm/bin

cuilinhaodeMacBook-Pro:~ cuilinhao$


ps: 如果配置完之后,还没有出现路径,执行命令 source .bash_profile 使路径生效


* 参考:http://3code.info/blog/2016/11/2_Theos_-install&run.html


六、编写代码
下方就是在Tweak.xm中的所有代码。是Logos语法,使用起来是比较简单的。%hook与%end成对出现,%hook后方跟的是我们要修改的类名
打开tweak.xm 文件

%hook SBIconParallaxBadgeView

- (id)init

{

return nil;

}

%end


七、 编译-打包-安装
* 编译

make


• 打包成deb

make package


• 安装(默认会自动重启Springboard)

make install


八、可能遇到的问题
1. -make package的错误

Can't locate IO/Compress/Lzma.pm in @INC (you may need to install the

IO::Compress::Lzma module) (@INC contains: /Library/Perl/5.18/darwin-

thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-

thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.2

/System/Library/Perl/5.18/darwin-thread-multi-2level

/System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-

multi-2level /System/Library/Perl/Extras/5.18 .) at

/Users/mj/theos/bin/dm.pl line 12.

BEGIN failed--compilation aborted at /Users/mj/theos/bin/dm.pl line 12.

make: *** [internal-package] Error 2


• 错误是因为打包压缩方式有问题,改成gzip压缩就可以了

• 修改dm.pl 文件,用#号注释掉下面两句

vim $THEOS/vendor/dm.pl/dm.pl

#use IO::Compress::Lzma;

#use IO::Compress::Xz;


• 修改deb.mk 文件第6行的压缩方式为gzp

vim $THEOS/makefiles/package/deb.mk

_THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= gzip


2 -make 错误

Error: You do not have an SDK in

/Library/Developer/CommandLineTools/Platforms/iPhoneOS.platform/Developer/SDKs


• 是因为xcode 导致路径(有可能安装了好几个xcode),需要指定一下xcode

sudo xcode-select --switch

/Applications/Xcode.app/Contents/Developer/


1. 在make是出现Nothing

> Making all for tweak xxx...

make[2]: Nothing to be done for `internal-library-compile'.


• 是因为之前已经编译过,有缓存导致的,clean一下即可

make clean

make


转载于:https://juejin.im/post/5ce74fe05188250fa51ab1c0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark Streaming 和 Flink 都是流处理框架,但在一些方面有所不同。 1. 数据处理模型 Spark Streaming 基于批处理模型,将流数据分成一批批进行处理。而 Flink 则是基于流处理模型,可以实时处理数据流。 2. 窗口处理 Spark Streaming 的窗口处理是基于时间的,即将一段时间内的数据作为一个窗口进行处理。而 Flink 的窗口处理可以基于时间和数据量,可以更加灵活地进行窗口处理。 3. 状态管理 Spark Streaming 的状态管理是基于 RDD 的,需要将状态存储在内存中。而 Flink 的状态管理是基于内存和磁盘的,可以更加灵活地管理状态。 4. 容错性 Flink 的容错性比 Spark Streaming 更加强大,可以在节点故障时快速恢复,而 Spark Streaming 则需要重新计算整个批次的数据。 总的来说,Flink 在流处理方面更加强大和灵活,而 Spark Streaming 则更适合批处理和数据仓库等场景。 ### 回答2: Spark Streaming 和 Flink 都是流处理框架,它们都支持低延迟的流处理和高吞吐量的批处理。但是,它们在处理数据流的方式和性能上有许多不同之处。下面是它们的详细比较: 1. 处理模型 Spark Streaming 采用离散化流处理模型(DPM),将长周期的数据流划分为离散化的小批量,每个批次的数据被存储在 RDD 中进行处理,因此 Spark Streaming 具有较好的容错性和可靠性。而 Flink 采用连续流处理模型(CPM),能够在其流处理过程中进行事件时间处理和状态管理,因此 Flink 更适合处理需要精确时间戳和状态管理的应用场景。 2. 数据延迟 Spark Streaming 在处理数据流时会有一定的延迟,主要是由于对数据进行缓存和离散化处理的原因。而 Flink 的数据延迟比 Spark Streaming 更低,因为 Flink 的数据处理和计算过程是实时进行的,不需要缓存和离散化处理。 3. 机器资源和负载均衡 Spark Streaming 采用了 Spark 的机器资源调度和负载均衡机制,它们之间具有相同的容错和资源管理特性。而 Flink 使用 Yarn 和 Mesos 等分布式计算框架进行机器资源调度和负载均衡,因此 Flink 在大规模集群上的性能表现更好。 4. 数据窗口处理 Spark Streaming 提供了滑动、翻转和窗口操作等灵活的数据窗口处理功能,可以使用户更好地控制数据处理的逻辑。而 Flink 也提供了滚动窗口和滑动窗口处理功能,但相对于 Spark Streaming 更加灵活,可以在事件时间和处理时间上进行窗口处理,并且支持增量聚合和全量聚合两种方式。 5. 集成生态系统 Spark Streaming 作为 Apache Spark 的一部分,可以充分利用 Spark 的分布式计算和批处理生态系统,并且支持许多不同类型的数据源,包括Kafka、Flume和HDFS等。而 Flink 提供了完整的流处理生态系统,包括流SQL查询、流机器学习和流图形处理等功能,能够灵活地适应不同的业务场景。 总之,Spark Streaming 和 Flink 都是出色的流处理框架,在不同的场景下都能够发挥出很好的性能。选择哪种框架取决于实际需求和业务场景。 ### 回答3: Spark Streaming和Flink都是流处理引擎,但它们的设计和实现方式有所不同。在下面的对比中,我们将比较这两种流处理引擎的主要特点和差异。 1. 处理模型 Spark Streaming采用离散流处理模型,即将数据按时间间隔分割成一批一批数据进行处理。这种方式可以使得Spark Streaming具有高吞吐量和低延迟,但也会导致数据处理的粒度比较粗,难以应对大量实时事件的高吞吐量。 相比之下,Flink采用连续流处理模型,即数据的处理是连续的、实时的。与Spark Streaming不同,Flink的流处理引擎能够应对各种不同的实时场景。Flink的实时流处理能力更强,因此在某些特定的场景下,它的性能可能比Spark Streaming更好。 2. 窗口计算 Spark Streaming内置了许多的窗口计算支持,如滑动窗口、滚动窗口,但支持的窗口计算的灵活性较低,只适合于一些简单的窗口计算。而Flink的窗口计算支持非常灵活,可以支持任意窗口大小或滑动跨度。 3. 数据库支持 在处理大数据时,存储和读取数据是非常重要的。Spark Streaming通常使用HDFS作为其数据存储底层的系统。而Flink支持许多不同的数据存储形式,包括HDFS,以及许多其他开源和商业的数据存储,如Kafka、Cassandra和Elasticsearch等。 4. 处理性能 Spark Streaming的性能比Flink慢一些,尤其是在特定的情况下,例如在处理高吞吐量的数据时,在某些情况下可能受制于分批处理的架构。Flink通过其流处理模型和不同的调度器和优化器来支持更高效的实时数据处理。 5. 生态系统 Spark有着庞大的生态系统,具有成熟的ML库、图处理库、SQL框架等等。而Flink的生态系统相对较小,但它正在不断地发展壮大。 6. 规模性 Spark Streaming适用于规模小且不太复杂的项目。而Flink可扩展性更好,适用于更大、更复杂的项目。Flink也可以处理无限制的数据流。 综上所述,Spark Streaming和Flink都是流处理引擎,它们有各自的优缺点。在选择使用哪一个流处理引擎时,需要根据实际业务场景和需求进行选择。如果你的业务场景较为复杂,需要处理海量数据并且需要比较灵活的窗口计算支持,那么Flink可能是更好的选择;如果你只需要简单的流处理和一些通用的窗口计算,Spark Streaming是更为简单的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值