одскажите пожалуйста, проблема в следующем:
Есть 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)