环境及工具
手机 :小米手机 MI 2A
系统版本: Android 4.1.1
工具 : IDA pro 6.6 、C32Asm 、VS2005
帮朋友写了一个解密DRM视频的小软件,我把分析该播放器的调试步骤记录下来与大家一起学习,高手莫要见笑,仅供小菜玩乐,有不对或不足的地方还请多多指教,不胜感激!
一:第一次打开加密视频会出现如下验证:
输入用户名与密码登录成功后如下图
点击“支付并获取许可证”成功后就可以播放加密的视频了,并在安装包目录下生成了两个重要的文件,indiv3.key与V3.lic。
二:加密后视频大致结构如下:
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