Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

Вай? Мастер (2042), на голосовании 9 месяцев назад
Вот моя проблема. У меня есть двоичный файл, который я хочу отредактировать. Конечно, я могу использовать шестнадцатеричный редактор, чтобы отредактировать его, но мне нужно создать программу для редактирования этого конкретного файла. Предположим, что мне надо заменить байты "1B300A009A00000080000011140A282F00000A72D52E0070188D140000012516286502000AA225177254560170A2289300000A286602000A0B0728A40D00060B0728C00D00060B0728A50D00061416282001000A16171616722D080070284504000A0C726A56017007289500000A286300000A728A56017008289500000A286300000A0828EF02000A0ADE180D72B4560170096F2A00000A289500000A281501000ADE00062A000001100000000002007E80001817000001" на "0A142A" в файле Game.exe Как я могу создать программу, которая изменит значение этого шестнадцатеричного кода, и только этого кода, одним нажатием кнопки?

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

Любая помощь будет оценена, и пожалуйста, не просто дайте мне ответ, если он есть, но попытайтесь объяснить немного.
Голосование за лучший ответ
Слава Шадринцев Ученик (189) 10 месяцев назад
Чтобы изменить определенные байты в двоичном файле, можно использовать модуль binascii в Python. Вот пример кода, который заменяет байты в файле "Game.exe":

import binascii

# Определяем, какие байты заменить
original_bytes = b"\x1B\x30\x0A\x00\x9A\x00\x00\x00\x80\x00\x00\x11\x14\x0A\x28\x2F\x00\x00\x0A\x72\xD5\x2E\x00\x70\x18\x8D\x14\x00\x00\x01\x25\x16\x28\x65\x02\x00\x0A\xA2\x25\x17\x72\x54\x56\x01\x70\xA2\x28\x93\x00\x00\x0A\x28\x66\x02\x00\x0A\x0B\x07\x28\xA4\x0D\x00\x06\x0B\x07\x28\xC0\x0D\x00\x06\x0B\x07\x28\xA5\x0D\x00\x06\x14\x16\x28\x20\x01\x00\x0A\x16\x17\x16\x72\x2D\x08\x00\x70\x28\x45\x04\x00\x0A\x0C\x72\x6A\x56\x01\x70\x09\x6F\x2A\x00\x00\x0A\x28\x95\x00\x00\x0A\x28\x15\x01\x00\xAD\xE0\x00\x62\xA0\x00\x00\x00\x11\x00\x00\x00\x00\x02\x00\x7E\x80\x00\x18\x17\x00\x00\x01"
replacement_bytes = b"\x0A\x14\x2A"

# Читаем данные из файла
with open("Game.exe", "rb") as f:
file_data = f.read ()

# Заменяем байты, если они есть
if original_bytes in file_data:
file_data = file_data.replace(original_bytes, replacement_bytes)

# Записываем измененные данные в файл
with open("Game.exe", "wb") as f:
f.write(file_data)
Здесь мы сначала задаем значения original_bytes и replacement_bytes, которые представляют собой двоичные данные, которые мы хотим заменить и на что мы хотим их заменить соответственно. Затем мы читаем данные из файла "Game.exe" и заменяем соответствующие байты, если они есть. Наконец, мы записываем измененные данные обратно в файл.

Для запуска этого кода можно создать простой пользовательский интерфейс с кнопкой "Изменить файл". При нажатии этой кнопки код выше будет запущен, и байты в файле "Game.exe" будут заменены на новые значения.
АМудрец (14636) 10 месяцев назад
Опять chatGPT? Вы хотя бы сказали ему, что код нужен на C#.
Вай? Мастер (2042) А, зхыхыхы))
А Мудрец (14636) 10 месяцев назад
Создаёшь два массива байт, который будешь искать и который будешь записывать. Находишь смещение, по которому расположен искомый массив. Создаёшь файл. В начало файла записываешь всё, что идёт перед найденным смещением. Затем записываешь свой собственный массив (вместо найденного). Потом дописываешь всё, что шло за найденным массивом.
Для поиска подмассива можно использовать алгоритм Кнута-Мориса-Пратта.
Вай?Мастер (2042) 10 месяцев назад
я уже написал кодек) но спасибо за ответ)
Вай? Мастер (2042) Надо было просто найти первый хекс и заменить на второй)
Похожие вопросы