.png和.jpg文件的解密

For*_*ill 1 encryption png jpeg assets

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

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

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

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

usr*_*301 6

标题"CF10"似乎是一个私人添加的签名,表示文件的其余部分是"编码"的.这是一个非常简单的XOR编码:这是xor 8Dh我尝试的第一个值,我第一次也做对了.背后的理由试图作为第一个值是值8D的前100个字节,或者,所以,他们通常可能有很多零的非常频繁发生.

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

解码图像

文件扩展名可能是也可能不是原始文件扩展名; 一个名为".jpg"的样本实际上也是一个PNG文件,正如其标题签名所示.

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

  1. 读取输入文件的前4个字节(最大值)并测试它是否形成字符串 CF10
  2. 如果没有,则不对文件进行编码:
    a.写入CF10输出文件
    b.通过应用xor 8Dh每个字节来编码图像
  3. 如果是的话,
    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;
}
Run Code Online (Sandbox Code Playgroud)