css-cat.c
上传用户:lsh121205
上传日期:2007-01-08
资源大小:25k
文件大小:5k
源码类别:

DVD

开发平台:

C/C++

  1. /*
  2.  * css-cat.c
  3.  *
  4.  * Copyright 1999 Derek Fawcus.
  5.  *
  6.  * Released under version 2 of the GPL.
  7.  *
  8.  * Decode selected sector types from a CSS encoded DVD to stdout.  Use as a
  9.  * filter on the input to mpeg2player or ac3dec.
  10.  *
  11.  */
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #if defined(__linux__)
  15. # include <getopt.h>
  16. #endif /* __linux__ */
  17. #include <string.h>
  18. #include <unistd.h>
  19. #include <fcntl.h>
  20. #include "css-descramble.h"
  21. static struct playkey pkey1a1 = {0x36b, {0x51,0x67,0x67,0xc5,0xe0}};
  22. static struct playkey pkey2a1 = {0x762, {0x2c,0xb2,0xc1,0x09,0xee}};
  23. static struct playkey pkey1b1 = {0x36b, {0x90,0xc1,0xd7,0x84,0x48}};
  24. static struct playkey pkey1a2 = {0x2f3, {0x51,0x67,0x67,0xc5,0xe0}};
  25. static struct playkey pkey2a2 = {0x730, {0x2c,0xb2,0xc1,0x09,0xee}};
  26. static struct playkey pkey1b2 = {0x2f3, {0x90,0xc1,0xd7,0x84,0x48}};
  27. static struct playkey pkey1a3 = {0x235, {0x51,0x67,0x67,0xc5,0xe0}};
  28. static struct playkey pkey1b3 = {0x235, {0x90,0xc1,0xd7,0x84,0x48}};
  29. static struct playkey pkey3a1 = {0x249, {0xb7,0x3f,0xd4,0xaa,0x14}}; /* DVD specific ? */
  30. static struct playkey pkey4a1 = {0x028, {0x53,0xd4,0xf7,0xd9,0x8f}}; /* DVD specific ? */
  31. static struct playkey *playkeys[] = {
  32. &pkey1a1, &pkey2a1, &pkey1b1,
  33. &pkey1a2, &pkey2a2, &pkey1b2,
  34. &pkey1a3, &pkey1b3,
  35. &pkey3a1, &pkey4a1,
  36. NULL};
  37. static unsigned char disk_key[2048];
  38. static unsigned char title_key[5];
  39. static unsigned char sector[2048];
  40. unsigned long sectors = 0;
  41. unsigned long crypted = 0;
  42. unsigned long skipped = 0;
  43. int do_all = 0;
  44. int do_video = 0;
  45. int do_ac3 = 0;
  46. int do_mpg = 0;
  47. int verbose = 0;
  48. int keep_pack = 0;
  49. int keep_pes = -1;
  50. #define STCODE(p,a,b,c,d) ((p)[0] == a && (p)[1] == b && (p)[2] == c && (p)[3] == d)
  51. static void un_css(int fdi, int fdo)
  52. {
  53. unsigned char *sp, *pes;
  54. int writen, wr, peslen, hdrlen;
  55. while (read(fdi, sector, 2048) == 2048) {
  56. ++sectors;
  57. if (!STCODE(sector,0x00,0x00,0x01,0xba)) {
  58. fputs("Not Pack start coden", stderr);
  59. ++skipped; continue;
  60. }
  61. if (do_all)
  62. goto write_it;
  63. pes = sector + 14 + (sector[13] & 0x07);
  64. if (STCODE(pes,0x00,0x00,0x01,0xbb)) {/* System Header Pack Layer */
  65. peslen = (pes[0x04] << 8) + pes[0x05];
  66. pes += peslen + 6;
  67. }
  68. if (pes[0x00] || pes[0x01] || pes[0x02] != 0x01 || pes[0x03] < 0xbc) {
  69. ++skipped; continue;
  70. }
  71. peslen = (pes[0x04] << 8) + pes[0x05];
  72. hdrlen = pes[0x08] + 6 + 3;
  73. if ((pes[0x03] & 0xf0) == 0xe0) {
  74. if (do_video)
  75. goto write_it;
  76. } else if (do_mpg && pes[0x03] == (0xc0 | (do_mpg - 1))) { /* MPEG Audio */
  77. goto write_it;
  78. } else if (pes[0x03] == 0xbd) { /* AC3 Audio */
  79. if (do_ac3) {
  80. int audiotrack = do_ac3 - 1;
  81. if (pes[hdrlen] == (0x80|(audiotrack & 7))) {
  82. hdrlen += 4;
  83. goto write_it;
  84. }
  85. }
  86. } else
  87. ++skipped;
  88. continue;
  89. write_it:
  90. if (sector[20] & 0x30) {
  91. ++crypted;
  92. css_descramble(sector, title_key);
  93. sector[20] &= 0x8f;
  94. }
  95. writen = 0;
  96. if (keep_pack)
  97. sp = sector, peslen = 2048;
  98. else if (keep_pes)
  99. sp = pes, peslen = 2048 - (pes - sector);
  100. else
  101. sp = pes + hdrlen, peslen -= hdrlen - 6;
  102. do {
  103. wr = write(fdo, sp, peslen - writen);
  104. sp += wr;
  105. writen += wr;
  106. } while (wr > 0 && writen < peslen);
  107. }
  108. }
  109. static void usage_exit(void)
  110. {
  111. fputs("usage: css-cat [-t title-no] [-m mpeg-audio-no ] [-avPp12345678] vob_filen", stderr);
  112. exit(2);
  113. }
  114. static char *title = "1";
  115. static int parse_args(int ac, char **av)
  116. {
  117. int c;
  118. opterr = 0;
  119. while (1)
  120. switch((c = getopt(ac, av, "at:Ppvm:01234567"))) {
  121. case 'a':
  122. do_all = 1;
  123. /* fall through */
  124. case 'P':
  125. keep_pack = 1;
  126. break;
  127. case 'p':
  128. keep_pes = 1;
  129. break;
  130. case 't':
  131. title = optarg;
  132. break;
  133. case 'v':
  134. do_video = 1;
  135. ++keep_pes;
  136. break;
  137. case 'm':
  138. if ((do_mpg = atoi(optarg)) < 1 || do_mpg > 32)
  139. usage_exit();
  140. ++keep_pes;
  141. break;
  142. case '1': case '2': case '3': case '4':
  143. case '5': case '6': case '7': case '8':
  144. do_ac3 = c - '0';
  145. ++keep_pes;
  146. break;
  147. case EOF:
  148. goto got_args;
  149. default:
  150. usage_exit();
  151. break;
  152. }
  153. got_args:
  154. keep_pes = (keep_pes > 0) ? 1 : 0;
  155. return optind;
  156. }
  157. int main(int ac, char **av)
  158. {
  159. int ai, fd;
  160. char titlef[12];
  161. if ((fd = open("disk-key", O_RDONLY)) == -1) {
  162. perror("can't open disk-key");
  163. exit(1);
  164. }
  165. if (read(fd, disk_key, 2048) != 2048) {
  166. perror("can't read disk-key");
  167. close(fd);
  168. exit(1);
  169. }
  170. close(fd);
  171. if ((ai = parse_args(ac, av)) >= ac)
  172. usage_exit();
  173. strcpy(titlef, "title");
  174. strcat(titlef, title);
  175. strcat(titlef, "-key");
  176. if ((fd = open(titlef, O_RDONLY)) == -1) {
  177. perror("can't open title-key");
  178. exit(1);
  179. }
  180. if (read(fd, title_key, 5) != 5) {
  181. perror("can't read title-key");
  182. close(fd);
  183. exit(1);
  184. }
  185. close(fd);
  186. if (strcmp(av[ai], "-") == 0)
  187. fd = 0;
  188. else if ((fd = open(av[ai], O_RDONLY)) == -1) {
  189. fputs("can't open VOB file ", stderr);
  190. fputs(av[ai], stderr);
  191. perror("");
  192. exit(1);
  193. }
  194. if (!css_decrypttitlekey(title_key, disk_key, playkeys)) {
  195. close(fd);
  196. return 3;
  197. }
  198. un_css(fd, 1);
  199. fprintf(stderr, "Total %lu, skipped %lu,  crvid %lun",
  200. sectors, skipped, crypted);
  201. close(fd);
  202. return 0;
  203. }