ファイル内のいくつかの 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;
どうもありがとうございました!