0

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

    #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')<<<<引用int *指针

错误:初始化“size_t fwrite(const void*, size_t, size_t, FILE*)”的参数 1 <<<< 我相信指的是 int 长度。

它们现在对我来说似乎微不足道,但少量的解释仍然会对我有所帮助。这些指针是怎么回事?

4

2 回答 2

1

一个错误是:

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

因为只有a一个int*,其余的变量都是类型int。要更正在一行上声明(这更易读并且不太可能出现此错误)或*在每个变量名之前放置一个。

另一个错误(不是编译器错误)是使用buff,它在使用时是一个未初始化的指针:

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

一个可能的解决方法是:

unsigned char buff[2]; /* As 2 bytes appears to be required size. */
于 2012-11-20T22:53:36.503 回答
0

除了 hmjd 的回答之外,您还应该考虑可以对类型的数组进行索引。您不必只取消引用第一项。

所以你可以说buff[i](如果,说,声明为unsigned char buff[1024];),在哪里i是 asize_t或者int你在你去的时候递增。

一般来说,更有意义的是 - 正如您最初的想法一样 - 读取数据块,然后如果在您仍在检测它是否为 PNG 文件时遇到第一个块的末尾,则仅读取下一个块.

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

或许也读过这个

于 2012-11-20T23:01:05.250 回答