图片加密原理介绍
Windows 电脑版本微信通过一定的算法,计算出每个系统独一无二的 KEY(一个 byte 大小)。再通过计算出来的 KEY,对图片文件进行异或操作,生成加密的DAT文件。
.DAT文件
= KeyGen(system)
^ 图片文件
解密原理介绍
我们循环用 0x01 - 0xFF 对加密的 DAT 文件进行异或操作,再通过常用图片的文件头与其进行比较,获取到本机的 KEY。最后通过计算获得的 KEY,对图片文件进行解密。
常用图片文件文件头
JPEG 0xFF, 0xD8, 0xFF
PNG 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A
BMP 0x42, 0x4D
GIF 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 或 0x47, 0x49, 0x46, 0x38, 0x37, 0x61
TIFF 0x49, 0x49, 0x2A, 0x00 或 0x4D, 0x4D, 0x2A, 0x00
文件类型检测关键代码
switch (data[0])
{
case 0XFF: //byte[] jpg = new byte[] { 0xFF, 0xD8, 0xFF };
{
if (data[1] == 0xD8 && data[2] == 0xFF)
{
return ".jpg";
}
break;
}
case 0x89: //byte[] png = new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };
{
if (data[1] == 0x50 && data[2] == 0x4E && data[7] == 0x0A)
{
return ".png";
}
break;
}
case 0x42: //byte[] bmp = new byte[] { 0x42, 0x4D };
{
if (data[1] == 0X4D)
{
return ".bmp";
}
break;
}
case 0x47: //byte[] gif = new byte[] { 0x47, 0x49, 0x46, 0x38, 0x39(0x37), 0x61 };
{
if (data[1] == 0x49 && data[2] == 0x46 && data[3] == 0x38 && data[5] == 0x61)
{
return ".gif";
}
break;
}
case 0x49: // byte[] tif = new byte[] { 0x49, 0x49, 0x2A, 0x00 };
{
if (data[1] == 0x49 && data[2] == 0x2A && data[3] == 0x00)
{
return ".tif";
}
break;
}
case 0x4D: //byte[] tif = new byte[] { 0x4D, 0x4D, 0x2A, 0x00 };
{
if (data[1] == 0x4D && data[2] == 0x2A && data[3] == 0x00)
{
return ".tif";
}
break;
}
}
return ".dat";
密钥计算关键代码
for (byte key = 0x01; key < 0xFF; key++)
{
byte[] buf = new byte[8];
raw.CopyTo(buf, 0);
if (CheckFileType(ConvertData(buf, key)) != ".dat")
{
return key;
}
}
数据异或关键代码
for (int i = 0; i < data.Length; i++)
{
data[i] ^= key;
}