【问题标题】:Decryption of .png and .jpg files.png 和 .jpg 文件的解密
【发布时间】:2014-10-23 05:21:49
【问题描述】:

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

无论如何,这里是那些加密图形资产的示例:

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

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

【问题讨论】:

标签: encryption png jpeg assets


【解决方案1】:

标头“CF10”似乎是一个私人添加的签名,表示文件的其余部分已“编码”。这是一个非常简单的 XOR 编码:xor 8Dh 是我尝试的第一个值,而且我第一次就做对了。 尝试作为第一个值的原因是,8D 值在前 100 个字节左右出现非常频繁,它们通常可能是很多零。

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

文件扩展名可能是也可能不是原始文件扩展名;一个名为“.jpg”的样本实际上也是一个 PNG 文件,从它的标题签名可以看出。

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

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

【讨论】:

  • 还没有尝试过,但从我上面看到的情况来看,很明显它会起作用。你先生是个畜生。太感谢了。我会将您的帖子标记为解决方案,但如果您稍后回答这些问题,我可能会有后续问题。再次先生。你摇滚。
  • 好吧,我以为我自己可以做到,但不幸的是我的编程知识非常有限(我只知道一些c#和JavaScript基础,我主要用我的图形设计技能来修改其他类似的软件我上面提到的并且没有对他们的文件进行编码)到我什至不确定如何编译C程序的地步......你能解释一下我应该如何使用你上面提供的代码吗? (如何编译它,如何“显示”我要解密的这个程序文件等?)。我会非常守门。
  • 抱歉,对于 Stack Overflow 的答案来说,方式太宽泛了。请使用谷歌。编译后,当没有给出参数时显示它的使用。
  • 很公平。我认为几个小时的研究应该可以解决问题。再次感谢您的帮助:)
  • 好的,我做了我的研究。我现在知道如何在 Visual Studio 中编译和构建 C 代码。我仍然不明白 lvl 上的 C 语法,让我理解你的代码。但由于我的最后一个问题太宽泛,我现在要问一个具体的问题:) 如何修改您在上面发布的代码以预定义我要解密的文件的路径(例如 c:\documents\fileIWantToDecrypt.png)。这应该比让程序要求用户输入路径更容易。
【解决方案2】:

好的,当涉及到@Jongware 提供的代码的实际用法时,我不清楚 - 我在一些帮助下想通了:)

  1. 我使用 Visual Studio 编译了代码(您可以找到有关如何执行此操作的指南,基本上是创建新的 Visual C++ 项目并在项目 -> 项目属性中选择 C/C++ -> 所有选项并编译为 C 代码 (/TC ))。
  2. 然后我在命令提示符下使用参数“program encrypted_file decrypted_file”打开了程序。

非常感谢Jongware的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2013-05-02
    • 2020-03-05
    • 2017-06-16
    • 2021-04-06
    • 2021-09-03
    • 2018-06-12
    相关资源
    最近更新 更多