我正在尝试修改我正在使用的软件的图形资产(对于美观的伪装,我猜很难用图形资产做一些有害的事情),但开发人员对它们进行了加密。我不知道他为什么决定这么做,因为我使用和修改了一大堆类似的软件,而这些软件的开发人员并不费心(因为我看不出有必要对这些资产进行加密)。
因此,不管怎样,下面是这些加密图形资产的示例:
http://www.mediafire.com/view/sx2yc0w5wkr9m2h/avatars_50-alpha.jpg http://www.mediafire.com/download/i4fc52438hkp55l/avatars_80.png
有没有办法解密这些东西?如果是这样的话,我应该怎么做呢?
发布于 2014-10-19 02:22:00
标题"CF10“似乎是私人添加的签名,表示文件的其余部分已”编码“。这是一个非常简单的异或编码:xor 8Dh是我尝试的第一个值,我第一次也得到了正确的结果。尝试将其作为第一个值背后的原因是,值8D经常出现在前100个字节中,其中它们通常是许多零。
因此,“解密”非常简单:如果文件以四个字节的CF10开头,则删除它们并对文件的其余部分应用xor 8Dh。解码文件显示,第一个"JPG“实际上是一个很小的PNG图像(对于引导来说不是一个非常有趣的图像),第二个实际上是一个PNG文件:

文件扩展名可能是也可能不是原始文件扩展名;名为".jpg“的示例实际上也是PNG文件,从其头签名可以看出这一点。
下面的快速C源代码将对图像进行解码。可以调整相同的程序来对它们进行编码,因为xor操作是完全相同的。唯一需要做的就是添加一些逻辑流程:
not读取输入文件的前4个字节(最大值),并测试如果这形成字符串CF10
a.将CF10写入输出文件
b.通过在每个字节_
xor 8Dh来编码图像。如果是,b.通过对每个字节应用xor 8Dh来解码图像。
正如您所看到的,没有"3a“,两个"b”步骤是相同的。
#include <stdio.h>
#include <string.h>
#ifndef MAX_PATH
#define MAX_PATH 256
#endif
#define INPUTPATH "c:\\documents"
#define OUTPUTPATH ""
int main (int argc, char **argv)
{
FILE *inp, *outp;
int i, encode_flag = 0;
char filename_buffer[MAX_PATH];
char sig[] = "CF10", *ptr;
if (argc != 3)
{
printf ("usage: decode [input] [output]\n");
return -1;
}
filename_buffer[0] = 0;
if (!strchr(argv[1], '/') && !strchr(argv[1], 92) && !strchr(argv[1], ':'))
strcpy (filename_buffer, INPUTPATH);
strcat (filename_buffer, argv[1]);
inp = fopen (filename_buffer, "rb");
if (inp == NULL)
{
printf ("bad input file '%s'\n", filename_buffer);
return -2;
}
ptr = sig;
while (*ptr)
{
i = fgetc (inp);
if (*ptr != i)
{
encode_flag = 1;
break;
}
ptr++;
}
if (encode_flag)
{
/* rewind file because we already read some bytes */
fseek (inp, 0, SEEK_SET);
printf ("encoding input file: '%s'\n", filename_buffer);
} else
printf ("decoding input file: '%s'\n", filename_buffer);
filename_buffer[0] = 0;
if (!strchr(argv[2], '/') && !strchr(argv[2], 92) && !strchr(argv[2], ':'))
strcpy (filename_buffer, OUTPUTPATH);
strcat (filename_buffer, argv[2]);
outp = fopen (filename_buffer, "wb");
if (outp == NULL)
{
printf ("bad output file '%s'\n", filename_buffer);
return -2;
}
printf ("output file: '%s'\n", filename_buffer);
if (encode_flag)
fwrite (sig, 1, 4, outp);
do
{
i = fgetc(inp);
if (i != EOF)
fputc (i ^ 0x8d, outp);
} while (i != EOF);
fclose (inp);
fclose (outp);
printf ("all done. bye bye\n");
return 0;
}发布于 2014-10-19 08:57:27
好的,所以当涉及到@Jongware提供的代码的实际用法时,我不清楚-我在一些帮助下弄清楚了:)
非常感谢Jongware的帮助!
https://stackoverflow.com/questions/26442162
复制相似问题