现在可以确定增量压缩的类型了
这两天,闲羊无事,把系统的 wcp.dll 反编译一下,终于搞清楚了增量压缩的种类了,也证明了以前的判断基本上是正确的。
系统 | 种类 | 返回码 |
---|---|---|
Win8.1 | 出错 | 0 |
win8.1 | DCD | 1 |
Win8.1 | DCN | 2 |
Win8.1 | DCH | 3 |
Win8.1 | DCM | 4 |
Win10 | DCS | 5 |
Win10 | DCX | 6 |
Win10 | 出错 | 8 |
说是出错,可能不准确,实量就是非增量压缩的类型。
win8.1 的代码:
__int64 __fastcall 判断DC前4位(__int64 a1)
{
signed int v1; // edx@1
__int64 v2; // rax@2
v1 = 0;
if ( *(_QWORD *)a1 >= 4ui64 )
{
v2 = *(_QWORD *)(a1 + 16);
if ( *(_BYTE *)v2 == 68 && *(_BYTE *)(v2 + 1) == 67 && *(_BYTE *)(v2 + 3) == 1 )
{
switch ( *(_BYTE *)(v2 + 2) )
{
case 0x44:
v1 = 1;
break;
case 0x48:
v1 = 3;
break;
case 0x4D:
v1 = 4;
break;
case 0x4E:
v1 = 2;
break;
}
}
}
return (unsigned int)v1;
}
Win10 的代码:
__int64 __fastcall Windows::WCP::Rtl::GetCompressedFileType(Windows::WCP::Rtl *this, const struct _LBLOB *a2)
{
signed int v2; // ebx@1
__int64 v3; // rax@2
v2 = 0;
if ( *(_QWORD *)this < 4ui64
|| (v3 = *((_QWORD *)this + 2), *(_BYTE *)v3 != 68)
|| *(_BYTE *)(v3 + 1) != 67
|| *(_BYTE *)(v3 + 3) != 1 )
{
if ( (unsigned __int8)sub_180203180((__int64)this) )
v2 = 8;
}
else
{
switch ( *(_BYTE *)(v3 + 2) )
{
case 0x44: //D
v2 = 1;
break;
case 0x48: //H
v2 = 3;
break;
case 0x4D: //M
v2 = 4;
break;
case 0x4E: //N
v2 = 2;
break;
case 0x53: //S
v2 = 5;
break;
case 0x58: //X
v2 = 6;
break;
}
}
return (unsigned int)v2;
}