国语视界

 找回密码
 立即注册
查看: 6502|回复: 14

[蓝光技术] 狮门-PlayList乱序修复-路易的第九条命

[复制链接]

48

主题

1488

帖子

3105

积分

版主

大洋
21162
阅读权限
140
发表于 20-9-27 14:40 | 显示全部楼层 |阅读模式
本帖最后由 nnezyj 于 20-9-27 16:38 编辑

┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅
引言:感谢 世界哪有真情lu、9011、i6henl、だ`無ぺ窷. 、老黑、花九胖 大佬们提供技术支持与教程文档分享!
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅

※※※※※※※※ 前言 ※※※※※※※※
  原盘文件时间为 2016/12 的狮门原盘,也是狮门刚开始采取乱序设计的初期,此时的原盘代码与现在的 Radius60 狮门代码差异相比,代码格式没有现在这么统一,代码混淆也相对严重,但乱序设计思路已基本成型。

  使用 DVDFAB 提取原盘修复乱序,会生成一个 FAB! 的目录,其内放置有原盘 AACS 等原盘保护文件。DVDFAB 在 jar 文件内新增了代码类,用于调用这个目录内的文件,作为狮门内部代码乱序验证使用,给狮门乱序代码验证程序一个当前播放为正版光盘的假象。但用户会有删除 FAB! 目录的习惯,因此造成乱序验证失效,原盘进入乱序播放状态。
  这里通过修改 jar 内的文件代码,达到去除 FAB! 也能正确播放 MPLS 的目的。

  本次修复的思路,和目前 DVDFAB 对 Radius60 乱序修复的思路一致,通过找到 BDLocator 这一最终播放 PlayList 的关键函数位置,在播放正片之前,对播放的 PlayListID 进行检测,修正为正确的 PlayLisID 。
  本篇原盘的乱序问题,一个是主菜单章节跳转,从零开始播放,还有便是没有播放正确的 mpls 编号。
  实际播放测试,主菜单 play movie 按钮,播放的 mpls 编号,和菜单上选择章节跳转,播放的 mpls 编号是不一样的!

  前情提要:
  在播放控制类里,没有章节跳转的单独函数,而是通过 new BDLocator(url) 的方式,建立一个包含 MarkID 的 PlayList 来播放。
  和 Radius60 乱序一样,在通过 new BDLocator(url) 建立用于播放的 PlayList 时,会通过外部调用,修改 url 字符串,替换为其他 PlayListID 和 MarkID。
  由于代码混淆程度较为严重,无法直接通过 SBDJ 修改类文件内容,这里采用了取巧的操作,将原本用于乱序 url 字符串的调用函数,指向了我们新建的 PlayListID 和 MarkID 处理类。
  这里,需要使用 JByteMod-1.8.2 进行混淆 class 的字节码修改。

  本篇实例操作原盘:The 9th Life of Louis Drax 2016 BluRay 1080p AVC DTS-HD MA5.1-CHDBits



※※※※※※※※ 正文  ※※※※※※※※
  通过 jadx-gui 搜索 BDLocator,经过判断确认 fu.class 为播放控制类。
  fu.class  播放控制类
  

  其中关键的两个函数:
  1.         /**
  2.          * paramca.b 是返回 PlayListID 编号的字符串。
  3.          * String ca.b(String arg0) 返回处理过的 "bd://PLAYLIST:" 字符串
  4.          * ca.b(String) 为乱序函数
  5.          *
  6.          * 这里仅为 PlayListID 部分,即从头播放 "bd://PLAYLIST:xxxxx"
  7.          * -------------------------------------------------------------------------------------
  8.          * @param paramca |
  9.          * @param paraman |
  10.          */
  11.         public synchronized void a(ca paramca, an paraman) {
  12.           try {
  13.             a(paramca, paraman, new BDLocator(ca.b("bd://PLAYLIST:" + paramca.b)));
  14.           } catch (Throwable throwable) {
  15.             ae.a(throwable);
  16.           }
  17.         }


  18.         /**
  19.          * int[] cu.a(int titleNumber, int playListId, int markId) 返回处理过的ID编号
  20.          * cu.a(int, int, int) 为乱序函数
  21.          *
  22.          * 这里包含 MarkID 部分
  23.          * -------------------------------------------------------------------------------------
  24.          * @param paramca |
  25.          * @param paraman |
  26.          * @param paramInt |
  27.          */
  28.         public synchronized void a(ca paramca, an paraman, int paramInt) {
  29.           try {
  30.             String[] arrayOfString = null;
  31.             int i = paramInt;
  32.             byte b1 = -1;
  33.             int j = paramca.e;
  34.             byte b2 = -1;
  35.             String str = null;
  36.             int[] arrayOfInt = cu.a(b2, j, i); // 这里返回 {titleNumber, playListId, markId} 数组
  37.             // public BDLocator(String discId, int titleNumber, int playListId, int playItemId, int markId, String[] componentTags)
  38.             a(paramca, paraman, new BDLocator(str, arrayOfInt[0], arrayOfInt[1], b1, arrayOfInt[2], arrayOfString));
  39.           } catch (Throwable throwable) {
  40.             ae.a(throwable);
  41.           }
  42.         }
复制代码


  通过 JByteMod-1.8.2 字节码工具,修改两个关键函数的乱序函数调用,指向我们新建的乱序处理类 PlayList.class 的函数:
  其中关键的两个函数修改之后的代码:
  1.         public synchronized void a(ca paramca, an paraman) {
  2.           try {
  3.             a(paramca, paraman, new BDLocator(PlayList.b("bd://PLAYLIST:" + paramca.b)));
  4.           } catch (Throwable throwable) {
  5.             ae.a(throwable);
  6.           }
  7.         }
  8.         
  9.         
  10.         public synchronized void a(ca paramca, an paraman, int paramInt) {
  11.           try {
  12.             String[] arrayOfString = null;
  13.             int i = paramInt;
  14.             byte b1 = -1;
  15.             int j = paramca.e;
  16.             byte b2 = -1;
  17.             String str = null;
  18.             int[] arrayOfInt = PlayList.a(b2, j, i);
  19.             a(paramca, paraman, new BDLocator(str, arrayOfInt[0], arrayOfInt[1], b1, arrayOfInt[2], arrayOfString));
  20.           } catch (Throwable throwable) {
  21.             ae.a(throwable);
  22.           }
  23.         }
复制代码

  在 SBDJ 中新建一个 PlayList 类名 Class 文件,代码如下所示:
  建立一个正常播放的非正片 mpls 编号数组,确认 PlayListID 是否是其中之一。这些非正片之外的 mpls 编号,便是正片编号了,然后统一处理返回正确的编号 730。
  MarkID 也是同理,本身初始传递来的便是正确的 MarkID,但是经过处理变成了0,我们只需要维持输出的是原始传递来的 MarkID 即可。
  PlayList.java  播放控制类
  [代码见CHM文件]
  
  以上方式字节码修改部分最少最为方便的方式。



※※※※※※※※ 正文 ● PlayList.java 修改补充 ※※※※※※※※
  上文中 PlayList.java 代码,通过比对 MPLS 编号返回指定的正片 MPLS 编号!
  实际上,如果不需要指定特定 MPLS 编号,我们的 PlayList.java 代码可以变得更简洁。唯一缺点是,我们需要在破解乱序代码问题后,实际播放一次以确定修复乱序后原盘的正片 MPLS 编号。
  譬如,本次原盘测试结果,正片 MPLS 编号为 00000,章节跳转和直接播放按钮选择,都功能正常!

  简洁 PlayList.java 代码如下:
  修改原理解析:原盘通过 ca.class 类的乱序函数调用,将导入的 PlayListID 与 MarkID 数值,转换为其他数值。因此,我们维持原来的输入结果不变,即可达到破解乱序的目的。

  1.   public class PlayList {
  2.           
  3.           public static String b(String url) {
  4.                   return url;
  5.           }
  6.   
  7.           public static int[] a(int titleNumber, int playListId, int markId) {
  8.                   int[] ids = {titleNumber, playListId, markId};
  9.                   return ids;
  10.           }
  11.           
  12.   }
复制代码

  后续处理:
  播放一次原盘,获取破解乱序后的固定的正片 MPLS 编号。
  将原盘的正确 MPLS 编号文件,复制一份改名为固定的正片 MPLS 编号。


※※※※※※※※ 结语 ※※※※※※※※
  狮门乱序看起来很复杂,但经过实际的分析,抽丝剥茧,还是能找到合理有效的解决方法的!
  找到最关键的播放控制,也就等于找到解决问题的核心点!



┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅分割线┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅
以上是《狮门_路易的第九条命_乱序修复》的内容目录及片段,详细内容下载附件“狮门_路易的第九条命_乱序修复.chm”查阅。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 4威望 +130 大洋 +2000 收起 理由
dunfeng + 700 赞一个!
bobo + 30 + 500 很给力!
why1812 + 50 + 300 厉害了我的毛大神!
cnlang + 50 + 500 赞一个!

查看全部评分

3

主题

5924

帖子

1005

积分

营长

大洋
7319
阅读权限
50
发表于 20-9-27 14:47 | 显示全部楼层
感谢制作发布,周年庆同贺
回复 支持 反对

使用道具 举报

168

主题

6973

帖子

1208

积分

营长

大洋
11097
阅读权限
50
发表于 20-9-27 14:53 | 显示全部楼层
支持一下,论坛生日快乐
回复 支持 反对

使用道具 举报

143

主题

1万

帖子

3143

积分

团长

大洋
36800
阅读权限
60
发表于 20-9-27 14:56 | 显示全部楼层
值得学习参考的好资料。
回复 支持 反对

使用道具 举报

33

主题

1905

帖子

553

积分

连长

大洋
3583
阅读权限
40
发表于 20-9-27 15:23 | 显示全部楼层
技术贴,值得收藏学习,楼主写那么多,辛苦了,感谢
回复 支持 反对

使用道具 举报

4

主题

2849

帖子

390

积分

排长

大洋
6845
阅读权限
30

热心会员

发表于 20-9-27 15:52 | 显示全部楼层
对初学者来说有点深奥,谢谢楼主,学习了
回复 支持 反对

使用道具 举报

11

主题

4875

帖子

687

积分

连长

大洋
56549
阅读权限
40
发表于 20-9-27 16:18 | 显示全部楼层
体会到原盘DIY大佬的辛苦了!
回复 支持 反对

使用道具 举报

2

主题

2585

帖子

300

积分

排长

大洋
10433
阅读权限
30
发表于 20-9-27 16:20 | 显示全部楼层
不明觉厉,周年庆快乐!
回复 支持 反对

使用道具 举报

2

主题

2766

帖子

2134

积分

营长

大洋
28317
阅读权限
50
发表于 20-9-27 17:37 | 显示全部楼层
技术大佬就是牛!我等只能兴叹了。
回复 支持 反对

使用道具 举报

13

主题

1750

帖子

7026

积分

旅长

大洋
16109
阅读权限
70

灌水之王

发表于 20-9-27 18:54 | 显示全部楼层
白教授牛逼
回复 支持 反对

使用道具 举报

8

主题

2万

帖子

8824

积分

旅长

大洋
153778
阅读权限
70

灌水之王热心会员论坛元老

发表于 20-9-28 05:35 | 显示全部楼层
发布技术贴辛苦了
回复 支持 反对

使用道具 举报

28

主题

3033

帖子

7106

积分

旅长

大洋
11498
阅读权限
70
发表于 20-9-28 10:10 | 显示全部楼层
十分感谢nn大佬发布新的教程!辛苦了!
回复 支持 反对

使用道具 举报

0

主题

1261

帖子

919

积分

连长

大洋
436
阅读权限
40
发表于 20-10-2 17:57 | 显示全部楼层
还是需要原盘作为参考的
回复 支持 反对

使用道具 举报

0

主题

6

帖子

1

积分

禁止访问

大洋
21
阅读权限
0
发表于 20-11-20 21:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

1743

帖子

345

积分

排长

大洋
11559
阅读权限
30
发表于 21-10-24 09:20 | 显示全部楼层
这个水平牛啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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