From f30dcf5ef41d54c588d7b42c48be8d941abba72e Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 8 Jan 2017 09:57:10 -0500 Subject: Initial upload --- ShiftOS_TheReturn/VirusEngine.cs | 158 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 ShiftOS_TheReturn/VirusEngine.cs (limited to 'ShiftOS_TheReturn/VirusEngine.cs') diff --git a/ShiftOS_TheReturn/VirusEngine.cs b/ShiftOS_TheReturn/VirusEngine.cs new file mode 100644 index 0000000..9823375 --- /dev/null +++ b/ShiftOS_TheReturn/VirusEngine.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using static ShiftOS.Objects.ShiftFS.Utils; + + +namespace ShiftOS.Engine +{ + public static class VirusEngine + { + private static List _infections = new List(); + + public static void Add(Virus virus) + { + _infections.Add(virus); + } + + public static void InfectFile(string file, string virusid) + { + string existing = ""; + + if(probeFile(file, out existing) == true) + { + existing = existing.Replace("<>", "").Replace("<>", ""); + + existing += ";" + virusid; + + existing = "<>" + existing + "<>"; + + string c = ReadAllText(file); + + string temp = ""; + + if(probeFile(file, out temp) == true) + { + c = c.Replace(temp, existing); + } + else + { + c = existing + c; + } + WriteAllText(file, c); + return; + } + else + { + existing = "<>" + virusid + "<>"; + string c = ReadAllText(file); + c = existing + c; + WriteAllText(file, c); + return; + } + + + } + + internal static string[] FindAllVirusesInFile(string file) + { + string existing = ""; + if(probeFile(file, out existing) == true) + { + existing = existing.Replace("<>", "").Replace("<>", ""); + return existing.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries); ; + } + else + { + return null; + } + } + + private static bool probeFile(string file, out string existing) + { + int startIndex = 0; + int endIndex = 0; + + bool found = false; + + string contents = ReadAllText(file); + + for(int i = 0; i < contents.Length; i++) + { + string end = "<>"; + try + { + if (contents.Substring(i, end.Length) == end) + { + endIndex = i + end.Length; + found = true; + break; + } + } + catch { } + } + + if (found == false) { + existing = "<><>"; + } + else + { + existing = contents.Substring(startIndex, endIndex); + } + return found; + } + + public static void Infect(string virusid) + { + string[] id_split = virusid.Split('.'); + + foreach(var v in _infections) + { + if(v.Type == id_split[0]) + { + if(v.Signature == id_split[1]) + { + if(v.ThreatLevel == Convert.ToInt32(id_split[2])) + { + var t = new Thread(new ThreadStart(() => + { + v.Activate(); + })); + t.IsBackground = true; + t.Start(); + return; + } + } + } + } + throw new Exception("Virus not found in the system."); + } + + internal static void ProbeFileRaw(string filePath, out string existing) + { + probeFile(filePath, out existing); + } + } + + public abstract class Virus + { + /// + /// Inject the virus into system memory by running it. + /// + public abstract void Activate(); + + /// + /// Terminate the virus. + /// + public abstract void Deactivate(); + + public abstract int ThreatLevel { get; } + + public abstract string Signature { get; } + + public abstract string Type { get; } + } +} -- cgit v1.2.3