Top.Mail.Ru
Ответы

Обязательно на языке программирования c#!

Обязательно на языке программирования c#!

Вот моя проблема. У меня есть файл, который я хочу отредактировать. Конечно, я могу использовать шестнадцатеричный редактор, чтобы отредактировать его, но мне нужно создать программу для редактирования этого конкретного файла. Предположим, что мне надо стереть байты "1B300A009A00000080000011140A282F00000A72D52E0070188D140000012516286502000AA225177254560170A2289300000A286602000A0B0728A40D00060B0728C00D00060B0728A50D00061416282001000A16171616722D080070284504000A0C726A56017007289500000A286300000A728A56017008289500000A286300000A0828EF02000A0ADE180D72B4560170096F2A00000A289500000A281501000ADE00062A000001100000000002007E80001817000001" в файле Game.exe по пути "D:\BlueStacks\Client\Game.exe". Как я могу создать программу, которая изменит значение этого шестнадцатеричного кода, и только этого кода, одним нажатием кнопки?

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

Любая помощь будет оценена!

По дате
По рейтингу
Аватар пользователя
Гуру

Ну, раз любая помощь, то вот:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
 using System; 
using System.IO; 
 
class Program 
{ 
    static void Main() 
    { 
        string filePath = @"D:\BlueStacks\Client\Game.exe"; 
        string searchHex = "1B300A009A00000080000011140A282F00000A72D52E0070188D140000012516286502000AA225177254560170A2289300000A286602000A0B0728A40D00060B0728C00D00060B0728A50D00061416282001000A16171616722D080070284504000A0C726A56017007289500000A286300000A728A56017008289500000A286300000A0828EF02000A0ADE180D72B4560170096F2A00000A289500000A281501000ADE00062A000001100000000002007E80001817000001"; 
        string replacementHex = ""; // Здесь вы можете указать новое значение шестнадцатеричного кода 
 
        ReplaceHexInFile(filePath, searchHex, replacementHex); 
 
        Console.WriteLine("Замена завершена."); 
        Console.ReadLine(); 
    } 
 
    static void ReplaceHexInFile(string filePath, string searchHex, string replacementHex) 
    { 
        byte[] searchBytes = StringToByteArray(searchHex); 
        byte[] replacementBytes = StringToByteArray(replacementHex); 
 
        using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite)) 
        { 
            using (BinaryWriter writer = new BinaryWriter(fileStream)) 
            { 
                byte[] buffer = new byte[searchBytes.Length]; 
                int bytesRead; 
 
                do 
                { 
                    bytesRead = fileStream.Read(buffer, 0, buffer.Length); 
 
                    if (ByteArrayEquals(buffer, searchBytes)) 
                    { 
                        writer.Seek(-buffer.Length, SeekOrigin.Current); 
                        writer.Write(replacementBytes); 
                        return; 
                    } 
 
                } while (bytesRead == buffer.Length); 
            } 
        } 
 
        throw new InvalidOperationException("Не удалось найти и заменить указанный шестнадцатеричный код."); 
    } 
 
    static byte[] StringToByteArray(string hex) 
    { 
        int numberChars = hex.Length / 2; 
        byte[] bytes = new byte[numberChars]; 
 
        using (var sr = new StringReader(hex)) 
        { 
            for (int i = 0; i < numberChars; i++) 
                bytes[i] = Convert.ToByte(new string(new char[2] { (char)sr.Read(), (char)sr.Read() }), 16); 
        } 
 
        return bytes; 
    } 
 
    static bool ByteArrayEquals(byte[] array1, byte[] array2) 
    { 
        if (array1 == null || array2 == null || array1.Length != array2.Length) 
            return false; 
 
        for (int i = 0; i < array1.Length; i++) 
        { 
            if (array1[i] != array2[i]) 
                return false; 
        } 
 
        return true; 
    } 
} 
 

Обратите внимание, что в коде нужно указать путь к файлу Game.exe в переменной filePath, а новое значение шестнадцатеричного кода вы можете задать в переменной replacementHex.

После запуска программы она откроет файл, найдет указанный шестнадцатеричный код и заменит его на новое значение. Если шестнадцатеричный код не будет найден, программа выдаст исключение.

Убедитесь, что у вас есть права доступа к файлу, чтобы программа могла открыть его для чтения и записи.