Расшифровка файлов.png и.jpg
Я пытаюсь изменить графические ресурсы программного обеспечения, которое я использую (для эстетических целей, я думаю, что трудно сделать что-то вредное с графическими ресурсами), но разработчик зашифровал их. Я не уверен, почему он решил сделать это, так как я использовал и модифицировал кучу подобных программ, и разработчики их не беспокоились (поскольку я не вижу причин, по которым шифрование этих ресурсов было бы необходимо).
Так или иначе, вот примеры этих зашифрованных графических ресурсов:
http://www.mediafire.com/view/sx2yc0w5wkr9m2h/avatars_50-alpha.jpg http://www.mediafire.com/download/i4fc52438hkp55l/avatars_80.png
Есть ли способ расшифровать их? Если так, как я должен идти об этом?
2 ответа
Заголовок "CF10", кажется, является частной подписью, означающей, что остальная часть файла "закодирована". Это очень простая XOR-кодировка: xor 8Dh
была первой ценностью, которую я попробовал, и я понял это правильно с первого раза. Причина, по которой это делается в качестве первого значения, заключается в том, что значение 8D
встречается очень часто в первых 100 байтах или около того, где они обычно могут иметь множество нулей.
Таким образом, "расшифровка" очень проста: если файл начинается с четырех байтов CF10
, удали их и примени xor 8Dh
на остальной части файла. Декодирование файлов показывает, что первый "JPG" на самом деле является крошечным изображением PNG (и не очень интересным для загрузки), второй действительно является файлом PNG:
Расширение файла может быть или не быть исходным расширением файла; один пример, названный ".jpg", на самом деле также является файлом PNG, что видно по его подписи в заголовке.
Следующий быстрый и грязный источник C будет декодировать изображения. Одну и ту же программу можно настроить для их кодирования, потому что xor
операция точно такая же. Нужно только добавить немного логического потока:
- прочитайте первые 4 байта (максимум) входного файла и проверьте, формирует ли это строку
CF10
- если нет, файл не закодирован:
а. записыватьCF10
в выходной файл
б. кодировать изображение, применяяxor 8Dh
на каждый байт - если так,
б. декодировать изображение, применяя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;
}
Хорошо, так что, когда дело доходит до практического использования кода, предоставленного @Jongware, который был мне неясен - я понял это с некоторой помощью:)
- Я скомпилировал код с помощью Visual Studio (вы можете найти руководства о том, как это сделать, в основном создать новый проект Visual C++ и в Project -> Свойства проекта выберите C/C++ -> Все параметры и Компилировать как код C (/TC)).
- Затем я открыл программу в командной строке, используя параметр "program encrypted_file decrypted_file".
Большое спасибо за помощь Jongware!