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

1つの間違いは次のとおりです。

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

のみaが であるint*ため、残りの変数は 型intです。修正するには、宣言を 1 行で行う (読みやすく、この間違いが起こりにくくなります) か、*各変数名の前に a を配置します。

もう 1 つの間違い (コンパイラ エラーではありません) は、使用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]、(if、たとえば、 として宣言されている場合unsigned char buff[1024];)、どこiが asize_tまたはintであると言うことができます。

一般に、最初のアイデアがそうであったように、データのチャンクを読み取り、最初のチャンクの終わりに遭遇した場合にのみ次のチャンクを読み取る方が理にかなっていますが、それが PNG ファイルであるかどうかをまだ検出しています。 .

したがって、基本的にhiberfil.sysは、ループでファイルの最後に到達するまで読み通します。このループ内で、単一のチャンクと、おそらく前のチャンクを追跡します。たとえば、リングバッファとして実行できます。次に、そのチャンクに対して検出コードを実行し (別の関数、参照によってチャンクを渡す)、たとえば、検出関数からオフセットをチャンクに返します。hiberfil.sysこのようにして、これが必要な場合に備えてへのオフセットもわかり、 PNG ファイルを抽出できます。

おそらくこれも読んでください。

于 2012-11-20T23:01:05.250 に答える