drm android 工作原理,[原创]某DRM解密流程简单分析

本文介绍了Android环境下DRM(数字版权管理)视频播放的解密流程,通过动态调试分析了一个播放器的.so库。解密步骤包括验证视频头中的‘XDRM’标志,解码base64密钥,使用固定字符串解密,读取V3.lic文件,查找特定base64字符串,AES解密,计算SHA1校验值等。整个过程涉及base64解码、RC4、AES等加密算法,确保视频内容的安全性。
摘要由CSDN通过智能技术生成

环境及工具

手机        :小米手机 MI 2A

系统版本: Android 4.1.1

工具        : IDA pro 6.6 、C32Asm 、VS2005

帮朋友写了一个解密DRM视频的小软件,我把分析该播放器的调试步骤记录下来与大家一起学习,高手莫要见笑,仅供小菜玩乐,有不对或不足的地方还请多多指教,不胜感激!

一:第一次打开加密视频会出现如下验证:

32e4eb1d30a0f33d1cd07c0409c9ccd5.png

输入用户名与密码登录成功后如下图

101fa77d79e0d7166a8336f024966294.png

点击“支付并获取许可证”成功后就可以播放加密的视频了,并在安装包目录下生成了两个重要的文件,indiv3.key与V3.lic。

二:加密后视频大致结构如下:

35d480fa76cc122de6f4599f0eb9fad7.png

1.        加密视频头中有加密标志,密钥等信息。

2.        32字节检验码是判断视频是否有被篡改。

3.        WMA文件的头16个字节是固定的,为十六进制的“30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C”,用来标识这个是否为WMA文件。

4.        接下来的8个字节为一个整数,表示整个WMA文件头部的大小,(定位到加密数时会用到)。

三:动态调试播放器分析解密流程,分为如下步骤。

通过反编译分析APK包发现主要逻辑是在.so中实现的,所以我们主要是调试分析.so。

第1步:运行播放器,调试器附加上,对如下函数时行下断点:

open_stream

demux_open

av_base64_decode

av_sha_init

av_rc4_init

av_aes_init

第2步:F9运行,打开一个加密的视频程序,断在open_stream函数,打开成功后接着来到demux_open函数,这一步中主要是做打开并读取加密视频头0x800字节并判断是否有"XDRM" "SIGN"标志。

libmplayer.so:5EB594C4

libmplayer.so:5EB594C4 loc_5EB594C4 ; CODE XREF: sub_5EB5922C+93Cj

libmplayer.so:5EB594C4 LDR LR, =(aHarrydebug6666 - 0x5EB594D8)

libmplayer.so:5EB594C8 MOV R0, #1

libmplayer.so:5EB594CC MOV R1, #0

libmplayer.so:5EB594D0 ADD R2, PC, LR ; "harrydebug6666.\n"

libmplayer.so:5EB594D4 BL mp_msg

libmplayer.so:5EB594D8 LDRB R2, [SP,#0xDF0+var_D10]

libmplayer.so:5EB594DC CMP R2, #'X' ; 判断是否有XDRM头标志

libmplayer.so:5EB594E0 BEQ loc_5EB5995C

libmplayer.so:5EB5995C loc_5EB5995C ; CODE XREF: sub_5EB5922C+2B4j

libmplayer.so:5EB5995C LDRB R0, [SP,#0xDF0+var_D0F]

libmplayer.so:5EB59960 CMP R0, #'D'

libmplayer.so:5EB59964 BNE loc_5EB594E4

libmplayer.so:5EB59968 LDRB R3, [SP,#0xDF0+var_D0E]

libmplayer.so:5EB5996C CMP R3, #'R'

libmplayer.so:5EB59970 BNE loc_5EB594E4

libmplayer.so:5EB59974 LDRB R1, [SP,#0xDF0+var_D0D]

libmplayer.so:5EB59978 CMP R1, #'M'

libmplayer.so:5EB5997C BNE loc_5EB594E4

第3步:解码加密视频头文件中的base64字符(yJ3pPh4RItrcgckEtqjS+Q==)

libmplayer.so:5EB5A704 STRB R6, [R4],#1

libmplayer.so:5EB5A708 BL av_base64_decode ; 解码yJ3pPh4RItrcgckEtqjS+Q==

解码后为:

C8 9D E9 3E 1E 11 22 DA DC 81 C9 04 B6 A8 D2 F9

第4步:rc4解密“第3步“得到的值。

密钥为固定的一个字符串: Tiasfy!!

解密前:

C8 9D E9 3E 1E 11 22 DA DC 81 C9 04 B6 A8 D2 F9

解密后:

65 35 30 65 66 63 65 31 33 36 63 35 34 31 38 38(字符形式e50efce136c54188)

第5步:拷贝加密视频中的加密头下面32字节sha1值,后面做检验用。

39 34 53 B6 DE B8 AF B9 D7 2B 14 25 85 1C B9 D2

D2 79 B3 B2 28 B7 BA 82 F0 49 07 9E 71 6A 5E BF

第6步:打开并读取/data/data/com.huplayer.neon/files/V3.lic文件。

libmplayer.so:5EB5ABB0 ADD R1, PC, R4 ; unk_5F591AD4

libmplayer.so:5EB5ABB4 BL fopen ;打开/data/data/com.huplayer.neon/files/V3.lic

libmplayer.so:5EB5ABB8 SUBS R5, R0, #0

libmplayer.so:5EB5ABBC BEQ loc_5EB5BE04

libmplayer.so:5EB5ABC0 LDR R4, =(aHarrydebug805_ - 0x5EB5ABD8)

libmplayer.so:5EB5ABC4 MOV R0, R8

libmplayer.so:5EB5ABC8 BL free

libmplayer.so:5EB5ABCC MOV R0, #1

libmplayer.so:5EB5ABD0 ADD R2, PC, R4 ; "harrydebug805.\n"

libmplayer.so:5EB5ABD4 MOV R1, R6

libmplayer.so:5EB5ABD8 BL mp_msg

libmplayer.so:5EB5ABDC MOV R1, R6

libmplayer.so:5EB5ABE0 MOV R2, #2

libmplayer.so:5EB5ABE4 MOV R0, R5

libmplayer.so:5EB5ABE8 BL fseek

libmplayer.so:5EB5ABEC MOV R0, R5

libmplayer.so:5EB5ABF0 BL ftell

libmplayer.so:5EB5ABF4 LDR R7, =(aHarrydebug807_ - 0x5EB5AC5C)

libmplayer.so:5EB5ABF8 STR R0, [SP,#0xDF0+var_D20]

libmplayer.so:5EB5ABFC BL malloc

libmplayer.so:5EB5AC00 LDR R12, =(aHarrydebug806_ - 0x5EB5AC10)

libmplayer.so:5EB5AC04 MOV R1, R6

libmplayer.so:5EB5AC08 ADD R2, PC, R12 ; "harrydebug806.\n"

libmplayer.so:5EB5AC0C STR R0, [SP,#0xDF0+var_D84]

libmplayer.so:5EB5AC10 MOV R0, #1

libmplayer.so:5EB5AC14 BL mp_msg

libmplayer.so:5EB5AC18 MOV R1, R6

libmplayer.so:5EB5AC1C LDR R2, [SP,#0xDF0+var_D20]

libmplayer.so:5EB5AC20 LDR R0, [SP,#0xDF0+var_D84]

libmplayer.so:5EB5AC24 BL memset_0

libmplayer.so:5EB5AC28 MOV R0, R5

libmplayer.so:5EB5AC2C MOV R1, R6

libmplayer.so:5EB5AC30 MOV R2, R6

libmplayer.so:5EB5AC34 BL fseek

libmplayer.so:5EB5AC38 MOV R3, R5

libmplayer.so:5EB5AC3C MOV R1, #1

libmplayer.so:5EB5AC40 LDR R2, [SP,#0xDF0+var_D20]

libmplayer.so:5EB5AC44 LDR R0, [SP,#0xDF0+var_D84]

libmplayer.so:5EB5AC48 BL fread

libmplayer.so:5EB5AC4C MOV R0, R5

libmplayer.so:5EB5AC50 BL fclose

libmplayer.so:5EB5AC54 ADD R2, PC, R7 ; "harrydebug807.

第7步:获取加密视频头文件中的两个base64码并在V3.lic查找是否存在。

yJ3pPh4RItrcgckEtqjS+Q==与nZjpa0hCd9vfh5oAt6nf9A==

libmplayer.so:5EB5ACDC ADD R1, PC, R1 ; unk_5F5AAFA4

libmplayer.so:5EB5ACE0 BL sprintf

libmplayer.so:5EB5ACE4 MOV R1, R4

libmplayer.so:5EB5ACE8 LDR R0, [SP,#0xDF0+var_D84]

libmplayer.so:5EB5ACEC BL strstr ; 查找yJ3pPh4RItrcgckEtqjS+Q==

libmplayer.so:5EB5ACF0 LDR R2, =(aHarrydebug808_ - 0x5EB5AD00)

libmplayer.so:5EB5ACF4 MOV R1, R6

libmplayer.so:5EB5ACF8 ADD R2, PC, R2 ; "harrydebug808.\n"

libmplayer.so:5EB5ACFC STR R0, [SP,#0xDF0+var_D1C]

libmplayer.so:5EB5AD00 MOV R0, #1

libmplayer.so:5EB5AD04 BL mp_msg

libmplayer.so:5EB5AD08 MOV R1, R5

libmplayer.so:5EB5AD0C LDR R0, [SP,#0xDF0+var_D84]

libmplayer.so:5EB5AD10 BL strstr ; 查找nZjpa0hCd9vfh5oAt6nf9A==

libmplayer.so:5EB5AD14 MOV R7, R0

libmplayer.so:5EB5AD18 MOV R0, R4

libmplayer.so:5EB5AD1C LDR R4, =(aHarrydebug809_ - 0x5EB5AD38)

libmplayer.so:5EB5AD20 BL free

libmplayer.so:5EB5AD24 MOV R0, R5

libmplayer.so:5EB5AD28 BL free

第8步:继续查找V3.lic中的与并获得与中间的base64字符。

在V3.lic获得的base64字符如下:

2F 6F 52 32 5A 42 56 43 66 78 69 72 74 6F 41 4B /oR2ZBVCfxirtoAK

30 75 5A 38 78 36 4B 34 76 5A 32 6E 37 47 57 4D 0uZ8x6K4vZ2n7GWM

77 68 70 57 65 75 61 31 31 4B 65 4D 6C 62 62 79 whpWeua11KeMlbby

55 61 50 6A 4C 76 39 7A 5A 35 7A 48 67 35 57 55 UaPjLv9zZ5zHg5WU

59 48 46 46 45 75 4D 78 72 51 79 64 49 74 58 47 YHFFEuMxrQydItXG

33 53 7A 52 73 43 45 6E 62 61 30 79 47 4B 51 48 3SzRsCEnba0yGKQH

4D 71 36 50 6D 6A 36 6E 2B 49 75 56 7A 45 58 63 Mq6Pmj6n+IuVzEXc

45 37 38 76 32 6D 67 7A 71 6D 71 79 59 39 38 75 E78v2mgzqmqyY98u

6C 69 7A 73 73 53 67 51 30 4A 37 74 4C 4A 36 4C lizssSgQ0J7tLJ6L

6E 53 61 73 54 4F 36 48 62 41 72 6D 69 4A 41 57 nSasTO6HbArmiJAW

6F 79 56 59 43 2F 4C 6C 63 75 6D 68 73 4D 30 2F oyVYC/LlcumhsM0/

37 4F 48 32 79 2B 41 57 5A 62 66 76 66 45 43 53 7OH2y+AWZbfvfECS

37 62 31 34 6A 4E 36 58 6D 78 56 66 65 68 58 44 7b14jN6XmxVfehXD

68 67 52 6F 77 41 44 43 74 54 46 6B 42 6A 32 51 hgRowADCtTFkBj2Q

67 76 37 71 43 6C 46 7A 6B 34 71 4C 6C 72 77 38 gv7qClFzk4qLlrw8

37 52 46 55 2F 6E 74 30 39 31 79 5A 50 49 78 61 7RFU/nt091yZPIxa

64 64 42 4E 62 2F 6B 4C 69 4B 79 51 5A 2B 50 35 ddBNb/kLiKyQZ+P5

74 77 64 78 64 70 47 46 4C 4C 77 54 73 46 35 59 twdxdpGFLLwTsF5Y

4B 58 63 39 51 73 71 45 35 62 75 52 35 51 39 71 KXc9QsqE5buR5Q9q

69 5A 55 6B 69 68 31 30 34 6B 2B 30 39 33 7A 59 iZUkih104k+093zY

30 32 65 6B 41 77 72 6C 6A 6D 32 64 54 30 38 61 02ekAwrljm2dT08a

43 48 47 54 31 78 35 72 76 34 74 6D 50 4C 77 6D CHGT1x5rv4tmPLwm

65 4B 38 75 56 43 75 75 6C 72 56 4D 57 45 4E 68 eK8uVCuulrVMWENh

39 75 4F 6F 62 63 75 41 2F 6C 73 67 47 53 48 30 9uOobcuA/lsgGSH0

58 42 78 58 4E 6C 35 72 31 79 52 44 71 79 4E 49 XBxXNl5r1yRDqyNI

38 78 51 37 6C 57 32 6A 79 35 2B 54 5A 32 66 36 8xQ7lW2jy5+TZ2f6

32 52 6E 6B 67 52 43 72 37 41 75 43 78 70 75 63 2RnkgRCr7AuCxpuc

58 75 5A 6D 6C 39 33 74 6A 55 4A 62 4C 76 48 63 XuZml93tjUJbLvHc

35 45 73 78 6B 5A 30 6B 4A 79 2B 6F 5A 69 35 6F 5EsxkZ0kJy+oZi5o

33 2B 53 6D 77 69 38 47 2F 6D 6C 55 6D 51 56 70 3+Smwi8G/mlUmQVp

46 35 76 2F 57 56 71 59 56 47 33 69 76 75 51 4E F5v/WVqYVG3ivuQN

52 41 71 70 57 4C 63 74 6B 68 53 36 31 54 65 79 RAqpWLctkhS61Tey

42 6C 38 33 50 50 74 62 68 2F 74 33 32 50 5A 73 Bl83PPtbh/t32PZs

54 47 6F 75 35 6A 63 6A 6F 6B 54 2B 43 4A 65 52 TGou5jcjokT+CJeR

50 38 4C 2F 70 51 6A 57 36 46 42 44 31 6B 33 6E P8L/pQjW6FBD1k3n

56 39 43 38 45 36 53 4E 43 33 38 6D 45 4D 65 4E V9C8E6SNC38mEMeN

41 4A 52 55 72 4B 4F 5A 53 77 63 38 77 45 6A 38 AJRUrKOZSwc8wEj8

56 48 4A 44 46 66 47 54 57 48 48 54 6F 2F 47 41 VHJDFfGTWHHTo/GA

5A 68 73 76 35 2F 31 42 71 51 36 51 7A 68 4C 79 Zhsv5/1BqQ6QzhLy

6B 56 72 68 33 76 54 37 4F 45 59 36 30 47 4B 75 kVrh3vT7OEY60GKu

54 41 64 71 6A 38 71 49 75 62 72 39 4A 4E 35 71 TAdqj8qIubr9JN5q

64 4E 73 34 4E 37 44 67 41 34 66 39 4C 49 55 4E dNs4N7DgA4f9LIUN

6E 54 36 74 59 66 37 71 44 69 41 7A 36 66 53 45 nT6tYf7qDiAz6fSE

50 74 65 44 62 78 35 75 34 50 72 66 66 63 67 75 PteDbx5u4Prffcgu

71 68 72 4C 4D 4F 4C 4D 61 6F 76 56 63 65 7A 48 qhrLMOLMaovVcezH

67 32 4F 73 30 67 6C 61 55 37 53 44 77 37 48 69 g2Os0glaU7SDw7Hi

66 73 6E 46 44 74 48 52 6B 2B 44 46 2B 6E 79 6F fsnFDtHRk+DF+nyo

54 6A 4

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值