找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1116|回复: 0

[搬砖分享] [源码开源] DOF 的 PVF文件的、解密、解包、原理分析

[复制链接]

773

主题

85

回帖

8363

积分

版主

积分
8363
发表于 2023-7-17 20:10:13 | 显示全部楼层 |阅读模式

链接: https://pan.baidu.com/s/1jFbJG1xL6OoQC7xsw5QsQw 提取码: cpcf 复制这段内容后打开百度网盘手机App,操作更方便哦
--来自百度网盘超级会员v5的分享






.版本 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[256]; // [sp+8h] [bp-404h]@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[v2];
do
{
*v4 = v1 ^ a1[result];
result += 2 * v2;
v4 += 2 * v2;
} while (result <= 0xFF);
v2 >>= 1;
} while (v2);
return result;
}
}

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|微头条|DMCA|欧基零壹

GMT+8, 2024-12-22 22:12 , Processed in 0.153097 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表