Как отредактировать шестнадцатеричное значение двоичного файла с помощью С#

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

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

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


person JC Leyba    schedule 10.07.2010    source источник
comment
Я правильно понимаю, что вы хотите перезаписать несколько байтов в заданном месте в файле, который уже находится на диске?   -  person    schedule 10.07.2010


Ответы (2)


Думаю, лучше всего это объяснить на конкретном примере. Вот первые 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

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

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);
}
person Nick Guerrera    schedule 10.07.2010
comment
Большое спасибо, я смог завершить свою программу с этой информацией. - person JC Leyba; 10.07.2010

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

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

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

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

person RageD    schedule 10.07.2010