Top.Mail.Ru
Ответы
Аватар пользователя
Изменено
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Выскакивает ошибка при изменении хекса.

Пытался реализовать программу которая меняет определённые байты как хекс-редакторы.

123456789101112131415161718192021222324252627282930313233343536373839404142434445
 using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net.NetworkInformation; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 
 
namespace CoolBSAdBlocker 
{ 
    internal class Inject 
    { 
        static void Main(string[] args) 
        { 
            string filePath = @"D:\BlueStacks\Client\Bluestacks.exe"; 
            string hexStringToReplace = "1B300A009A00000080000011140A282F00000A72D52E0070188D140000012516286502000AA225177254560170A2289300000A286602000A0B0728A40D00060B0728C00D00060B0728A50D00061416282001000A16171616722D080070284504000A0C726A56017007289500000A286300000A728A56017008289500000A286300000A0828EF02000A0ADE180D72B4560170096F2A00000A289500000A281501000ADE00062A000001100000000002007E80001817000001"; 
            string hexStringReplacement = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; 
 
            ReplaceHexStringInFile(filePath, hexStringToReplace, hexStringReplacement); 
        } 
 
        static void ReplaceHexStringInFile(string filePath, string hexStringToReplace, string hexStringReplacement) 
        { 
            byte[] fileBytes = File.ReadAllBytes(filePath); 
            string fileHex = BitConverter.ToString(fileBytes).Replace("-", ""); 
 
            int index = fileHex.IndexOf(hexStringToReplace); 
            if (index != -1) 
            { 
                string newFileHex = fileHex.Substring(0, index) + hexStringReplacement + fileHex.Substring(index + hexStringToReplace.Length); 
                byte[] newFileBytes = new byte[newFileHex.Length / 2]; 
                for (int i = 0; i < newFileHex.Length; i += 2) 
                { 
                    newFileBytes[i / 2] = Convert.ToByte(newFileHex.Substring(i, 2), 16); 
                } 
                File.WriteAllBytes(filePath, newFileBytes); 
                Console.WriteLine("Реклама успешно вырезана!."); 
            } 
            else 
            { 
                Console.WriteLine("Не найден файл - Bluestacks.exe"); 
            } 
        } 
    } 
} 

Программа запускается и успешно изменяет байты - как я и планировал. Но после этой операции программа ломается и при попытке захода в exeшник выскакивает такое окно:

Exception Precessing Message 0x0000005 - Unexpected parameters

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

Вы написали полный бред, поэтому ничего не работает. Бинарный файл - это массив байт. А вы меняете выдуманные хексы как строки. Плюс еще и строки разной длины. В скомпилированном файле существуют разные функции и вызовы библиотек. Изменение длины файла херит все смещения по которым должны вызываться эти функции и прочее.
И еще я вам открою тайну - 0 в строке, это не 0 в бинаре. В C# символ с кодом 0 - это завершение строки. Такого символа в строке вообще быть не может.

Аватар пользователя
Ученик

Ошибка, которую вы описываете, может быть вызвана несколькими причинами. Одна из вероятных причин - неправильная замена байтов в файле. Пожалуйста, убедитесь, что переменные hexStringToReplace и hexStringReplacement имеют одинаковую длину в шестнадцатеричном формате. Они должны состоять из пар шестнадцатеричных символов.

В вашем коде я заметил, что hexStringToReplace имеет длину 308 символов, а hexStringReplacement имеет длину 512 символов. Обратите внимание, что замена должна иметь такую же длину, как и оригинальная строка.

Вот исправленный код, в котором оба значения имеют одинаковую длину:

csharp

using System;
using System.IO ;

namespace CoolBSAdBlocker
{
internal class Inject
{
static void Main(string[] args)
{
string filePath = @"D:\BlueStacks\Client\Bluestacks.exe";
string hexStringToReplace = "1B300A009A00000080000011140A282F00000A72D52E0070188D140000012516286502000AA225177254560170A2289300000A286602000A0B0728A40D00060B0728C00D00060B0728A50D00061416282001000A16171616722D080070284504000A0C726A56017007289500000A286300000A728A56017008289500000A286300000A0828EF02000A0ADE180D72B4560170096F2A00000A289500000A281501000ADE00062A000001100000000002007E80001817000001";
string hexStringReplacement = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";

ReplaceHexStringInFile(filePath, hexStringToReplace, hexStringReplacement);
}

static void ReplaceHexStringInFile(string filePath, string hexStringToReplace, string hexStringReplacement)
{
byte[] fileBytes = File.ReadAllBytes(filePath);
string fileHex = BitConverter.ToString(fileBytes).Replace("-", "");

int index = fileHex.IndexOf(hexStringToReplace);
if (index != -1)
{
string newFileHex = fileHex.Substring(0, index) + hexStringReplacement + fileHex.Substring(index + hexStringToReplace.Length);
byte[] newFileBytes = new byte[newFileHex.Length / 2];
for (int i = 0; i < newFileHex.Length; i += 2)
{
newFileBytes[i / 2] = Convert.ToByte(newFileHex.Substring(i, 2), 16);
}
File.WriteAllBytes(filePath, newFileBytes);
Console.WriteLine("Реклама успешно вырезана!");
}
else
{
Console.WriteLine("Не найден файл - Bluestacks.exe");
}
}
}
}

Аватар пользователя
Мудрец

Ошибка при изменении хекса возникает из-за того, что программа пытается изменить байты в исполняемом файле Bluestacks.exe, что может привести к его повреждению. Возможно, изменение этих байтов нарушает целостность файла и вызывает ошибку при его запуске. Рекомендуется не изменять байты в исполняемых файлах, если вы не уверены в том, что делаете.

Аватар пользователя
Мыслитель

какое окно?