C# вредоносный участок кода
Уже какой день пытаюсь разобраться с детектом антивирусов своего приложения, и в целом, успешно. Но не могу додумать что делать с кодом, который отвечает за автообновление приложения.
Есть предположения что антивирусы детектят конкретно Process.Start(); функцию, либо Environment.GetCommandLineArgs(); убрав код автообновления из программы показатель на вирустотал 0/70.
App.Xaml.cs
[STAThread]
public static void Main()
{
if (SelfUpdate())
return;
string[] args = Environment.GetCommandLineArgs();
if (args.Length > 1)
{
while (Process.GetProcessesByName(Path.GetFileName(args[1])).Length > 1)
Thread.Sleep(200);
File.Delete(args[1]);
File.Move(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain.FriendlyName), args[1]);
}
App application = new App();
application.InitializeComponent();
application.Run();
}
private static bool SelfUpdate()
{
XmlDocument Xml = new XmlDocument();
Xml.Load("launcherPatch.xml"); //хэш актуального приложения
string actualHash = Xml.GetElementsByTagName("hash")[0].InnerText;
string clientHash = string.Empty;
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain.FriendlyName)))
{
byte[] checksum = md5.ComputeHash(stream);
clientHash = BitConverter.ToString(checksum).Replace("-", string.Empty);
}
}
if (!clientHash.Equals(actualHash))
{
using (WebClient Client = new WebClient())
{
string UpdatedFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain.FriendlyName.Replace(".exe", ".tmp.exe"));
Client.DownloadFileCompleted += (s, e) =>
{
Process.Start(UpdatedFilePath, "\"" + Assembly.GetExecutingAssembly().Location + "\"");
Environment.Exit(0);
};
//ссылка на скачивание обновлённого приложения
Client.DownloadFileAsync(new Uri("launcherBuild.exe"), UpdatedFilePath);
}
}
return false;
}
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Моя попытка немного привести ваш код во порядок.
[STAThread]
public static async Task Main(string[] args)
{
if (await SelfUpdate())
return;
if (args.Length > 1)
{
while (Process.GetProcessesByName(Path.GetFileName(args[1])).Length > 1) // здесь лучше переписать на FileSystemWatcher
await Task.Delay(200);
File.Delete(args[1]);
File.Move(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain.FriendlyName), args[1]);
}
App application = new App();
application.InitializeComponent();
application.Run();
}
private static async Task<bool> SelfUpdate()
{
XmlDocument Xml = new XmlDocument();
Xml.Load("launcherPatch.xml"); //хэш актуального приложения
string actualHash = Xml.GetElementsByTagName("hash")[0].InnerText;
string clientHash = string.Empty;
using (var md5 = MD5.Create())
using (var stream = File.OpenRead(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain.FriendlyName)))
{
byte[] checksum = md5.ComputeHash(stream);
clientHash = BitConverter.ToString(checksum).Replace("-", string.Empty);
}
if (clientHash != actualHash)
{
string UpdatedFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain.FriendlyName.Replace(".exe", ".tmp.exe"));
using (var client = new HttpClient())
using (var fs = File.Create(UpdatedFilePath))
using (var stream = await client.GetStreamAsync("https://smartrp.by/launcher/launcherBuild.exe"))
{
await stream.CopyToAsync(fs);
}
Process process = new Process() { StartInfo = new ProcessStartInfo() { FileName = UpdatedFilePath, UseShellExecute = true } };
process.Start();
}
return false;
}