[C#] как заменить байты в файле?

программирование программы windows C# .net

одскажите пожалуйста, проблема в следующем:

Есть dll-ка, мне надо сделать патчер который бы менял в ней строку на нужную мне, например server.server.pro на 127.0.0.1

Вот что я сделал:

public static int Find()
{
return IndexOf(File.ReadAllBytes("TARGET.dll"), Encoding.ASCII.GetBytes("server.server.pro"));
}

public static bool Patch()
{
int index = Find();
if (index <= -1) return false;

try
{
using (FileStream fs = new FileStream("TARGET.dll", FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
if (!fs.CanWrite) return false;

fs.Position = index;
fs.Write(Encoding.ASCII.GetBytes("127.0.0.1"), 0, Encoding.ASCII.GetByteCount("127.0.0.1"));
fs.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
return false;
}

return true;
}

но этот код только дописывает перед server.server.pro мою строку 127.0.0.1 (в итоге выходит 127.0.0.1server.server.pro, что вообще ни в какие рамки не влезает), а мне надо записать 127.0.0.1 поверх старого адреса. есть варианты? в FileStream метода DeleteBytes или ReplaceBytes не нашел :)

Примечание:
нет, не годится. после патча ошибку выдает, что эта DLL не для Windows была написана)

Примечание:
public static bool PatchDLL()
{
string target = "target.dll";
string old_val = "server.mysite.net";
string new_val = "127.0.0.1";

List<byte> file = new List<byte>(File.ReadAllBytes(target));

byte[] fileBytes = file.ToArray();
byte[] pattern = Encoding.ASCII.GetBytes(old_val);
byte[] bytes = new byte[pattern.Length];

int pos = IndexOf(file.ToArray(), pattern);
if (pos <= -1) return false;

file.RemoveRange(pos, pattern.Length);
file.InsertRange(pos, Encoding.ASCII.GetBytes(new_val));
file.InsertRange(pos + Encoding.ASCII.GetByteCount(new_val), new byte[]
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });

File.WriteAllBytes(target, fileBytes);

return true;
}

вот так ошибку не выдает. но после 127.0.0.1 пишется 9 пробелов

Примечание:
none7, так тоже не получилось. посмотрел через UltraEdit эту длл-ку после патча - вместо server.alteriw.net стало 127.0.0.1.eriw.net, то есть после 127.0.0.1 стоит один нуль-символ, а дальше строка продолжается...

Примечание:
none7, но программа не игнорирует eriw.net. когда я в файле пишу просто 127.0.0.1 то она выводит сообщение что это не официальный сервер. она сравнивает то что написано в файле с тем что у нее в памяти записано, вот мне надо туда записать вместо server.alteriw.net 127.0.0.1, чтобы программа не выдавала сообщения о неофициальном сервере.

Примечание:
вобщем пока у меня такой код:

public static void PatchSteamAPI()
{
string target = "steam_api.dll";
string old_val = "server.alteriw.net";
string new_val = "127.0.0.1";

Encoding en = Encoding.ASCII;

byte[] old_val_b = en.GetBytes(old_val + '\0');
byte[] new_val_b = en.GetBytes(new_val + '\0');

byte[] bytes = new byte[old_val_b.Length];

try
{
if (!File.Exists(target)) throw new Exception("Файла \"" + target + "\" не существует.");
if (new_val.Length > old_val.Length) throw new Exception("Новый адрес мастер-сервера слишком большой.");

int index = Projects.Default.API.IndexOf(File.ReadAllBytes(target), old_val_b);

using (FileStream fs = File.OpenWrite(target))
{
fs.Position = index;
fs.Write(new_val_b, 0, new_val_b.Length);
}

using (FileStream fs = File.OpenRead(target))
{
fs.Position = index;
fs.Read(bytes, 0, bytes.Length);
}

Log.ProcessAction("Файл \"" + target + "\" был пропатчен. Текущий мастер-сервер: " + en.GetString(bytes), "Patcher");
}
catch (Exception ex)
{
Msg.Error(ex.ToString());
}
}

но он не дает желаемого результата, игра сравнивает мастер-сервер с 127.0.0.1 eriw.net или с чем-то другим, но не с тем что мне нужно (127.0.0.1)
Ответы:
Если эта строка хранится в файле в виде ASCII текста (как я понял из приведённого кода), может быть просто открыть весь файл как текст? Это будет гораздо удобнее, я думаю (там есть и Remove и Replace). Как-нибудь так, например:
static int IndexOf(byte[] content, byte[] pattern) {
   int index, i;
   for (index = 0; ; index++) {
       for (i = 0; i < pattern.Length && index + i < content.Length && pattern[i] == content[index + i]; i++) ;
       if (i == pattern.Length)
           break;
       else if (index + i >= content.Length)
           throw new Exception("Not found pattern \"" + Encoding.ASCII.GetString(pattern) + "\".");
   }
   return index;
}
static void Main(string[] args)
{
   try
   {
       string target = "target.dll";
       string old_val = "server.mysite.net";
       string new_val = "127.0.0.1";
       
       if(new_val.Length > old_val.Length) throw new Exception("New value to big");


12 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.