2014-10-18 137 views
1

我試圖修改我使用的軟件的圖形資產(對於美學上的puroposess,我想很難對圖形資產進行有害的操作),但開發人員對它們進行了加密。我不知道爲什麼他決定這樣做,因爲我使用和修改了一堆類似的軟件和那些沒有打擾的開發人員(因爲我沒有看到爲什麼需要加密這些資產的理由)。.png和.jpg文件的解密

所以無論如何這裏是那些加密的圖形資源的例子:

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

有解密的方式?如果是的話,我應該怎麼做呢?

+1

http://stackoverflow.com/questions/113641/file-format-of-cf10-jpg – 2014-10-18 16:48:24

+0

你的第一個例子中的字符有太高的重複次數要加密。也許你看不懂,但這更多的是圖像編碼/解碼的問題。 – 2014-10-18 16:59:02

回答

6

頭文件「CF10」似乎是一個私人添加的簽名,表示文件的其餘部分是「編碼的」。這是一個非常簡單的異或編碼:xor 8Dh是我嘗試的第一個值,我也是第一次。 嘗試後面的推理原因是,作爲第一個值,值8D在前100個字節中非常頻繁地出現,其中它們通常可能大量爲零。

「解密」因此非常簡單:如果文件以四個字節0​​開頭,請刪除它們並在文件的其餘部分應用xor 8Dh。解碼文件顯示第一個「JPG」,其實是一個很小的PNG圖像(而不是一個很有趣的一個啓動),二是確實是一個PNG文件:

decoded image

文件擴展名可能會或可能不是原文文件擴展名;一個名爲「.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; 
} 
+0

還沒有嘗試過,但從我上面看到它有點顯而易見,它會工作。先生是一頭野獸。非常感謝。我會將你的帖子標記爲解決方案,但如果你以後如此友善回答,我可能會跟進問題。再一次先生。你搖滾。 – Forc3ofWill 2014-10-18 18:35:23

+0

好吧我認爲我可以自己做這件事,但不幸的是我的編程知識超級有限(我只知道一些C#和JavaScript基礎知識,我主要使用我的圖形設計技能來修改上面提到的其他類似軟件, t的文件編碼),以至於我甚至不知道如何編譯C程序......你能解釋我應該使用上面提供的代碼有多激動嗎? (如何編譯它,如何「顯示」我想解密的程序文件等?)。我會非常有把握的。 – Forc3ofWill 2014-10-18 19:39:02

+0

對不起,對於Stack Overflow答案,*方法*太寬泛。請使用Google。編譯後的usgae顯示在沒有參數給出的情況下。 – usr2564301 2014-10-18 20:03:01

0

好了,所以當它涉及到由@Jongware這是我不清楚所提供的代碼的實際應用 - 我想通了一些幫助:)

  1. 我編譯使用Visual Studio代碼(你可以找到如何做到這一點的指南,基本上創建新的Visual C++項目,並在項目 - >項目Propeties選擇C/C++ - >所有選項和編譯爲C代碼(/ TC))。
  2. 然後我使用參數「program encrypted_file decrypted_file」在命令提示符下打開程序。

非常感謝Jongware!