MalwareSourceCode/MSIL/Trojan/Win32/P/Trojan.Win32.Patched.mf-9c4f7eb57e580673b883e57f31931bcbce8bd5d8de1a509a25b8b5a175335d9f/Services/Update/UpdateFetcher.cs

95 lines
3.8 KiB
C#
Raw Normal View History

2022-08-18 11:28:56 +00:00
// Decompiled with JetBrains decompiler
// Type: Bmc.Services.Update.UpdateFetcher
// Assembly: updateservice, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
// MVID: A6A1FC23-14F7-4CCE-B702-0F9FFD2CD5AC
// Assembly location: C:\Users\Administrateur\Downloads\Virusshare-00000-msil\Trojan.Win32.Patched.mf-9c4f7eb57e580673b883e57f31931bcbce8bd5d8de1a509a25b8b5a175335d9f.exe
using Bmc.Broker.Config;
using Bmc.Broker.ResourceSystem;
using Bmc.RegistryAccess;
using Bmc.Services.Ticket;
using Net.LShift.SPKI;
using Net.LShift.Utilities;
using System.Collections;
using System.IO;
using System.Net;
namespace Bmc.Services.Update
{
public class UpdateFetcher : UpdateServices
{
private WebClient _webClient;
private ResourceManager _resourceManager;
public UpdateFetcher(WebClient webClient, ResourceManager resourceManager)
{
this._webClient = webClient;
this._resourceManager = resourceManager;
}
public void TryFetch()
{
string str = "machine/updates/" + ConfigurationManager.Instance[(FIELD) 12];
WebRequest request = this._webClient.GetRequest(str + "/update.spki");
WebResponse response1;
try
{
response1 = request.GetResponse();
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response is HttpWebResponse response2 && response2.StatusCode == HttpStatusCode.NotFound)
return;
throw ex;
}
SPKISexp sexp = SPKISexp.ParseSexp(response1.GetResponseStream());
SPKISexp updatePayload = this.GetUpdatePayload(sexp);
string name1 = updatePayload.Get("update-increment").Name;
DirectoryInfo updatesDirectory = this._resourceManager.GetUpdatesDirectory();
updatesDirectory.Create();
DirectoryInfo directoryInfo = new DirectoryInfo(updatesDirectory.FullName + "\\" + name1);
if (directoryInfo.Exists)
return;
DirectoryInfo progressDirectory = this._resourceManager.GetUpdatesInProgressDirectory();
progressDirectory.Create();
SPKISexp spkiSexp1 = updatePayload["files"];
Hashtable hashtable = new Hashtable();
foreach (FileInfo file in progressDirectory.GetFiles())
hashtable[(object) file.Name] = (object) file;
ArrayList arrayList = new ArrayList();
for (int index = 1; index < spkiSexp1.Length; ++index)
{
SPKISexp spkiSexp2 = spkiSexp1[index];
if (spkiSexp2[0].Name == "file")
{
string name2 = spkiSexp2[1].Name;
SPKISexp spkiSexp3 = spkiSexp2[3];
if (hashtable.Contains((object) name2) && this.HashFile((FileInfo) hashtable[(object) name2]).Equals((object) spkiSexp3))
hashtable.Remove((object) name2);
else
arrayList.Add((object) spkiSexp2);
}
}
foreach (FileSystemInfo fileSystemInfo in (IEnumerable) hashtable.Values)
fileSystemInfo.Delete();
foreach (SPKISexp spkiSexp4 in arrayList)
{
string name3 = spkiSexp4[1].Name;
SPKISexp spkiSexp5 = spkiSexp4[3];
FileInfo fileInfo = new FileInfo(progressDirectory.ToString() + "\\" + name3);
this._webClient.FetchFile(str + "/" + spkiSexp4[2].Name, fileInfo);
if (!this.HashFile(fileInfo).Equals((object) spkiSexp5))
{
fileInfo.Delete();
throw new BadUpdateException("Hash mismatch on download");
}
}
using (Stream stream = (Stream) System.IO.File.Create(progressDirectory.FullName + "\\update.spki"))
sexp.Marshal(stream);
progressDirectory.MoveTo(directoryInfo.FullName);
}
public static UpdateFetcher Create(ResourceManager resourceManager) => new UpdateFetcher(new WebClient(ConfigurationManager.Instance.ProtocolUri, (ICredentialFactory) new BmcCredentialFactory(new SecureStateManager())), resourceManager);
}
}