虽然本论坛里凌阳工具很丰富了,有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的精彩之处