[源码开源] DOF 的 PVF文件的、解密、解包、原理分析
链接: https://pan.baidu.com/s/1jFbJG1xL6OoQC7xsw5QsQw 提取码: cpcf 复制这段内容后打开百度网盘手机App,操作更方便哦
--来自百度网盘超级会员v5的分享
https://img.iopq.net/forum/201904/25/121352u6kyjxy6zr2z57xv.jpg.thumb.jpg
.版本 2
.支持库 spec
.支持库 EThread
.子程序 取树列表
.参数 文本型, 文本型
.局部变量 文件长度
.局部变量 目录树_数据, 字节集
_启动窗口.标题 = “解密中请耐心等待”
文件 = 文本型
文件号 = 打开文件 (文件, 1, )
' 文件长度 = 取文件长度 (文件号)
读入数据 (文件号, 头信息.GUID长度)
头信息.GUID = 读入字节集 (文件号, 头信息.GUID长度)
读入数据 (文件号, 头信息.文件版本)
读入数据 (文件号, 头信息.目录树长度)
读入数据 (文件号, 头信息.目录树效验)
读入数据 (文件号, 头信息.总文件数量)
' 调试输出 (“PVF文件长度”, 文件长度)
调试输出 (“GUID长度”, 头信息.GUID长度)
调试输出 (“GUID”, 头信息.GUID)
调试输出 (“文件版本”, 头信息.文件版本)
调试输出 (“目录树长度”, 头信息.目录树长度)
调试输出 (“目录树效验”, 头信息.目录树效验)
调试输出 (“总文件数量”, 头信息.总文件数量)
目录树_数据 = 读入字节集 (文件号, 头信息.目录树长度)
api_decryptTreeBlock (目录树_数据, 头信息.目录树长度, 头信息.总文件数量, 头信息.目录树效验, 头信息.目录树效验) 'C源码实现(继续往下看有源码)
关闭文件 (文件号)
文件号 = 打开内存文件 ()
写出字节集 (文件号, 目录树_数据)
移到文件首 (文件号)
启动线程 (&处理树数据, 文件号, )
int PvfPlayer::_decryptTreeBlock(unsigned char* buf, unsigned int bufLen, int numberOfFiles, int checkSumCheck, int checksumUse)
{
unsigned int bufLenv5; // ebx@1
unsigned char *bufv6; // esi@1
int result; // eax@2
unsigned char * bufEnd; // edx@3
unsigned int v9; // eax@3
unsigned char * i; // ecx@3
unsigned int v11; // esi@4
unsigned int v12; // eax@4
unsigned int v13; // eax@4
unsigned int v14; // eax@4
unsigned int v15; // @3
bufLenv5 = bufLen;
bufv6 = buf;
if (bufLen & 3) // bufLen shall be fold of 4
{
result = 0;
}
else
{
this->_sub_311820(v15);
bufEnd = bufv6 + 4 * (bufLenv5 >> 2); // >>2 then * 4, this is truncation
v9 = ~numberOfFiles;
for (i = bufv6; i != bufEnd; i += 4)
{
v11 = __ROR4__(checksumUse ^ *(unsigned int *)i ^ 0x81A79011, 6);
*(unsigned int *)i = v11;
v12 = v15[(unsigned char)v9 ^ *(unsigned char *)i] ^ (v9 >> 8);
v13 = v15[(unsigned char)v12 ^ *(unsigned char *)(i + 1)] ^ (v12 >> 8);
v14 = v15[(unsigned char)v13 ^ *(unsigned char *)(i + 2)] ^ (v13 >> 8);
v9 = v15[(unsigned char)v14 ^ *(unsigned char *)(i + 3)] ^ (v14 >> 8);
}
result = ~v9 == checkSumCheck;
}
return result;
}
unsigned int PvfPlayer::_sub_311820(unsigned int *a1)
{
unsigned int v1; // ecx@1
unsigned int v2; // esi@1
unsigned int result; // eax@2
unsigned int *v4; // edx@2
v1 = 1;
*a1 = 0;
v2 = 128;
do
{
v1 = ((v1 & 1) != 0 ? 0xEDB88320 : 0) ^ (v1 >> 1);
result = 0;
v4 = &a1;
do
{
*v4 = v1 ^ a1;
result += 2 * v2;
v4 += 2 * v2;
} while (result <= 0xFF);
v2 >>= 1;
} while (v2);
return result;
}
}
页:
[1]