aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS_TheReturn/VirusEngine.cs
diff options
context:
space:
mode:
authorMichael <[email protected]>2017-01-08 09:57:10 -0500
committerMichael <[email protected]>2017-01-08 09:57:10 -0500
commitf30dcf5ef41d54c588d7b42c48be8d941abba72e (patch)
tree7705f99b965673b1c034ac2b1c56e65072c827df /ShiftOS_TheReturn/VirusEngine.cs
parent69dfad54724d4176dfce238a8d7e73970e6eef24 (diff)
downloadshiftos_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.cs158
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; }
+ }
+}