手机电子书UMD转换BRM格式详解

  • 内容
  • 评论
  • 相关

百阅视听是一款手机上看图书的软件. 比起掌上书院确实好很多, 首先从压缩比例,和打开文档速度来说 百阅视听都占有很大的优势,所以我找空开发了一个转换的软件 可是百阅视听实在是太令人失望了.我以为做个这样的软件可以给百阅带来很多好处 也许是我想错了 不知道是不是看我做出来了这样的转换软件. 会让百阅损失很多东西 百阅竟然改变了只能从他们网站上下载书.  其实什么样的软件别人都可以破解. 我觉得没有必要这样做吧 别人自己制作的为什么就不能用呢? 也许以后有兴趣我会再做个转换的来. 不过暂时是不会了 现在把转换分析的过程和大家分享了下

由于太多人需要特把源码放上 [下载]

  首先想把一个文件转换成另一个文件 必须知道这两个文件的格式. 拿掌上书院来说吧 .UMD 文件 其实用的是C#里的一个压缩控件 icsharpcode.sharpziplib 所以 做这个转换程序的用.net工具来开发是最好的了 .(也不完全是)    经过分析 UMD的文件存储格式分为两种(普通的和漫画)这里只讲普通的格式
UMD首先会在文件头写入一个
     UINT类型 值为 0xde9a9b89 可能是用于识别版本类别什么的.
然后的格式大概如下
#
short 1  //文件信息
byte 0
byte 8   //这个值用是用来定义后面长度的.  实际长度为 值-5
byte 2   //这里1为普通书 2为漫画书
short random1.Next(0x401, 0x7fff) % 0xffff //PGKSeed

#
short 2 //文件标题
byte 0
byte  *  //标题长度=*-5
byte[] * //写入标题

#
short 3 //作者名称
byte 0
byte  *  //作者名称长度=*-5
byte[] * //写入作者名称

接下来的是可选的其格式和上面的一样
#4 //年  #5 //月 #6 //日 #7 //书的类别 #8 //出版人 #9 //出售人

写入文章长度
#
short 11
byte 0
byte 9
int * //长度
写入章节数
#
short 0x83
byte 1
byte 9
uint 0x3000 + random1.Next(0xfff); //这个值用来关联0x83
$
uint * //这个值就是上面关联0x83随机产生的值
uint 9 + (章节长度 * 4) //章节长度
byte[] * 写入每章的偏移值

写入章节标题
#
short 0x84
byte 1
byte 9
uint 0x4000 + random1.Next(0xfff); //这个值用来关联0x84
$
uint * //这个值就是上面关联0x84随机产生的值
uint 9 + 所有标题相加的长度
byte[] * 写入所有章节标题

写入压缩后的内容
$
uint random1.Next(1, 0xfffffff) * -1
uint 9+压缩后的长度
byte[] * //写入压缩后的内容

在压缩的时候 有可能把文章分成了很几段 所以 前面写压缩内容也许会接着再写一次 并且在中间随机写入
#
short 10
byte 0
byte 9
int CID //标识用的

写入结束
#
short 0xf1
byte 0
byte 0x15
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
最后还要写封面数据 代号 # 0x81 这里就不多讲了.
好了知道文件格式后 并掌握其它格式规律 我们就可以做一个类
并用循环方法把内容读出来

主要循环方法

char ch1 = (char) ((ushort) reader.PeekChar());
          while (ch1 == '#')
           {
 reader.ReadChar(); //读#号 提升一个字节
 short num2 = reader.ReadInt16(); //读取类型 上面#号后面根的编码
 byte num3 = reader.ReadByte(); 
 byte num4 = (byte) (reader.ReadByte() - 5);//读取长度
                //ReadSection 这个函数会根据num2将数据写入自己的属性
              this.ReadSection(num2, num3, num4, reader);
 ch1 = (char) ((ushort) reader.PeekChar());
                //防止随机插入的标识
 if ((num2 == 0xf1) || (num2 == 10))
 {
 if (ch1=='$'&&this.type=="2")
    num2 = this.imgtype;
 else
 num2 = 0x84;
 } 
                //为$是实体内容   
 while (ch1 == '$')
 {
 reader.ReadChar();
 uint num5 = reader.ReadUInt32();
 uint num6 = reader.ReadUInt32() - 9;
                 //ReadAdditional 根据num2 来读入章节标题 和被压缩的章节内容
 this.ReadAdditional(num2, num5, num6, reader);
 ch1 = (char) ((ushort) reader.PeekChar());
 }
}

接着我们可以把压缩后的数据再解压  这里就不详解.
BRM文件格式分析:
  对于BRM文件还不是很了解 只知道他们的做法是生成一个XML文档 然后再用一个编译器编译 .所以需要做的就是生成格式一样的XML文档 用他们的编译器来编译
 下面是BRM的XML文件格式分析的一个例子和解释

<BRM.Document.XML>//头部
<Version>1</Version>//版本
<Title>我的书屋</Title>//标题
<Author>游戏人生</Author>//作者
<Producer>游戏人生</Producer>//制作
<ProduceDate>2005-10-18</ProduceDate>//日期
<ContentID>5ECA850C-0038-4434-8786-DA0EC59CCCBB</ContentID>//GUID标识
<Retailer>游戏人生</Retailer>//发售人
<Gender>游戏人生</Gender>//类别
<GlobalText length="90049">//length为内容长度
//这里是内容
//内容格式为  \n\n\n章节\n\n\n+内容
</GlobalText>
<PictureLayout count="1">//图片
<pl global="0" orientation="0" width="176" height="208">1018//这里是图片的id 是通过当前日期来生成的</pl></PictureLayout>
<MultiMediaClips count="1">
<clip id="1018" mime="image/jpeg">//这里是图片数据</clip>
</MultiMediaClips>
<HyperLinks count="4"> //章节内容 count = 章节数量
<href id="1019" to="153" global="3" length="6">第一章 刘烟</href>
//href id=上面的id+1
//to= 当前开始的位置 因为内容前面有3个分行符 所以从3开始
//length = 当前章节标题的长度
<href id="1020" to="2741" global="10" length="8">第二章 奇异世界</href>
<href id="1021" to="10963" global="19" length="8">第三章 女奴拍卖</href>
<href id="1022" to="17975" global="28" length="8">第四章 奇特遭遇</href>
</HyperLinks>
</BRM.Document.XML>

现在知道UMD的内容读出来了. 并且也知道BRM的XML格式了
就可以利用.net里的XML类来写文件了.
最后用他们的编译器进行编译

System.CodeDom.Compiler.TempFileCollection tf = new System.CodeDom.Compiler.TempFileCollection();
   System.CodeDom.Compiler.Executor.ExecWait(@"Genbrm.exe "+path,tf);

大功告成 .转换后就可以放到手机上看了

评论

36条评论
  1. Gravatar 头像

    cgxp 回复

    你好,我想开发umd的阅读软件,可以给我umd的文件格式吗

    cgxp@panan.gov.cn

  2. Gravatar 头像

    2lin 回复

    你好。已经发到你邮箱!

  3. Gravatar 头像

    宁采臣 回复

    你好,可以重新发一份给我吗,谢谢,邮件被人删了,也发一份到admin@panan.gov.cn

  4. Gravatar 头像

    lijieqian 回复

    林一你好!
       不知道你是怎么知道UMD文件格式的,反正很佩服你,因为我也想尽了各种办法,包括反汇编。麻烦你给我寄一份,非常感谢你!
       email: lijie1000@sohu.com
       msn: ljq1000@hotmail.com

  5. Gravatar 头像

    东汉末年 回复

    林一你好!

    我按照您本篇文章,用java程序写了一个破解程序。

    而且章节的题目信息已经获得了,但是我现在卡在了内容,因为是压缩过的,我不知道怎么才能把里面的内容解压出来,敬请指教!不胜感激!

    msn:lele_alar@hotmail.com

    email: erics_lele@126.com

    QQ: 37584562

    期待中

  6. Gravatar 头像

    2lin 回复

    压缩算法使用的是zip压缩

    你可以去网上找个java zip的算法类

  7. Gravatar 头像

    东汉末年 回复

    林一你好!

    我使用了java zip但是仍然不能将内容解压出来。而且题目的解压方法也很复杂我是反编译的别人的程序才找到的。但是实在找不出内容的解压方法,还望您能给点帮助,给点提示。

    下面我将题目的解压方法贴出来:

    //contente是umd文件中获得的字节

    while (l4 < contente.length) {

                 byte abyte4[] = new byte[c2 = byteToChar(contente[l4])];

                 System.arraycopy(contente, l4 + 1, abyte4, 0, abyte4.length);

                 String s = getString2(abyte4, 0, abyte4.length);

                 System.out.println("标题:" + s);

                 out.write(s.getBytes());

                 l4 = l4 + (c2 + 1);

               }

    //貌似是一种字符转换

    public static String getString2(byte abyte0[], int i1, int j1) {

       StringBuffer stringbuffer = new StringBuffer();

       if (j1 % 2 != 0) {

         return stringbuffer.toString();

       }

       if (i1 < 0 || i1 >= abyte0.length) {

         return stringbuffer.toString();

       }

       if (j1 <= 0 || i1 + j1 > abyte0.length) {

         return stringbuffer.toString();

       }

       for (int k1 = 0; k1 < j1 / 2; k1++) {

         int l1;

         if ( (l1 = abyte0[i1 + k1 * 2]) < 0) {

           l1 += 256;

         }

         int i2;

         if ( (i2 = abyte0[i1 + k1 * 2 + 1] << 8) < 0) {

           i2 += 0x10000;

         }

         char c1 = (char) (l1 + i2);

         stringbuffer.append(c1);

       }

       return stringbuffer.toString();

     }

  8. Gravatar 头像

    samuel 回复

    林一你好,看了你的文章,受益匪浅。

    我准备写一个看 UMD 电子书的软件,但是你的文章中关于章节标题、

    章节内容的文件格式描述,我理解得不是很清楚。

    请问你有没有比较详细一点的资料或文章? 我想拜读一下。

    我的邮件地址是 totobacoo@gmail.com

    QQ 是 1337927。 期待你的帮助

  9. Gravatar 头像

    samuel 回复

    林一你好,看了你的文章,受益匪浅。

    我准备写一个看 UMD 电子书的软件,但是你的文章中关于章节标题、

    章节内容的文件格式描述,我理解得不是很清楚。

    请问你有没有比较详细一点的资料或文章? 我想拜读一下。

    我的邮件地址是 totobacoo@gmail.com

    QQ 是 1337927。 期待你的帮助

  10. Gravatar 头像

    咖喱 回复

    林-您好!

    看了你的博客。感觉你对文件结构有一定的了解。

    我自己也想开发一个UMD和BRM的转换程序。

    反汇编了几天,得出了部分资料。希望你能给我发一份UMB和BRM的格式。谢谢!

    我的EMAIL:szyayi@yahoo.com.cn

  11. Gravatar 头像

    肥狼 回复

    林一你好,真佩服你能将文件结构弄的这么清楚

    我想palm上支持umd的阅读器,苦于找不到文件格式的资料

    可不可以发一个给我呢

    我的邮箱是 li_dustin@yahoo.com.cn

    非常感谢!!

  12. Gravatar 头像

    Eric 回复

    可不可以也给我发一份 

    谢谢啦!!

    我的邮箱zhaoyun_zhang@126.com

  13. Gravatar 头像

    NaOH 回复

    正在构思写个umd阅读器,

    能给我也发一份UMD格式的详细说明吗?

    谢谢

  14. Gravatar 头像

    NaOH 回复

    邮箱sgj@tju.edu.cn

  15. Gravatar 头像

    饺子 回复

    你好--我也想做一个UMD阅读器
    能给我一份UMD格式的详细说明么
    xuzhuojava@sohu.com
    thank you !

  16. Gravatar 头像

    饺子 回复

    正在写个umd阅读器,
    能给我也发一份UMD格式的详细说明吗?
    谢谢||
    xuzhuojava@sohu.com

  17. Gravatar 头像

    emeimonkey 回复

    2lin,你好!

       我也在研究UMD和BRM格式,能否把你的格式文档发给我一份,万分感谢!我的邮箱:emeimonkey@126.com 或者 emeimonkey@sohu.com

  18. Gravatar 头像

    小毛 回复

    很需要UMD和BRM电子书的文件格式。不知道可不可以给我分享一下他们的文件格式呢~~[s:7][s:7]
    may16th@163.com
    期待期待~~~

  19. Gravatar 头像

    hagangqiou 回复

    林一你太棒了!

      我也在研究umd格式,可是到处搜索都找不到结果,你能给我发一份格式说明吗?非常感谢!   email: hagangqiou@126.com

  20. Gravatar 头像

    能否也发份umd格式说明给我? 回复

    能否也发份umd格式说明给我?到处都没有找到...

    EMail:bjydfq@163.com

  21. Gravatar 头像

    pisces312 回复

    你好,终于看到你这里有关于UMD格式解析的文章,希望你给我发一份详细一些的UMD文件格式解析参考一下,十分感谢!

    nili66china@163.com

  22. Gravatar 头像

    路过的, 回复

    太感谢楼主了

  23. Gravatar 头像

    小敏 回复

    你好!

    看到你的文章真让我激动啊。我一直都想做一个文件的打开与转换的软件,做到UMD这里就卡做了。还反编译了其它的一些打开UMD的软件,只做到了正常取出标题等一些信息,可内容怎么也解不开了。能发一份UMD格式的说明给我吗?(guomin2014@sina.com)

    谢谢!

    另:能不能说明一下内容是怎么分析解码的。

    谢谢

  24. Gravatar 头像

    Bob 回复

    楼主你好,我也想试试开发umd阅读软件,可以给我发一份umd的文件格式吗?

    bobyu327@gmail.com

    多谢

  25. Gravatar 头像

    houyibo 回复

    感谢楼主的源码,通过你的源码,偶已经实现了symbian平台的UMD文件解析

  26. Gravatar 头像

    能把格式解析材料也给我一份吗? 回复

    你好,lz好
    请也给我发一份材料吧,shuixin536@gmail.com

  27. Gravatar 头像

    heiqishi 回复

    楼主你好,我想用vc6实现试试,可以给我发一份umd的文件格式吗? 不省感激。
    liutongqing_11@163.com

  28. Gravatar 头像

    亿年 回复

    楼主,好厉害!

    公司也要我做个umd阅读器,可惜关于umd格式的资料除了在你这里看到点,根本没有别的资料!

    好希望楼主能发份umd方面的资料给我!

    Email: jzeonn@gmail.com

    QQ:     381840

  29. Gravatar 头像

    啥啥牛牛xx 回复

    爱林-:

    看了你写的这个文章,我心血来潮,模仿百阅写了一个brm 转换器,

    xml是生成成功了,但是最终用百阅的那个工具生成 brm的时候,文件不能生成呀,很郁闷,得此求教!

    还有那个guid标示 怎么生成?

  30. Gravatar 头像

    zzp 回复

    你好, 可以发一份给我吗.?

    Email: zpap@163.com

    谢谢.

  31. Gravatar 头像

    能发一份格式给我吗?谢谢!! 回复

    能发一份UMD格式给我吗?谢谢!!  kuangyufei@126.com

  32. Gravatar 头像

    能发一份UMD文件格式吗?谢谢 回复

    楼主,你好!
    最近需要umd格式的资料,希望楼主能发份umd文件格式方面的资料给我!
    Email: ouwe001@163.com

  33. Gravatar 头像

    能否给个UMD格式说明 回复

    发到wangcq4@hotmail.com

    谢谢

发表评论

电子邮件地址不会被公开。 必填项已用*标注