首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.png和.jpg文件的解密

.png和.jpg文件的解密
EN

Stack Overflow用户
提问于 2014-10-19 00:44:57
回答 2查看 24.1K关注 0票数 3

我正在尝试修改我正在使用的软件的图形资产(对于美观的伪装,我猜很难用图形资产做一些有害的事情),但开发人员对它们进行了加密。我不知道他为什么决定这么做,因为我使用和修改了一大堆类似的软件,而这些软件的开发人员并不费心(因为我看不出有必要对这些资产进行加密)。

因此,不管怎样,下面是这些加密图形资产的示例:

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

有没有办法解密这些东西?如果是这样的话,我应该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-19 02:22:00

标题"CF10“似乎是私人添加的签名,表示文件的其余部分已”编码“。这是一个非常简单的异或编码:xor 8Dh是我尝试的第一个值,我第一次也得到了正确的结果。尝试将其作为第一个值背后的原因是,值8D经常出现在前100个字节中,其中它们通常是许多零。

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

文件扩展名可能是也可能不是原始文件扩展名;名为".jpg“的示例实际上也是PNG文件,从其头签名可以看出这一点。

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

not读取输入文件的前4个字节(最大值),并测试如果这形成字符串CF10

  • if
  1. ,则该文件未编码:

a.将CF10写入输出文件

b.通过在每个字节_

  • 上应用xor 8Dh来编码图像。如果是,

b.通过对每个字节应用xor 8Dh来解码图像。

正如您所看到的,没有"3a“,两个"b”步骤是相同的。

代码语言:javascript
复制
#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;
}
票数 9
EN

Stack Overflow用户

发布于 2014-10-19 08:57:27

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

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

非常感谢Jongware的帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26442162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档