diff options
| author | Michael <[email protected]> | 2017-01-08 09:57:10 -0500 |
|---|---|---|
| committer | Michael <[email protected]> | 2017-01-08 09:57:10 -0500 |
| commit | f30dcf5ef41d54c588d7b42c48be8d941abba72e (patch) | |
| tree | 7705f99b965673b1c034ac2b1c56e65072c827df /ShiftOS_TheReturn/VirusEngine.cs | |
| parent | 69dfad54724d4176dfce238a8d7e73970e6eef24 (diff) | |
| download | shiftos_thereturn-f30dcf5ef41d54c588d7b42c48be8d941abba72e.tar.gz shiftos_thereturn-f30dcf5ef41d54c588d7b42c48be8d941abba72e.tar.bz2 shiftos_thereturn-f30dcf5ef41d54c588d7b42c48be8d941abba72e.zip | |
Initial upload
Diffstat (limited to 'ShiftOS_TheReturn/VirusEngine.cs')
| -rw-r--r-- | ShiftOS_TheReturn/VirusEngine.cs | 158 |
1 files changed, 158 insertions, 0 deletions
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<Virus> _infections = new List<Virus>(); + + 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("<<VIRUSENGINE_HEAD>>", "").Replace("<<VIRUSENGINE_END>>", ""); + + existing += ";" + virusid; + + existing = "<<VIRUSENGINE_HEAD>>" + existing + "<<VIRUSENGINE_END>>"; + + 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 = "<<VIRUSENGINE_HEAD>>" + virusid + "<<VIRUSENGINE_END>>"; + 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("<<VIRUSENGINE_HEAD>>", "").Replace("<<VIRUSENGINE_END>>", ""); + 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 = "<<VIRUSENGINE_END>>"; + try + { + if (contents.Substring(i, end.Length) == end) + { + endIndex = i + end.Length; + found = true; + break; + } + } + catch { } + } + + if (found == false) { + existing = "<<VIRUSENGINE_HEAD>><<VIRUSENGINE_END>>"; + } + 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 + { + /// <summary> + /// Inject the virus into system memory by running it. + /// </summary> + public abstract void Activate(); + + /// <summary> + /// Terminate the virus. + /// </summary> + public abstract void Deactivate(); + + public abstract int ThreatLevel { get; } + + public abstract string Signature { get; } + + public abstract string Type { get; } + } +} |
