解析png图像的hiberfil.sys文件

时间:2012-11-20 22:47:15

标签: c

作为我的计算机安全课程的一部分,我正在解析一个hiberfil.sys文件,查找PNG文件。我在C中尝试这个。我已经准备好了逻辑,当涉及指针和C时,我完全糊涂了。我无法编译以下代码:

    #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:有人可以帮我解决代码块的格式问题!
编辑错误

  

错误:一元'*'的无效类型参数(有'int')&lt;&lt;&lt;&lt;参考int *指针

     

错误:初始化'size_t fwrite(const void *,size_t,size_t,FILE *)'的参数1&lt;&lt;&lt;&lt;参考int length我相信。   

他们现在对我来说似乎微不足道,但仍有一小部分解释会对我有所帮助。这些指针是什么?

2 个答案:

答案 0 :(得分:1)

一个错误是:

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

由于只有aint*,其余变量属于int类型。要纠正在一行上声明(更易读并且不太可能犯这个错误)或在每个变量名之前放置*

另一个错误(不是编译器错误)是使用buff,它是一个使用它时的单位指针:

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

可能的解决方法是:

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

答案 1 :(得分:0)

除了hmjd的答案,你应该考虑一个类型的数组可以被索引。您不必仅取消引用第一项。

因此,您可以说buff[i](如果,例如,声明为unsigned char buff[1024];),isize_tint,当您增加时去。

一般来说,更有意义的是 - 正如你最初的想法似乎已经 - 读取数据块然后只有在你仍在检测它是否是PNG时遇到第一个块的末尾才读取下一个块文件与否。

所以基本上你通读了hiberfil.sys,直到你在一个循环中到达文件的末尾。在此循环中,您可以跟踪单个块以及前面的块。例如,可以作为环形缓冲区完成。然后在该块上运行检测代码(单独的函数,通过引用传递块),并且 - 例如 - 将偏移量从检测函数返回到块中。这样您就可以知道hiberfil.sys的偏移量,以备不时之需,然后提取PNG文件。

也许还会阅读this