1

ファイル内のいくつかの 24 ビット ビットマップを「盗聴」するために使用できる C# で WinForm アプリケーションを作成しています。そのオフセット、ファイルへの書き込み方法に関する分析、およびその長さなどの情報を既に収集しました。

したがって、ファイルに関する詳細情報は次のとおりです。

  • BMP データが逆に書き込まれます。(例: (255 0 0) は (0 0 255) と書きます)
  • BMP ヘッダーはありません。BMP の画像データのチャンクのみ。
  • PixelFormat は 24 ビットです。
  • その BMP は純粋なマゼンタです。(RGB で 255 0 255)

私は次のコードを使用しています:

            using (FileStream fs = new FileStream(@"E:\MyFile.exe", FileMode.Open))
            {
                    int width = 190;
                    int height = 219;
                    int StartOffset = 333333;   // Just a sample offset

                    Bitmap tmp_bitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

                    Rectangle rect = new Rectangle(0, 0, tmp_bitmap.Width, tmp_bitmap.Height);
                    System.Drawing.Imaging.BitmapData bmpData =
                        tmp_bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
                        tmp_bitmap.PixelFormat);

                    unsafe
                    {
                        // Get address of first pixel on bitmap.
                        byte* ptr = (byte*)bmpData.Scan0;

                        int bytes = width * height * 3; //124830 [Total Length from 190x219 24 Bit Bitmap]

                        int b;  // Individual Byte

                        for (int i = 0; i < bytes; i++)
                        {
                            fs.Position = StartOffset - i;  // Change the fs' Position [Subtract since I'm reading in reverse]
                            b = fs.ReadByte();              // Reads one byte from its position

                            *ptr = Convert.ToByte(b);   // Record byte
                            ptr ++;
                        }
                        // Unlock the bits.
                        tmp_bitmap.UnlockBits(bmpData);
                    }
                    pictureBox1.Image =  tmp_bitmap;
                }

この出力が得られます。その理由は、次の行にヒットするたびにバイトがめちゃくちゃになっているためだと思います。(255 0 255 が 0 255 255 になり、255 255 0 になるまで続きます)

出力

これを修正するのを手伝ってくれることを願っています。事前にどうもありがとうございました。

解決策 このコードを追加することで修正されました(私の友人の助けとJames Holdernessから提供された情報を利用して)

if (width % 4 != 0)
    if ((i + 1) % (width * 3) == 0 && (i + 1) * 3 % width < width - 1)
         ptr += 2;

どうもありがとうございました!

4

1 に答える 1

4

標準の BMP の場合、個々のスキャン ラインは 4 バイトの倍数である必要があるため、24 ビット イメージ (ピクセルあたり 3 バイト) がある場合は、各スキャン ラインの末尾にパディングを追加して画像を表示する必要があります。 4の倍数まで。

たとえば、幅が 150 ピクセルの場合、それは 450 バイトであり、4 の倍数にするために 452 に切り上げる必要があります。

それがあなたがここで抱えている問題かもしれないと思います。

于 2013-05-12T18:22:08.233 に答える