Widevine DRM介绍

转载:https://blog.csdn.net/beautyfuel/article/details/56277988

感谢他的整理,我这里就是一个copy。

DRM in Android

DRM,英文全称为Digital Rights Management,译为数字版权管理。它是目前业界使用非常广泛的一种数字内容版权保护技术。随着知识产权保护受重视的程度日益提高,快速攻城略地得Android智能手机是如何利用DRM来有效保护数字版权的呢?本文将通过剖析Android中的DRM框架以及相关工作流程来向读者揭示DRM的神秘面纱。

一  DRM架构介绍

严格来讲,DRM不是一项技术,而是一类技术。很多机构和联盟都提出过相应的DRM标准[1]。例如Open Mobile Alliance推出的OMA DRM、Marlin Developer Community提出的Marlin DRM,而Google则通过收购Widevine公司推出了Widevine DRM。

从Android智能终端来看,Google的原生Android(Android Open Source Project,简称AOSP)系统仅仅集成了OMA DRM V1的一部分功能,它远未构成一个完整的DRM解决方案。在这种情况下,设备厂商只能根据情况选择合适的DRM解决方案并集成到Android平台中来。例如,手机厂商可以通过Google的授权以获取Widevine DRM对应的软件包从而将Widevine DRM集成到自己的产品中。

为了方便设备厂商的集成,Android设计了一个通用的DRM软件框架,不同的DRM解决方案可通过Plugin的方式集成到Android系统中。图1所示为Android中的DRM软件架构。

图1  Android中DRM软件架构

由图1可知:

  • DRM Framework API模块是Framework层暴露给App的接口。该模块中最主要的类是DrmManagerClient。
  • DRM Framework API模块通过Binder机制和位于drmserver进程(以Android 4.1为例,drmserver的代码位于framework/av/drm/drmserver)中的DRM Manager模块通信。DRM Manager加载并管理系统中所有的DRM插件。
  • DRM Plugins是真正实现权限管理、数字内容解密等工作的模块。根据DRM标准的不同,这些Plugins的实现亦不相同。另外,一个手机可能会集成多个DRM Plugin。这是因为媒体文件如果采用不同的DRM解决方案进行加密的话,手机在播放它们时,DRM Manager需找到对应的DRM Plugin以进行解密。

图2所示为DRM架构中几个重要的类及其关系。

图2  Android中DRM架构中重要类图

由图2可知:

  • FileSource代表一个媒体文件。如果媒体文件中有DRM信息,它将创建一个DrmManagerClient对象。该对象用于处理媒体文件中和DRM相关的操作。DrmManagerClient内部通过DrmManagerClientImpl和位于drmserver进程中的DrmManagerService进行跨Binder通信。
  • MediaExtractor类封装了用于解析媒体文件中元数据的相关函数。对于DRM来说,系统会根据的DRM种类创建不同的MediaExtractor子类。和FileSource类似,MediaExtractor也通过DrmManagerClient和drmserver通信。
  • DrmManagerService运行于drmserver进程中,它是整个DRM框架的核心。DrmManagerService借助DrmManager管理系统中的DRM插件。
  • DRM插件必须实现IDrmEngine接口。为了方便开发者,Android提供了DrmEngineBase类,该类继承了IDrmEngine接口并实现了一些通用的接口函数。这样,DRM Plugin只需要从DrmEngineBase派生即可。
  • 如前文所述,DRM框架中真正完成DRM处理工作的是DRMPlugins,这些Plugins大都需要得到相关机构的授权后才能得到相应的专利代码包。图1中列出了三个DRM Plugin。其中FwdLockEngine(OMA-V1的Forward Lock)由AOSP提供。Marlin Plugin和WidevinePlugin则需要相关DRM机构提供专利代码包。

下面来看看Android中DRM的工作流程。

二  DRM工作流程介绍

2.1  DrmManagerService的初始化

DRM的工作流程和多媒体播放密切相关。首先来了解一下DrmManagerService的创建过程,相关流程如图3所示:

图3  DrmManagerService启动流程

由图3可知:

  • DrmManagerService实例对象由drmserver进程在main函数中调用instantiate创建。
  • DrmManagerService内部会创建一个DrmManager实例对象并调用loadPlugins来加载设备可能提供的DRM Plugin。DRM Plugin通过动态库的方式集成到设置中去。Android 4.1中有两个目录可存放DRM Plugin。一个是/vendor/lib/drm/,例如Widevine对应的libdrmwvmplugin.so一般放在这个目录中。另一个目录是/system/lib/drm/。每一个DRM Plugin对应为一个IDrmManager实例。所有被加载的DRM Plugin由DrmManager来统一管理。
  • DrmManagerService最后将通过addService把自己注册到Binder系统中以为广大客户端服务。

下面来介绍DRM的工作流程。Android支持的DRM播放方式分为两种:

  • 一种是基于基本码流的(Elementary Stream Based,简称ES Based)播放方式。目前Widevine DRM、Marline DRM都属于这一种类型。
  • 另一种是基于容器的(Container Base)播放方式,目前OMA DRM支持这种方法。

这两种不同的方式在播放流程上不尽相同。下文将以一个播放具有DRM保护的MP4文件为例,介绍DRM的工作流程。首先来看ES BasedDRM媒体播放工作流程

2.2  ES BasedDRM播放流程

ES Based DRM意味着每一个数据基元在播放时都需要解密。这种DRM的媒体文件或流可以使用普通方式正常读取,但读取出来的数据是经过加密的。如果不能对数据正确解密,那么该数据将无法正常播放。

在播放媒体文件之前,播放器首先要识别该文件是否被DRM保护。如果受DRM保护的话,还行初始化对应的DRM插件。这部分工作所涉及的流程如图4所示:

图4  ES BasedDRM插件初始化

由图4可知:

  • MediaExtractor首先通过sniff函数检查媒体内容的类型,然后创建相应的Extractor来分析数据。在DRM检查开启的情况下,SniffDRM函数就会被用来检查文件是否有DRM控制。
  • SniffDRM将调用DataSource中的DrmInitialization函数,从而在DataSource中创建一个DrmManagerClient实例。如此,MediaExtractor就将DataSource与DrmManagerService联系起来。
  • DrmInitialization函数非常重要,其主要工作包括:

(1)调用openDecryptSession,该函数内部会根据文件中的DRM信息来初始化正确的DRM Plugin(Widevine、OMV,还是其他DRM类型)。

(2)创建DecryptSession,并将DRM信息封装在DecryptHandler实例中传给FileSource。

  • DrmInitialization之后,SniffDRM会通过DecryptHandler来判断该文件是否有DRM控制,并分析出该DRM是ES Based,还是Container Based。如果属于ES Based DRM,MediaExtractor会创建一个DRMExtrator,而在DRMExtrator中,会创建一个MPEG4Extractor。

MediaExtrator创建完后,播放器即可开始播放。ES Based DRM播放相关流程如图5所示:

图5  ES Based的DRM媒体文件播放流程

图5所示的流程图可分为三个阶段:

  • 第一个阶段是资源初始化过程。该过程中,媒体播放器将通过getTrack以后获取一个媒体文件中代表媒体数据的DRMSource实例,DRMSource只负责DRM的控制和解密,而实际媒体数据的分析仍交给MPEG4Extractor来完成。对于播放器来说,它只和DRMExtrator和DRMSource交互。另外,在这一阶段中,initializeDecryptUnit函数将初始化解密相关的资源。
  • 第二阶段就是媒体数据读取,针对每一个数据基元,DRMExtrator都会先通过MPEG4Extractor取得未解密的原始数据,然后通过decrypt函数来请求DRM Plugin进行解密。解密后的数据会被放到另外一处缓存中供Codec使用。如果解密失败,decrypt将会返回错误,故播放器将无法解析这些数据。
  • 媒体播放完毕后将释放播放资源。和DRM相关的资源将由finalizeDecryptUnit来释放。

回顾上述流程,对ES Based DRM的特点是,不论用户是否有权限,播放器都能读取到媒体数据。

下面来看看Container Based DRM的播放流程。

2.3  Container Based DRM播放流程

和ES Based DRM截然不同的是Container Based DRM。受控于这种DRM管理的媒体文件在被读取时就会进行DRM的权限验证,如果验证失败,则无法从中读取到数据。故Container Based DRM最关键的是其pread接口,相关流程如图6所示:

图6  ContainerBasedDRM播放流程图

如图6可知:

  • 首先要进行的工作仍是判别数据格式和DRM类型并创建DrmManagerClient。这一过程和ES Based DRM流程相同,此处不拟赘述。
  • 接下来需创建MediaExtractor实例。与ES Based DRM不同的是,Container Based DRM在播放时无需创建DRMExtractor,而是直接创建MPEG4Extractor,并在该MediaExtractor中设定DRM的标识。
  • Container Based DRM关键在于pread函数。当MediaExtractor从FileSource中提取数据时,readAt最终通过DrmManagerClient的pread函数来访问DrmManager以从中读取数据。DrmManager将调用具体的DRMPlugin实现的pread。数据的权限检查和解密的工作都在该DRMPlugin完成。如果DRM解密失败,pread将不会得到数据。

上文介绍了Android平台中DRM播放的大体流程。下面来看看Google主推的Widevine DRM。

三  Widevine DRM介绍

2010年12月,Google不惜重金将视频数字版权管理软件公司Widevine招安。现在看来,Google的这一招为Android阵营增添了一员上将,有Widevine坐阵中军,Android就有实力在数字内容这片战场上与已故乔帮主的苹果一较高下。

在收购Widevine之前,Android没有系统的数字版权保护机制,而苹果则在iTunes、iPod时代就建立了完善的版权体系,这让很多内容提供商更愿意在iOS上发布自己的数字内容,从而使得iOS的生态系统更加丰富和成熟。Widevine的引入弥补了Android在这方面的短板,它是帮助Android成为当今移动OS霸主的功臣之一。

Android从3.0开始就支持Widevine,这距离Google收购Widevine仅仅过去了三个月,可见Google对于数字版权保护的迫切性。现在Widevine已经成为GMS(Google Mobile Service)中必备的内容,所有想要得到GMS的手机厂商,都需要根据GMS的要求搭载Widevine。

作为Google帐下的爱将,Google为支持Widevine也煞费苦心。目前Android平台中播放Widevine DRM媒体有两种方法:

  • 第一种方法和前文介绍的一样。Widevine DRM按照ES Based的流程进行播放。但和一般DRM不同的是,Widevine使用的Extractor是WVMExtractor,而不是DRMExtractor。
  • 第二种方法是MediaCodec模式,相关结构如图7所示。

图7  Widevine Crypto Plugin

由图7可知:

  • MediaCodec、MediaCrypto以Java API的形式直接暴露给应用层。这样,应用层能够控制解码、解密的过程。
  • Crypto Plugin是实际完成解密的模块,其结构和前文提到的DRM Plugin有所不同。

需要特别指出的是,Android目前对MediaCodec模式支持还不是很完善。根据笔者的试验,一些市面上流行的高端Android 4.1手机还不支持这种播放方式。

另外,Widevine的代码结构大体可分为三部分:

  • 第一部分是Android中的基本框架,包括WVMExtractor等。这部分代码在AOSP中都可以看到,属于Open Source的内容。这部分代码大多没有实质性内容,相关功能的实现封装在第二部分的专利代码包中。
  • 第二部分是Widevine的专利代码包。这部分代码需要得到Google授权后才能得到。该包提供了很多Widevine专用库用于完成Widevine DRM权限检查和解密。同时,它还提供了一些Sample App用于测试。
  • 第三部分是手机厂商自身的安全认证。Widevine是一个很强的版权控制体系,它甚至可在硬件层与厂商的安全机制绑定。很多知名的手机厂商都在boot等底层中加入自己的安全机制,只有通过可信赖的boot loader进行刷机才能得到具有正常权限的手机软件,并可以使用Widevine。这也是为什么很多破解的手机无法使用Widevine的原因。

Widevine DRM介绍相关推荐

  1. Google Widevine DRM 逆向破解原理

    本人业余爱好,文章写的不够完善望大佬指导,轻喷哦,我会努力学习~ 一.介绍 Google Widevine DRM 是谷歌旗下数字版权加密(DRM)解决方案,于2010年收购Widevine!Wide ...

  2. Linux中的DRM 介绍

    Linux中的DRM 如果在搜索引擎离搜索 DRM 映入眼帘的尽是Digital Rights Managemen,也就是数字版权加密保护技术. 这当然不是我们想要的解释.在类unix世界中还有一个D ...

  3. MTK DRM常见问题介绍

    [DESCRIPTION] 主要介绍mtk支持的DRM Widevine Level; WV与DRM feature option的开关;play movies play videos popups  ...

  4. 深入理解 DRM (1) --了解Widevine与OEMCrypto

    基本术语定义 Device Id 以空结尾的唯一标识设备的C字符串.最大32个字符,包括NULL终止. Device Key 由Widevine分配的128位AES密钥,用于保护授权. Keybox ...

  5. Linux中的DRM、DRI、DMA 介绍

    DRM(Direct Rendering Manager)(直接渲染管理器) DRI(Direct Rendering Infrastructure)(直接渲染基件) DMA (Direct Memo ...

  6. MTK支持的DRM简介

    一.DRM 基本信息: 1.MTK支持的DRM类型 a.OMA DRM V1.0 (Open Mobile Alliance) DRM b.Widevine(Google Widevine) L32. ...

  7. 看清OMA DRM文件的本质

    Forward Lock Combined Delivery Seperate Delivery DRM 文件的制作 Android中DRM代码结构 DRM即digital right managem ...

  8. DRM标准学习笔记1

    1. 缘起 旱就听说过DRM,但一直不知道具体的详细内容及实现,现在终于要用到它了,所以做了一个系统的了解及学习. 2. 技术方案(标准) 数字版权管理DRM技术是通过一定的安全算法/协议与安全管理手 ...

  9. virtio-gpu介绍

    背景: 显卡的提升在虚拟化场景下一直是一个难以解决的问题.目前qemu中提供的显卡有2种 一种是cirrus显卡,一种是vga显卡.这两种显卡都是通过qemu来进行模拟的,也仅仅达到了能够让虚拟机使用 ...

  10. Linux驱动开发之DRM驱动

    作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 Linux DRM Gr ...

最新文章

  1. Android提供的LruCache类简介
  2. mybatis框架中的queryWrapper的or查询,联想到MySQL中and 和or的关系
  3. Magento安装后无法访问
  4. vs2017 cmake android,CMake构建VS2017工程
  5. 程序员面试金典——18.4 2的个数
  6. 【深度学习基础】张量的描述与深度学习常见张量
  7. 文件系统 和 网络附接存储(NAS: Network Attached Storage)
  8. BZOJ4033 [HAOI2015]树上染色 【树形dp】
  9. 如何去实现java与数据库的连接
  10. Java从入门到精通(视频教程+源码)
  11. displayTag使用详解
  12. unity如何实现图片透视_unity 中是如何实现游戏人物换装的
  13. osg-04-基本几何图元-线宽
  14. compare的数组升序和降序
  15. WAMP Apache 配置 Perl
  16. POJ 1625 Censored! (AC自己主动机 + 高精度 + DP)
  17. 手持天馈线测试仪基站测试分析专家
  18. java andequal_Java equals 和 == 完全解析
  19. 赛效:使用视频剪辑工具秀多多怎么在视频中加箭头?
  20. 集成公告|Moonbeam宣布与ShowMe集成

热门文章

  1. Xprinter XP-N160L 打印机驱动
  2. Eviews10.0下载与安装
  3. matlab根据数值大小聚类,[matlab聚类分析]请教高手:用matlab做聚类分析,节点数多于30个怎么画聚类图啊?...
  4. 谷歌离线地图WMS/WMTS服务
  5. 4款U盘随身操作系统推荐
  6. 【原】从一个bug浅谈YUI3组件的资源加载
  7. 【暗恋不可耻但无用】QQ空间爬虫-Java版(jzone-crawler)
  8. 网络安全知识点(全)
  9. 安装NVIDIA显卡驱动
  10. 网友发给我一个钓鱼网站,我用 Python 渗透了该网站所有信息