2012-11-20 55 views
0

作爲我的計算機安全課程的一部分,我正在解析hiberfil.sys文件,尋找PNG文件。我正在C中嘗試這個。我已經準備好了邏輯,當涉及到指針和C時,我完全感到困惑。我無法編譯以下代碼:解析png圖像的hiberfil.sys文件

#include<stdio.h> 
    #include<string.h> 
    int main(void) 
    { 
     FILE* fd = NULL; 
     FILE* out = NULL; 
     unsigned char* buff; 
     unsigned char* chunk[1024]; 
     fd = fopen("hiberfil.sys","r"); 
     out = fopen("a.png","w+"); 
     if(NULL == fd) 
     { 
       printf("\n fopen() Error!!!\n"); 
       return 1; 
     } 
     fread(buff,2,1,fd); 
     while(1){ 
     if(*buff==137){ 
      fread(buff,2,1,fd); 
      if(*buff==80){ 
       fread(buff,2,1,fd); 
       if(*buff==78){ 
        fread(buff,2,1,fd); 
        if(*buff==71){ 
         fread(buff,2,1,fd); 
         if(*buff==13){ 
          fread(buff,2,1,fd); 
          if(*buff==10){ 
           fread(buff,2,1,fd); 
           if(*buff==26){ 
            fread(buff,2,1,fd); 
            if(*buff==10){ 
             int * a,b,c,d,e,f,g,h,i; 
             *a=137; 
             *b=80; 
             *c=78; 
             *d=71; 
             *e=13; 
             *f=10; 
             *g=26; 
             *h=10; 
             fwrite(a,2,1,out); 
             fwrite(b,2,1,out); 
             fwrite(c,2,1,out); 
             fwrite(d,2,1,out); 
             fwrite(e,2,1,out); 
             fwrite(f,2,1,out); 
             fwrite(g,2,1,out); 
             fwrite(h,2,1,out); 
             break; 
            } 
            else continue; 
           } 
           else continue; 
          } 
          else continue; 
         } 
         else continue; 
        } 
        else continue; 
       } 
       else continue; 
      } 
      else fread(buff,2,1,fd); 
     } 
     } 
     unsigned char type[4]=0; 
     while(type[0]!=73 || type[1]!=69 || type[2]!=78 || type[3]!=68){ 
     fread(length,sizeof(int),1,fd); 
     fread(type,4,1,fd); 
     fread(chunk,length+4,1,fd); 
     fwrite(length,sizeof(int),1,out); 
      fwrite(type,4,1,out); 
     fwrite(chunk,length+8,1,out); 
     } 
    fclose(fd); 
     fclose(out); 
     return 0; 

    } 

非常感謝! PS:有人可以幫助我的代碼塊的格式!
編輯有錯誤

error: invalid type argument of unary ‘*’ (have ‘int’) <<<< Refering to int * pointers

error: initializing argument 1 of ‘size_t fwrite(const void*, size_t, size_t, FILE*)’ <<<< Refering to int length i believe.

他們現在看起來微不足道給我,但還是說明小劑量會幫助我。至於這些指針呢?

+1

Holy Moly!這很複雜。也許尋找一種方式來重構它與數據結構和循環? – wallyk

回答

1

錯誤之一是:

int * a,b,c,d,e,f,g,h,i; 
*a=137; 
*b=80; 
*c=78; 

,因爲只有aint*,變量的其餘均爲int類型。糾正在一行上聲明(這是更可讀性,使這個錯誤不太可能)或在每個變量名前加一個*

另一個錯誤(未編譯錯誤)是利用buff,這是當它用於一個unitialised指針:

unsigned char* buff; 
/* snip ... */ 
fread(buff,2,1,fd); 

一種可能的解決方法是:

unsigned char buff[2]; /* As 2 bytes appears to be required size. */ 
+0

哈哈好的,這清除了大部分的錯誤! – digvijay91

+0

Woohoooo !!沒有錯誤!感謝名單! =) – digvijay91

+1

@ digvijay91,沒問題。但是,最明顯的編譯錯誤並不等於沒有錯誤。我不確定你使用的是什麼編譯器,但是編譯時的警告級別最高,並且要注意它們(或者最好將警告視爲錯誤)。 – hmjd

0

除了hmjd的答案你應該考慮一個類型的數組可以被索引。您不必僅解除引用第一項。

因此可以這樣說buff[i](如果說,聲明爲unsigned char buff[1024];),其中isize_t或你,而你去增加int

一般來說,如果您在檢測到它是否爲一個塊時運行到第一塊塊的末尾,則更有意義 - 因爲您最初的想法似乎已經 - 讀取了大塊數據,然後只讀取下一塊PNG文件與否。

所以基本上你通讀了hiberfil.sys,直到你在循環中打開文件的末尾。在這個循環中,您可以跟蹤單個塊和前面的塊。例如可以作爲環形緩衝區來完成。然後你在該塊上運行檢測代碼(單獨的函數,通過引用傳遞塊),並且 - 例如 - 將偏移量從檢測函數返回到塊中。通過這種方式,您還可以知道hiberfil.sys的偏移情況,以便在需要時提取PNG文件。

也許還讀了this