.png和.jpg文件的解密

时间:2014-10-18 16:44:57

标签: encryption png jpeg assets

我正在尝试修改我正在使用的软件的图形资产(对于审美侮辱,我想很难做出对图形资产有害的事情)但开发人员加密了它们。我不确定他为什么决定这样做,因为我使用并修改了一堆类似的软件,并且开发人员没有打扰(因为我看不出有必要加密这些资产)。

所以这里是这些加密图形资产的例子:

http://www.mediafire.com/view/sx2yc0w5wkr9m2h/avatars_50-alpha.jpg http://www.mediafire.com/download/i4fc52438hkp55l/avatars_80.png

有没有办法解密那些?如果是这样我该怎么办呢?

2 个答案:

答案 0 :(得分:6)

标题" CF10"似乎是一个私人添加的签名,表示文件的其余部分是"编码"。这是一个非常简单的XOR编码:xor 8Dh是我尝试过的第一个值,我第一次也做对了。 尝试背后的原因是第一个值是值8D在前100个字节中非常频繁地出现,或者它们通常可能有很多零。

"解密"因此非常简单:如果文件以四个字节CF10开头,请删除它们并在文件的其余部分应用xor 8Dh。解码文件显示第一个" JPG"实际上是一个很小的PNG图像(并不是一个非常有趣的启动),第二个确实是一个PNG文件:

decoded image

文件扩展名可能是也可能不是原始文件扩展名;一个名为" .jpg"实际上也是一个PNG文件,可以从其标题签名中看出。

以下快速而肮脏的C源将解码图像。同样的程序也可以调整为编码它们,因为xor操作完全相同。唯一需要的是添加一些逻辑流程:

  1. 读取输入文件的前4个字节(最大值)并测试它是否形成字符串CF10
  2. 如果没有,则不对文件进行编码:
    一个。将CF10写入输出文件
    湾通过在每个字节上应用xor 8Dh来编码图像
  3. 如果是的话,
    湾通过在每个字节上应用xor 8Dh来解码图像。
  4. 正如你所看到的,没有" 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;
    }
    

答案 1 :(得分:0)

好的,当谈到@Jongware提供的代码的实际使用时我不清楚 - 我在一些帮助下想出来了:)

  1. 我使用Visual Studio编译了代码(您可以找到有关如何执行此操作的指南,基本上可以创建新的Visual C ++项目,并在Project中使用&gt; Project Propeties选择C / C ++ - &gt;所有选项和编译为C代码( / TC))。
  2. 然后我使用参数&#34; program encrypted_file decrypted_file&#34;在命令提示符下打开程序。
  3. 非常感谢Jongware的帮助!