source: 2018/26/PyryS/HackSim/HackSim/HackSim/HackSim/HackSim.cs @ 9813

Revision 9813, 27.5 KB checked in by pymasalm, 2 years ago (diff)

Finished most code stuff I think

Line 
1using System;
2using System.Text;
3using System.Collections.Generic;
4using Jypeli;
5using Jypeli.Assets;
6using Jypeli.Controls;
7using Jypeli.Effects;
8using Jypeli.Widgets;
9using System.Reflection;
10
11public class HackSim : Game
12{
13    int MARGINS = 20;
14    Font SOURCECODE_FONT;
15    InputBox cmd_line;
16    Widget cmd_cursor;
17    Color accent_color = Color.Lime;
18    List<String> command_list;
19    List<Device> netmap_list;
20    String usr_name;
21    Image device_icon = LoadImage("SysIconHome");
22    Image device_icon_hover = LoadImage("SysIconHover");
23    Widget netmap;
24    Device current_device;
25    Device null_device;
26    Widget device_info;
27    static Label cmd_out;
28    IntMeter mem_counter;
29    List<Ware> player_software;
30    Dictionary<String, Ware> all_software;
31
32    Label info_label = new Label("Hostname: ");
33    List<string> info_text = new List<string>() { "\nTitle: ", "\nAddr: ", "\nPorts: "};
34
35    protected override void Update(Time time)
36    {
37        cmd_cursor.Position = cmd_line.Cursor.Position;
38        /*checkHover();*/
39        List<String> info_text_fin = new List<string>(info_text);
40        //foreach (String i in info_text)
41        for (int n = 0; n < info_text.Count; n++)
42        {
43            String i = info_text[n];
44            if (current_device != null && i != "")
45            {
46                var v = current_device.GetType();
47                var v2 = v.GetField(i.Split(':')[0].Split('\n')[1] as String);
48                var v3 = v2.GetValue(current_device);
49                if (!v3.GetType().Name.StartsWith("Dictionary"))
50                {
51                    info_text_fin[n] = i + "\n" + v3.ToString();
52                    info_label.Text = String.Join("\n", info_text_fin.ToArray());
53                    info_label.Top = info_label.Top = device_info.Top + MARGINS;
54                    info_label.Left = device_info.Left + MARGINS;
55                }
56                else
57                {
58                    String info_str = new String(' ', 0);
59                    int l = 0;
60                    foreach (var k in (v3 as Dictionary<int, Tuple<String, bool>>).Keys)
61                    {
62                        l++;
63                        info_str += k + " : " + (v3 as Dictionary<int, Tuple<String, bool>>)[k].Item1 + " : " + ((v3 as Dictionary<int, Tuple<String, bool>>)[k].Item2 ? "Open" : "Closed") + "\n";
64                    }
65                    l = 0;
66                    //info_str = i.ToString() + " : " + info_str;
67                    info_text_fin[n] = i + "\n" + info_str;
68                    info_label.Text = String.Join("\n", info_text_fin.ToArray());
69                    info_str = "";
70                    info_text_fin = info_text;
71                    info_label.Top = device_info.Top + MARGINS;
72                    info_label.Left = device_info.Left + MARGINS;
73                }
74            }
75        }
76        base.Update(time);
77    }
78    public override void Begin()
79    {
80        mem_counter = new IntMeter(0);
81        File test_file = new File("Test", "text", "Lorem Ipsum");
82        mem_counter.MaxValue = 256;
83        Level.Background.Color = Color.Black;
84        null_device = new Device(null, "", "", "", new List<Tuple<int, String>> { Tuple.Create(0, "None") }, false);
85        current_device = null_device;
86
87        netmap_list = new List<Device>();
88
89        netmap_list.Add(new Device(device_icon, "Your PC", "101.0.1.54", "ThePasswordIsVeryStronkHere", new List<Tuple<int, String>> { Tuple.Create(22, "SSH"), Tuple.Create(21, "FTP"), Tuple.Create(25, "SMTP"), Tuple.Create(9999, "PSC") }, false, new List<File> { }));
90        netmap_list.Add(new Device(device_icon, "CCC FileDrop", "122.34.5.99", "fourwordsalluppercase", new List<Tuple<int, String>> {/* Tuple.Create(22, "SSH"), Tuple.Create(21, "FTP"), Tuple.Create(25, "SMTP") */}, false, new List<File> {
91            new File("FTPBruteForce", "ware", "FTP_Crack"),
92            new File("IRC_Log_309533.txt", "text", "<nedbat> [Tritium]: you youngsters and your kidding...\n<nedbat> get off my lawn!\n<[Tritium]> But im not done mowing it....did you forget you paid me to do that ?\n<[Tritium]> is this even your house ? "),
93            new File("IRC_Log_058217.txt", "text", "<Apollo> w00t, finally got my comp running again :D\n<Trinexx> dude, you've been gone for two weeks, wtf happened?\n<Apollo> my new processor finally arrived in the mail, so I ripped the old one out and smashed it with a hammer. It was when I put the new one in that I noticed it was missing about 6 pins >:/\n<Apollo> I fucking hate computers"),
94            new File("Cache_IP.txt", "text", "122.44.44.5") }));
95        netmap_list.Add(new Device(device_icon, "CCC Cache", "122.44.44.5", "youshallNOTpass", new List<Tuple<int, string>> { Tuple.Create(21, "FTP") }, false, new List<File> { new File("SSHDictAttack", "ware", "SSH_Crack") }, false));
96        netmap_list.Add(new Device(device_icon, "J-Market Guest Router", "99.99.27.5", "admin", new List<Tuple<int, string>> { Tuple.Create(80, "HTTP"), Tuple.Create(22, "SSH") }, true, new List<File> {
97            new File("Client_List_Cache.log", "text", "101.0.1.54\n89.69.75.2\n55.66.3.47"),
98            new File("Note.txt", "text", "This thing is a security risk.\nGet someone to fix it.\n\nMark, The Engineer") }, true, 65));
99        netmap_list.Add(new Device(device_icon, "xXx1337h4x0rxXx5 Minecraft Server", "92.200.6.5", "UCan'tTouchThis", new List<Tuple<int, string>> { Tuple.Create(22, "SSH"), Tuple.Create(21, "FTP") }, false, new List<File> {
100            new File("Server.conf", "text", "Passwd=1337PWD\nTitle=My 1337 Server"),
101            new File("HTTPTrojan", "ware", "HTTP_Crack"),
102            new File("Notes.txt", "text", "Lol I found this sick cracking thing I'm so 1337 now nobody can beatme!") }, true, 999));
103
104        netmap_list[0].Admin = true;
105
106        player_software = new List<Ware>();
107        all_software = new Dictionary<string, Ware>();
108        all_software.Add("FTP_Crack", new Ware(true, "FTP", "FTPBruteForce", "FTP Brute Force attack complete", "Invalid port", "Security error", 3, 64));
109        all_software.Add("SSH_Crack", new Ware(false, "SSH", "SSHDictAttack", "SSH Cracking complete", "Invalid port", "Security error", 5, 52));
110        all_software.Add("SMTP_Crack", new Ware(true, "SMTP", "SMTPOverload", "SMTP Port overloaded", "Invalid port", "Security error", 7, 100));
111        all_software.Add("HTTP_Crack", new Ware(true, "HTTP", "HTTPTrojan", "HTTP Server compromised", "Invalid port", "Security error", 12, 128));
112
113
114        SOURCECODE_FONT = LoadFont("SourceCode");
115
116        command_list = new List<string>();
117        command_list.Add("cat ");
118        command_list.Add("ls");
119        command_list.Add("ssh");
120        command_list.Add("connect");
121        command_list.Add("shutdown now");
122        command_list.Add("exit");
123        command_list.Add("disconnect");
124        command_list.Add("recoverpwd");
125        command_list.Add("scp ");
126
127
128        usr_name = "Guest";
129        StringList cmd_list = new StringList();
130        // Create command line input box
131        cmd_line = new InputBox();
132        cmd_line.Font = SOURCECODE_FONT;
133        cmd_line.Color = Color.Black;
134        cmd_line.TextColor = accent_color;
135        cmd_line.BorderColor = accent_color;
136        cmd_line.Cursor.IsVisible = false;
137        cmd_cursor = new Widget(cmd_line.Cursor.Width, cmd_line.Cursor.Height);
138        cmd_cursor.Color = accent_color;
139        Timer t = new Timer();
140        t.Interval = 0.5;
141        t.Timeout += () => cmd_cursor.IsVisible = !cmd_cursor.IsVisible;
142        t.Start();
143        cmd_line.Width = Window.Width / 2 - MARGINS * 2;
144        cmd_line.X = Window.Width / 2 - cmd_line.Width / 2 - MARGINS;
145        cmd_line.Y -= Window.Height / 2 - cmd_line.Height / 2 - MARGINS;
146        Timer.SingleShot(0.5, () => Add(cmd_line));
147        cmd_line.Add(cmd_cursor);
148
149
150        // Create command line output box
151        cmd_out = new Label();
152        cmd_out.Font = SOURCECODE_FONT;
153        cmd_out.BorderColor = accent_color;
154        cmd_out.TextColor = accent_color;
155        cmd_out.SizeMode = TextSizeMode.Wrapped;
156        cmd_out.Color = Color.Black;
157        cmd_out.Width = cmd_line.Width;
158        cmd_out.Height = Window.Height - cmd_line.Height - MARGINS * 3;
159        cmd_out.X = cmd_line.X;
160        cmd_out.Y = Window.Height / 2 - cmd_out.Height / 2 - cmd_line.Height + MARGINS / 2;
161        cmd_out.SizeMode = TextSizeMode.None;
162        cmd_out.HorizontalAlignment = HorizontalAlignment.Left;
163        cmd_out.VerticalAlignment = VerticalAlignment.Top;
164        Timer.SingleShot(0.7, () => Add(cmd_out));
165
166
167        PhoneBackButton.Listen(ConfirmExit, "");
168        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "");
169        Keyboard.Listen(Key.Enter, ButtonState.Pressed, () => ProcessCommands(cmd_line, cmd_out), "");
170        Keyboard.Listen(Key.Tab, ButtonState.Pressed, () => AutoComplete(), "");
171
172        // Create netmap
173        netmap = new Widget(cmd_out.Width + MARGINS, Window.Height / 2 - MARGINS * 2);
174        netmap.SizingByLayout = false;
175        netmap.Layout = new RowLayout();
176        netmap.X = Window.Width - cmd_out.Width * 2.5 - MARGINS * 4.5;
177        netmap.Y = netmap.Height / 2 + MARGINS;
178        netmap.Color = Color.Black;
179        netmap.BorderColor = accent_color;
180        Timer.SingleShot(0.8, () => Add(netmap));
181
182        foreach (Device i in netmap_list)
183        {
184            netmap.Add(i);
185            Mouse.ListenOn(i, MouseButton.Left, ButtonState.Pressed, ClickConnect, "", i);
186        }
187        // Create info window
188        device_info = new Widget(cmd_out.Width + MARGINS, Window.Height / 2 - MARGINS * 2 - cmd_line.Height);
189        device_info.SizingByLayout = false;
190        device_info.Layout = new VerticalLayout();
191        device_info.X = Window.Width - cmd_out.Width * 2.5 - MARGINS * 4.5;
192        device_info.Bottom = cmd_line.Bottom;
193        device_info.Color = Color.Black;
194        device_info.BorderColor = accent_color;
195        Timer.SingleShot(0.3, () => Add(device_info));
196
197        info_label.HorizontalAlignment = HorizontalAlignment.Left;
198        info_label.Tag = "Title";
199        info_label.Left = device_info.Left + MARGINS;
200        info_label.Top = device_info.Top - info_label.Height * 2 - MARGINS * 2;
201        info_label.TextColor = accent_color;
202        info_label.Font = SOURCECODE_FONT;
203
204        Timer.SingleShot(0.6, () => Add(info_label));
205
206        // Create RAM bar
207        ProgressBar ram_bar = new ProgressBar(device_info.Width, cmd_line.Height);
208        ram_bar.Bottom = device_info.Top + MARGINS;
209        ram_bar.X = device_info.X;
210        ram_bar.BorderColor = accent_color;
211        ram_bar.Color = Color.Black;
212        ram_bar.BarColor = Color.Green;
213        ram_bar.BindTo(mem_counter);
214        Timer.SingleShot(1.1, () => Add(ram_bar));
215
216        Mouse.ListenMovement(1.0, checkHover, "");
217    }
218
219    void ClickConnect(Device dev)
220    {
221        Console.WriteLine(dev.Addr);
222        ProcessCommands(cmd_line, cmd_out, ("ssh " + dev.Addr));
223    }
224
225    void AutoComplete()
226    {
227        foreach (Ware i in player_software)
228        {
229            if (!command_list.Contains(i.Name + " "))
230            {
231                command_list.Add(i.Name + " ");
232            }
233        }
234        List<String> file_matches = new List<String>();
235        List<String> matches = new List<String>();
236        foreach(String i in command_list)
237        {
238            if (i.ToLower().StartsWith(cmd_line.Text.Split(' ')[0].ToLower()))
239            {
240                matches.Add(i);
241            }
242        }
243        if (matches.Count == 1)
244        {
245            if (cmd_line.Text.ToLower().StartsWith(matches[0].ToLower()))
246            {
247                foreach (File i in current_device.Files)
248                {
249                    if (i.Name.ToLower().StartsWith(cmd_line.Text.Split(' ')[1].ToLower()))
250                    {
251                        file_matches.Add(i.Name);
252                    }
253                }
254                if (file_matches.Count == 1)
255                {
256                    cmd_line.Text = cmd_line.Text.Split(' ')[0].Trim(' ') + " " + file_matches[0];
257                }
258                else
259                {
260                    foreach (String i in file_matches)
261                    {
262                        PrintOutput(i);
263                    }
264                }
265            }
266            else
267            {
268                cmd_line.Text = matches[0];
269            }
270        }
271        else
272        {
273            foreach (string i in matches)
274            {
275                PrintOutput(i);
276            }
277        }
278    }
279
280    public void ProcessCommands(InputBox cmd_line, Label cmd_out, String cmd="")
281    {
282        /*
283         * Processes commands entered by the user.
284         */
285        if (cmd == "")
286        {
287            cmd = cmd_line.Text;
288            cmd_line.Text = "";
289        }
290        PrintOutput((current_device.Admin ? "root" : "guest") + "@" + current_device.Addr + " ~/# " + cmd);
291        String output = "";
292
293        // Crack firewall
294        if (cmd.StartsWith("BypassFirewall"))
295        {
296            if (Int32.TryParse(cmd.Split(' ')[1], out int asd))
297            {
298                int port = Int32.Parse(cmd.Split(' ')[1]);
299                if (current_device.Ports.ContainsKey(port))
300                {
301                    if (current_device.Ports[port].Item2)
302                    {
303                        PrintOutput("Firewall disabled");
304                        current_device.Firewall = false;
305                    }
306                    else
307                    {
308                        PrintOutput("Port not open");
309                    }
310                }
311                else
312                {
313                    PrintOutput("Invalid port");
314                }
315            }
316            else
317            {
318                PrintOutput("Invalid port");
319            }
320
321        }
322
323        // Clone a file to your system (always index 0)
324        if (cmd.StartsWith("scp") || cmd.StartsWith("copy"))
325        {
326            bool found_file = false;
327            if (current_device.Admin)
328            {
329                String file_name = cmd.Split(' ')[1];
330                foreach (File i in current_device.Files)
331                {
332                    if (i.Name == file_name)
333                    {
334                        if (i.File_Type == "ware")
335                        {
336                            player_software.Add(all_software[i.File_Contents]);
337                        }
338                        else
339                        {
340                            netmap_list[0].Files.Add(i);
341                        }
342                        found_file = true;
343                    }
344                }
345                if (!found_file)
346                {
347                    PrintOutput("ERRNO2: " + file_name + ": No such file");
348                }
349            }
350            else
351            {
352                PrintOutput("Operation not permitted");
353            }
354        }
355
356        // Echo something
357        else if (cmd.StartsWith("echo "))
358        {
359            output = cmd.Split(' ')[1];
360        }
361
362        // Exit
363        else if (cmd.StartsWith("shutdown"))
364        {
365            PrintOutput("Shutting down. All data from this session will be removed.");
366            Timer.SingleShot(1, () => PrintOutput("5"));
367            Timer.SingleShot(2, () => PrintOutput("4"));
368            Timer.SingleShot(3, () => PrintOutput("3"));
369            Timer.SingleShot(4, () => PrintOutput("2"));
370            Timer.SingleShot(5, () => PrintOutput("1"));
371            Timer.SingleShot(6, () => PrintOutput("0"));
372            Timer.SingleShot(7, () => Exit());
373        }
374
375        // Read a file
376        else if (cmd.StartsWith("cat"))
377        {
378            bool file_found = false;
379            if (current_device.Admin)
380            {
381                String file_name = cmd.Split(' ')[1];
382                foreach (File i in current_device.Files)
383                {
384                    if (i.Name == file_name)
385                    {
386                        if (i.File_Type != "ware")
387                        {
388                            PrintOutput(i.File_Contents);
389                        }
390                        else
391                        {
392                            PrintOutput("Cannot read executable file");
393                        }
394                        file_found = true;
395                    }
396                }
397                if (!file_found)
398                {
399                    PrintOutput("ERRNO2: " + file_name + ": No such file");
400                }
401            }
402            else
403            {
404                PrintOutput("ERRNO1: Permission Denied");
405            }
406        }
407
408        // Disconnect
409        else if (cmd == "exit" || cmd == "disconnect" || cmd == "dc")
410        {
411            PrintOutput("Disconnected from " + current_device.Addr);
412            current_device.tracer.Stop();
413            current_device.tracer_counter.Stop();
414            current_device = null_device;
415        }
416
417        // Get admin password
418        else if (cmd == "recoverpwd")
419        {
420            bool failure = false;
421            foreach (var i in current_device.Ports.Keys)
422            {
423                if (!current_device.Ports[i].Item2)
424                {
425                    PrintOutput("Unable to recover password until all ports open");
426                    failure = true;
427                }
428            }
429            if (!failure)
430            {
431                if (!current_device.Firewall)
432                {
433                    if (!current_device.tracer.Enabled)
434                    {
435                        current_device.Trace();
436                    }
437                    PrintOutput("Administrator Password: " + current_device.Password);
438                }
439                else
440                {
441                    PrintOutput("Firewall active, cannot proceed");
442                }
443            }
444        }
445
446        // Login admin
447        else if (cmd.StartsWith("su"))
448        {
449            if (cmd.Split(' ')[1] == current_device.Password)
450            {
451                current_device.GetAdmin(true);
452                PrintOutput("Logged in as administrator");
453                current_device.tracer.Stop();
454                current_device.tracer_counter.Stop();
455            }
456            else
457            {
458                PrintOutput("Invalid Password");
459            }
460        }
461
462        // List files
463        else if (cmd == "ls")
464        {
465            foreach (File i in current_device.Files)
466            {
467                PrintOutput("- " + i.Name);
468            }
469        }
470
471        // Connect to system
472        else if (cmd.StartsWith("connect") || cmd.StartsWith("ssh"))
473        {
474            String address = cmd.Split(' ')[1];
475            bool is_dev_found = new bool();
476            is_dev_found = false;
477            foreach (Device i in netmap_list)
478            {
479                if (i.Addr == address)
480                {
481                    current_device.tracer.Stop();
482                    current_device.tracer_counter.Stop();
483                    output = "Connected to " + address;
484                    current_device = i;
485                    current_device.IsVisible = true;
486                    is_dev_found = true;
487                    break;
488                }
489            }
490            if (is_dev_found)
491            {
492                Console.Write("Found device");
493            }
494            else
495            {
496                output = "ERRNO127: Invalid address.";
497            }
498        }
499        else
500        {
501            bool success = false;
502            foreach (Ware i in player_software)
503            {
504                if (cmd.StartsWith(i.Name))
505                {
506                    if (cmd.Contains(" "))
507                    {
508                        if (Int32.TryParse(cmd.Split(' ')[1], out int asd))
509                        {
510                            PrintOutput("Running " + i.Name + ". ETA " + i.Speed + "s");
511                            if (!current_device.tracer.Enabled)
512                            {
513                                current_device.Trace();
514                            }
515                            i.Run(Int32.Parse(cmd.Split(' ')[1]), current_device, mem_counter);
516                            success = true;
517                        }
518                    }
519                }
520            }
521            if (!success)
522            {
523                PrintOutput("Command not found");
524            }
525        }
526       
527        /*else
528        {
529            output = cmd + " : Command not found.";
530        }*/
531        Timer.SingleShot(0.1, () => PrintOutput(output));
532    }
533    public static void PrintOutput(String txt)
534    {
535        /*
536         * Prints text to the output box
537         */
538        /*Array txt_list = txt.Split('\n');
539        List<String> txt_list_fin = new List<string>();
540        foreach (String i in txt_list)
541        {
542            if (i.Length > cmd_out.Width / cmd_out.Font.CharacterWidth)
543            {
544                String i2 = i.Insert(Math.Round(cmd_out.Width), "\n");
545                txt_list_fin.Add(i2);
546            }
547        }*/
548
549        cmd_out.Text += (txt/*cmd_out.Font.WrapText(txt, cmd_out.Width, cmd_out.Width)*/);
550        String[] rows = cmd_out.Text.Split('\n');
551        List<String> row_list = new List<String>(rows);
552        while (row_list.Count > Window.Height / cmd_out.Font.CharacterHeight)
553        {
554            row_list.RemoveAt(0);
555        }
556        cmd_out.Text = "";
557        foreach (String row in row_list)
558        {
559            String row2 = row;
560            if (row.Length > Math.Round(cmd_out.Width / cmd_out.Font.CharacterWidth))
561            {
562               row2 = row.Insert(((int) cmd_out.Width / (int) cmd_out.Font.CharacterWidth), "\n");
563            }
564            if (row2 != "")
565            {
566                cmd_out.Text += row2 + "\n";
567            }
568        }
569        //StringBuilder text = new StringBuilder(cmd_out.Text);
570    }
571
572    void checkHover(AnalogState mouseState)
573    {
574        foreach (Device i in netmap_list)
575        {
576
577            if (Mouse.IsCursorOn(i))
578            {
579                i.Image = device_icon_hover;
580            }
581            else
582            {
583                i.Image = device_icon;
584            }
585        }
586    }
587}
588
589class Device : GameObject
590{
591    public String Title;
592    public String Addr;
593    public String Password;
594    public List<File> Files;
595    public Dictionary<int, Tuple<String, bool>> Ports;
596    public bool Firewall;
597    public bool Admin;
598    private int Trace_Time;
599    public Timer tracer;
600    public Timer tracer_counter;
601
602    public Device(Image device_icon, String title, String address, String password, List<Tuple<int, String>> ports, bool firewall, List<File> files=null, bool isVisible=true, int trace_time=20) : base(50, 50)
603    {
604        Image = device_icon;
605        Title = title;
606        Files = new List<File>();
607        Addr = address;
608        Password = password;
609        Firewall = firewall;
610        Admin = false;
611        Trace_Time = trace_time;
612
613        Ports = new Dictionary<int, Tuple<String, bool>>();
614        if (files != null)
615        {
616            foreach (File i in files)
617            {
618                Files.Add(i);
619            }
620        }
621        foreach (var i in ports)
622        {
623            Ports.Add(i.Item1, Tuple.Create(i.Item2, false));
624        }
625        IsVisible = isVisible;
626        tracer = new Timer();
627        tracer_counter = new Timer();
628    }
629
630    public void Trace()
631    {
632        HackSim.PrintOutput("Warning: Trace detected");
633        HackSim.PrintOutput("Trace ETA: " + Trace_Time.ToString());
634        tracer_counter.Start();
635        tracer_counter.Interval = 5;
636        tracer_counter.Timeout += (() => HackSim.PrintOutput("Trace: T- " + Math.Round((Trace_Time - tracer.CurrentTime)).ToString() + "s"));
637        tracer.Start();
638        tracer.Interval = Trace_Time;
639        tracer.Timeout += (() => ShutDown());
640    }
641
642    private void ShutDown()
643    {
644        HackSim.PrintOutput("Warning: Trace finished. Initiating emergency shutdown.");
645        HackSim.PrintOutput("Shutting down. All data from this session will be removed.");
646        Timer.SingleShot(1, () => HackSim.PrintOutput("5"));
647        Timer.SingleShot(2, () => HackSim.PrintOutput("4"));
648        Timer.SingleShot(3, () => HackSim.PrintOutput("3"));
649        Timer.SingleShot(4, () => HackSim.PrintOutput("2"));
650        Timer.SingleShot(5, () => HackSim.PrintOutput("1"));
651        Timer.SingleShot(6, () => HackSim.PrintOutput("0"));
652        Timer.SingleShot(7, () => Game.Exit());
653    }
654
655    public int OpenPort(int num)
656    {
657        if (!Firewall)
658        {
659            Ports[num] = Tuple.Create(Ports[num].Item1, true);
660            return 1;
661        }
662        return 0;
663    }
664
665    public String GetAdmin(bool is_login)
666    {
667        if (!is_login)
668        {
669            foreach (KeyValuePair<int, Tuple<String, bool>> i in Ports)
670            {
671                if (!i.Value.Item2)
672                {
673                    return "ERRNO125: Port " + i.Key.ToString() + " is closed.";
674                }
675            }
676            if (Firewall)
677            {
678                return "ERRNO126: Firewall active.";
679            }
680        }
681        Admin = true;
682        return "Logged in as administrator.";
683    }
684}
685
686class Ware
687{
688    private bool Bypass_Firewall;
689    public String Port_Type;
690    public String Name;
691    public String Finish_Message;
692    private String Fail_Message_Port;
693    private String Fail_Message_Sec;
694    private String Fail_Message_Mem;
695    public int Speed;
696    public int Size;
697    public String output;
698
699    public Ware(bool bypass_firewall, string port_type, string name, string finish_msg, string fail_msg_port, string fail_msg_sec, int speed, int size)
700    {
701        output = "";
702        Bypass_Firewall = bypass_firewall;
703        Port_Type = port_type;
704        Name = name;
705        Finish_Message = finish_msg;
706        Fail_Message_Port = fail_msg_port;
707        Fail_Message_Sec = fail_msg_sec;
708        Speed = speed;
709        Size = size;
710        Fail_Message_Mem = "ERRNO12: Out Of Memory";
711    }
712
713    public void Run(int port, Device device, IntMeter mem)
714    {
715        if (mem.MaxValue - mem.Value > Size)
716        {
717            mem.Value += Size;
718            Timer.SingleShot(Speed, () => RunB(port, device, mem));
719        }
720        else
721        {
722            output = Fail_Message_Mem;
723        }
724    }
725
726    public void RunB(int port, Device device, IntMeter mem)
727    {
728        mem.Value -= Size;
729        foreach (int i in device.Ports.Keys)
730        {
731            if (device.Ports[i].Item1 == Port_Type)
732            {
733                if (Bypass_Firewall || !device.Firewall)
734                {
735                    output = Finish_Message;
736                    device.OpenPort(port);
737                }
738                else
739                {
740                    output = Fail_Message_Sec;
741                }
742                HackSim.PrintOutput(output);
743                return;
744            }
745        }
746        output = Fail_Message_Port;
747        HackSim.PrintOutput(output);
748    }
749}
750
751class File
752{
753    public String Name;
754    public String File_Type;
755    public String File_Contents;
756    public File(String name, String file_type, String file_contents=null)
757    {
758        Name = name;
759        File_Type = file_type;
760        File_Contents = file_contents;
761    }
762}
Note: See TracBrowser for help on using the repository browser.