Boa 发表于 2021-11-8 08:39

[源码开源] DOF 的 PVF文件的、解密、解包、原理分析(请大家继续完善)


本帖最后由 sony09090 于 2019-4-25 12:19 编辑




**** Hidden Message *****
本帖隐藏的内容**** Hidden Message *****



==============易源码====================


本帖隐藏的内容.版本 2
.支持库 spec
.支持库 EThread


.子程序 取树列表
.参数 文本型, 文本型
.局部变量 文件长度
.局部变量 目录树_数据, 字节集


_启动窗口.标题 = “解密中请耐心等待”


文件 = 文本型
文件号 = 打开文件 (文件, 1, )
' 文件长度 = 取文件长度 (文件号)


读入数据 (文件号, 头信息.GUID长度)
头信息.GUID = 读入字节集 (文件号, 头信息.GUID长度)
读入数据 (文件号, 头信息.文件版本)
读入数据 (文件号, 头信息.目录树长度)
读入数据 (文件号, 头信息.目录树效验)
读入数据 (文件号, 头信息.总文件数量)


' 调试输出 (“PVF文件长度”, 文件长度)
调试输出 (“GUID长度”, 头信息.GUID长度)
调试输出 (“GUID”, 头信息.GUID)
调试输出 (“文件版本”, 头信息.文件版本)
调试输出 (“目录树长度”, 头信息.目录树长度)
调试输出 (“目录树效验”, 头信息.目录树效验)
调试输出 (“总文件数量”, 头信息.总文件数量)


目录树_数据 = 读入字节集 (文件号, 头信息.目录树长度)
api_decryptTreeBlock (目录树_数据, 头信息.目录树长度, 头信息.总文件数量, 头信息.目录树效验, 头信息.目录树效验) 'C源码实现(继续往下看有源码)


关闭文件 (文件号)


文件号 = 打开内存文件 ()
写出字节集 (文件号, 目录树_数据)
移到文件首 (文件号)
启动线程 (&处理树数据, 文件号, )



==============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;
}
}


xinxinxinxin 发表于 2022-5-14 01:02

666666666666666666666666

baixingjian8 发表于 2022-6-24 17:57

、解密、解包、原理分析

a13251500978 发表于 2022-8-10 05:47

非常好,非常需要

ss5100020 发表于 2023-9-7 17:00

ing明明您咯咯
页: [1]
查看完整版本: [源码开源] DOF 的 PVF文件的、解密、解包、原理分析(请大家继续完善)