赞助论坛
  • 4677阅读
  • 0回复

图解凌阳工具篇之 -->stk,让我们深入了解stk的工作过程. [复制链接]

楼层直达
发帖
315
精华
0
金币
16618
威望
8
贡献
94
好评
63
注册
2010-05-09
楼主    风儿轻轻的吹 发表于: 2012-03-27 17:49:49 
虽然本论坛里凌阳工具很丰富了,有April老师,Shjdwx老师等的强大工具软件,不过这一切都是源自我们所尊敬的bob75版主的作品:stk;

stk无疑是凌阳所有工具中,最具深度,精确性最高的工具,bob75版主所作,我以前用这个改了很多机子,也用这个工具,学习了非常多的关于凌阳的dvd数据知识.

前两天从一朋友那得到一份stk0.02版的源码,这个源码虽然很老很老,是bob版主的第二个版本吧,(个人猜想.因为叫stk 0.02);

花了些时间 ,对这个源码研读分析了一翻.大概了解了一下,

从这个作品中,可以看bob版主在N久以前就对凌阳数据了如指掌了;大概花了无数的精力,反汇编出来的吧;

这份源码里面有一个凌阳的数据处理类,-->SunPlus类, 所有的凌阳数据处理工作都由它完成 ,

从读取数据,解密数据,分段数据解压数据,查看遥控码,面板码,图片,,压缩还原全部由Sunplus类完成;

发个截图, [attachment=228125]

今天先解说stk的判数据数据加扰类型方法.是我们论坛上所有师傅都想不到的方法哟,非常精炼;


bool SunPlus::DecryptFirmware(const char *RomFile)
{
  unsigned char buffer[128];//申请128字节内存空间,变量名:buffer
  unsigned long v0, v2, v3;//申明无符号长整型 v0 v1 v2
  FILE *fRom, *fModule;//申明两个文件指针,rom和模块文件,这是bob版主的早期软件,使用文件流,后来的版本全是内存操作的,文件流操作,效率低一些.不过,我们学的是bob版主的数据解析技巧.所以不管这个了.

  if((sData->ModuleSize[MODUAL_ROM] = GetSizeRom(RomFile)) < 0x400)//判断数据是不是大于0x400字节,如果小于,就不是凌阳数据了.
      return false; // Error,如果不是凌阳数据,返回

  if((fRom = fopen(RomFile, "rb")) == NULL)//打开rom文件如果不成功,就反回
      return false; // Error,就反回

  sprintf(filename, "%s/%s.bin", sTemp, NameModule[MODUAL_ROML]);//给roml文件名放到变量filename中,

  if((fModule = fopen(filename, "wb")) == NULL)//如果打开文件roml.bin失败,就执行下面两句,关闭文件流.
  {
      fclose(fRom);//关闭rom文件流
      return false;//返回
  }

  fread(buffer, 1, 0x40, fRom); // Unencrypted data,读取rom前面0x40个字节,就是64个字节,
  fwrite(buffer, 1, 0x40, fModule);把上面读的64个字节,写到roml文件里面,因为这64个是无需解扰的.
  v0 = buffer[0x30] + buffer[0x31]*0x100 + buffer[0x32]*0x10000 + buffer[0x33]*0x1000000; // mpeg_ui, 给变量v0,赋值,取的是rom的0x30至0x33,stk里面管它叫解码,这四个字节是关键,可以判断数据类型
  fread(buffer, 1, 128, fRom);读取rom文件128个字节,从第65个字节开始读取,
  v2 = (buffer[0x04] ^ 0xA5) + ((buffer[0x05] ^ 0xA5)*0x100) + ((buffer[0x06] ^ 0xA5)*0x10000) + ((buffer[0x07] ^ 0xA5)*0x1000000);//这个就是从上面读取的字节中,第五个字节开始,取出四个字节值,作用是和前面的解码字节比较.如果一样的话,就是02d加扰方式.

  v3 = (buffer[0x10] ^ key128[0x10]) + ((buffer[0x11] ^ key128[0x11])*0x100) + ((buffer[0x12] ^ key128[0x12])*0x10000) + ((buffer[0x13] ^ key128[0x13])*0x1000000);///这个就是从上面读取的字节中,第11个字节开始,取出四个字节值,作用是和前面的解码字节比较.如果一样的话,就是02l加扰方式.

下面就是比较,确定是哪一种加扰方式.
  if(v0 == v2)
      sData->XBencoding = XB2;//02d加扰方式,
  else if(v0 == v3)
      sData->XBencoding = XB3;//02l加扰方式
  else
  {
      sData->XBencoding = XBunknow;//未知道加扰方式;
      fclose(fRom);
      return false;
  }

再上一张图片,凌阳数据,取数据加扰类型判断点.

今天就说这些,以后不定期给大家解说stk的精彩之处
本帖最近评分记录: 2 条评分