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

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

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

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

11
задан JC Leyba 10 July 2010 в 03:42
поделиться

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);
}
23
ответ дан 3 December 2019 в 04:51
поделиться

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

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

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

Regards,
Деннис М.

0
ответ дан 3 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: