12

だからここに私の問題があります。編集したいバイナリファイルがあります。もちろん、16 進エディタを使用して編集できますが、この特定のファイルを編集するためのプログラムを作成する必要があります。編集したい特定の16進数を知っているとしましょう。それがアドレスなどであることも知っています。それが16ビットのバイナリで、アドレスが00000000で、行04にあり、値が02であるとしましょう。その 16 進数の値を変更し、ボタンをクリックするだけでその 16 進数のみを変更するプログラムはありますか?

同様のことについて話しているリソースを見つけましたが、正確な問題のヘルプを見つけることはできません。

答えがある場合は答えを教えてくれるだけでなく、少し説明してみてください。

4

2 に答える 2

24

これは、具体的な例で説明するのが最も適切だと思います。Visual Studio の 16 進エディターに表示される実行可能ファイルの最初の 32 バイトを次に示します。

00000000  4D 5A 90 00 03 00 00 00  04 00 00 00 FF FF 00 00
00000010  B8 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00

現在、ファイルは実際には単なる線形シーケンスのバイトです。16 進エディタに表示される行は、読みやすくするためのものです。コードを使用してファイル内のバイトを操作する場合は、バイトを 0 から始まる位置で識別する必要があります。上記の例では、ゼロ以外のバイトの位置は次のとおりです。

Position  Value
--------  ------
  0        0x4D
  1        0x5A
  2        0x90
  4        0x03
  8        0x04
 12        0xFF
 13        0xFF
 16        0xB8
 24        0x40

上に示した 16 進エディタの表現では、左側の数字は、対応する行の最初のバイトの位置を表しています。エディターは 1 行あたり 16 バイトを表示しているため、各行で 16 (0x10) ずつ増加します。

ファイル内のバイトの 1 つを取得してその値を変更するだけの場合、最も効率的な方法は、FileStream を使用してファイルを開き、適切な位置をシークして、そのバイトを上書きすることです。たとえば、以下は位置 24 の 0x40 を 0x04 に変更します。

using (var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) {
    stream.Position = 24;
    stream.WriteByte(0x04);
}
于 2010-07-10T05:20:28.973 に答える
1

まず最初に変換を理解する必要があります。16 進数から 10 進数はおそらくそれほど重要ではありません (もちろん、最初に 10 進数から値を変更する必要がある場合を除きますが、これは単純な変換式です) が、各 16 進数文字 (0-9、AF ) は、特定のバイナリ出力に対応します。

そのことを理解したら、次のステップは、検索対象を正確に把握し、適切な変換を行い、その正確な文字列を置き換えることです。(バッファーが大きすぎない場合) 16 進ダンプ全体を取得し、そこで検索しているものをすべて置き換えて、重複したバイナリ シーケンスを上書きしないようにすることをお勧めします。

それが役立つことを願っています!

よろしく、
デニス M.

于 2010-07-10T03:55:54.010 に答える