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

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

Вай? Мастер (2030), на голосовании 11 месяцев назад
Пытался реализовать программу которая меняет определённые байты как хекс-редакторы.
 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
Дополнен 1 год назад
Голосование за лучший ответ
Дмитрий Мыслитель (6623) 1 год назад
какое окно?
Вай?Мастер (2030) 1 год назад
Дмитрий Мыслитель (6623) Вай?, ошибка доступа к памяти.Нет прав для доступа к нему.Попробуй через администратора запустить свою прогу.Да и почему hex, на который ты меняешь состоит из всех нулей.
Professional Professional Мудрец (15728) 1 год назад
Ошибка при изменении хекса возникает из-за того, что программа пытается изменить байты в исполняемом файле Bluestacks.exe, что может привести к его повреждению. Возможно, изменение этих байтов нарушает целостность файла и вызывает ошибку при его запуске. Рекомендуется не изменять байты в исполняемых файлах, если вы не уверены в том, что делаете.
k0nan Varvar Ученик (185) 1 год назад
Ошибка, которую вы описываете, может быть вызвана несколькими причинами. Одна из вероятных причин - неправильная замена байтов в файле. Пожалуйста, убедитесь, что переменные 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");
}
}
}
}
А Мудрец (14705) 1 год назад
Вы написали полный бред, поэтому ничего не работает. Бинарный файл - это массив байт. А вы меняете выдуманные хексы как строки. Плюс еще и строки разной длины. В скомпилированном файле существуют разные функции и вызовы библиотек. Изменение длины файла херит все смещения по которым должны вызываться эти функции и прочее.
И еще я вам открою тайну - 0 в строке, это не 0 в бинаре. В C# символ с кодом 0 - это завершение строки. Такого символа в строке вообще быть не может.
Вай?Мастер (2030) 1 год назад
Оказалось хекс слишком длинный) Укоротил и всё работает:)
Похожие вопросы