Как редактировать шестнадцатеричное значение двоичного файла, используя C # - PullRequest
10 голосов
/ 10 июля 2010

Так вот моя проблема.У меня есть двоичный файл, который я хочу редактировать.Я могу, конечно, использовать редактор в шестнадцатеричном формате, но мне нужно создать программу для редактирования этого конкретного файла.Скажем, я знаю определенный гекс, который хочу отредактировать, я знаю его адрес и т. Д. Предположим, что это 16-разрядный двоичный файл, адрес 00000000, он в строке 04 и имеет значение 02. Как я могу создатьпрограмма, которая будет изменять значение этого гекса, и только этот гекс одним нажатием кнопки?

Я нашел ресурсы, которые рассказывают о похожих вещах, но я не могу найти помощь по точному вопросу.

Буду признателен за любую помощь, и, пожалуйста, не просто скажите мне ответ, если есть, но попытайтесь объяснить немного.

Ответы [ 2 ]

22 голосов
/ 10 июля 2010

Я думаю, что это лучше всего объяснить на конкретном примере.Вот первые 32 байта исполняемого файла, как показано в шестнадцатеричном редакторе Visual Studio:

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

Теперь файл представляет собой просто линейную последовательность байтов.Строки, которые вы видите в шестнадцатеричном редакторе, предназначены только для упрощения чтения.Если вы хотите манипулировать байтами в файле с помощью кода, вам необходимо идентифицировать байты по их позициям, начинающимся с нуля.В вышеприведенном примере позиции ненулевых байтов следующие:

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

В представлении шестнадцатеричного редактора, показанном выше, числа слева представляют позиции первого байта в соответствующей строке,Редактор показывает 16 байтов на строку, поэтому они увеличиваются на 16 (0x10) в каждой строке.

Если вы просто хотите взять один из байтов в файле и изменить его значение, наиболее эффективный подход,Я вижу, было бы открыть файл с помощью FileStream, искать в соответствующей позиции и перезаписать байт.Например, следующее изменит значение 0x40 в позиции 24 на 0x04:

using (var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) {
    stream.Position = 24;
    stream.WriteByte(0x04);
}
0 голосов
/ 10 июля 2010

Ну, во-первых, вероятно, было бы понять преобразования.От шестнадцатеричного до десятичного, вероятно, не так важно (если, конечно, вам не нужно сначала изменить значение с десятичного, но это простая формула преобразования), но шестнадцатеричное в двоичное будет важно, поскольку каждый шестнадцатеричный символ (0-9, AF)) соответствует определенному двоичному выводу.

После понимания этого материала, следующий шаг - выяснить, что именно вы ищете, выполнить правильное преобразование и заменить эту точную строку.Я бы порекомендовал (если буфер не был бы слишком большим) взять весь шестнадцатеричный дамп и заменить все, что вы там ищете, чтобы избежать перезаписи дублирующейся двоичной последовательности.

Надеюсь, это поможет!

С уважением,Деннис М.

...