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

Revision 9793, 19.7 KB checked in by pymasalm, 22 months ago (diff)

My hands are typing words

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
31    Label info_label = new Label("Hostname: ");
32    List<string> info_text = new List<string>() { "\nTitle: ", "\nAddr: ", "\nPorts: "};
33
34    protected override void Update(Time time)
35    {
36        cmd_cursor.Position = cmd_line.Cursor.Position;
37        /*checkHover();*/
38        List<String> info_text_fin = new List<string>(info_text);
39        //foreach (String i in info_text)
40        for (int n = 0; n < info_text.Count; n++)
41        {
42            String i = info_text[n];
43            if (current_device != null && i != "")
44            {
45                var v = current_device.GetType();
46                var v2 = v.GetField(i.Split(':')[0].Split('\n')[1] as String);
47                var v3 = v2.GetValue(current_device);
48                if (!v3.GetType().Name.StartsWith("Dictionary"))
49                {
50                    info_text_fin[n] = i + "\n" + v3.ToString();
51                    info_label.Text = String.Join("\n", info_text_fin.ToArray());
52                    info_label.Top = info_label.Top = device_info.Top + MARGINS;
53                    info_label.Left = device_info.Left + MARGINS;
54                }
55                else
56                {
57                    String info_str = new String(' ', 0);
58                    int l = 0;
59                    foreach (var k in (v3 as Dictionary<int, Tuple<String, bool>>).Keys)
60                    {
61                        l++;
62                        info_str += k + " : " + (v3 as Dictionary<int, Tuple<String, bool>>)[k].Item1 + " : " + ((v3 as Dictionary<int, Tuple<String, bool>>)[k].Item2 ? "Open" : "Closed") + "\n";
63                    }
64                    l = 0;
65                    //info_str = i.ToString() + " : " + info_str;
66                    info_text_fin[n] = i + "\n" + info_str;
67                    info_label.Text = String.Join("\n", info_text_fin.ToArray());
68                    info_str = "";
69                    info_text_fin = info_text;
70                    info_label.Top = device_info.Top + MARGINS;
71                    info_label.Left = device_info.Left + MARGINS;
72                }
73            }
74        }
75        base.Update(time);
76    }
77    public override void Begin()
78    {
79        mem_counter = new IntMeter(0);
80        File test_file = new File("Test", "text", "Lorem Ipsum");
81        mem_counter.MaxValue = 256;
82        Level.Background.Color = Color.Black;
83        null_device = new Device(null, "", "", "", new List<Tuple<int, String>> { Tuple.Create(0, "None") }, false);
84        current_device = null_device;
85        netmap_list = new List<Device>();
86        netmap_list.Add(new Device(device_icon, "Your PC", "10.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> { }));
87        netmap_list.Add(new Device(device_icon, "CCC FileDrop", "122.34.5.99", "1331337337", new List<Tuple<int, String>> {/* Tuple.Create(22, "SSH"), Tuple.Create(21, "FTP"), Tuple.Create(25, "SMTP") */}, false, new List<File> { new File("FTPBruteForce", "ware", "FTP_Crack") }));
88
89        player_software = new List<Ware>();
90        Ware FTP_Crack = new Ware(true, "FTP", "FTPBruteForce", "FTP Brute Force attack complete", "Invalid port", "Security error", 3, 64);
91        Ware SSH_Crack = new Ware(false, "SSH", "SSHDictAttack", "SSH Cracking complete", "Invalid port", "Security error", 5, 52);
92        Ware SMTP_Crack = new Ware(true, "SMTP", "SMTPOverload", "SMTP Port overloaded", "Invalid port", "Security error", 7, 100);
93
94
95        SOURCECODE_FONT = LoadFont("SourceCode");
96
97        command_list = new List<string>();
98        foreach (Ware i in player_software)
99        {
100            command_list.Add(i.Name);
101        }
102        command_list.Add("cat ");
103        command_list.Add("ls");
104        command_list.Add("ssh");
105        command_list.Add("connect");
106        command_list.Add("shutdown now");
107        command_list.Add("exit");
108        command_list.Add("disconnect");
109        command_list.Add("recoverpwd");
110
111
112        usr_name = "Guest";
113        StringList cmd_list = new StringList();
114        // Create command line input box
115        cmd_line = new InputBox();
116        cmd_line.Font = SOURCECODE_FONT;
117        cmd_line.Color = Color.Black;
118        cmd_line.TextColor = accent_color;
119        cmd_line.BorderColor = accent_color;
120        cmd_line.Cursor.IsVisible = false;
121        cmd_cursor = new Widget(cmd_line.Cursor.Width, cmd_line.Cursor.Height);
122        cmd_cursor.Color = accent_color;
123        Timer t = new Timer();
124        t.Interval = 0.5;
125        t.Timeout += () => cmd_cursor.IsVisible = !cmd_cursor.IsVisible;
126        t.Start();
127        cmd_line.Width = Window.Width / 2 - MARGINS * 2;
128        cmd_line.X = Window.Width / 2 - cmd_line.Width / 2 - MARGINS;
129        cmd_line.Y -= Window.Height / 2 - cmd_line.Height / 2 - MARGINS;
130        Timer.SingleShot(0.5, () => Add(cmd_line));
131        cmd_line.Add(cmd_cursor);
132
133
134        // Create command line output box
135        cmd_out = new Label();
136        cmd_out.Font = SOURCECODE_FONT;
137        cmd_out.BorderColor = accent_color;
138        cmd_out.TextColor = accent_color;
139        cmd_out.Color = Color.Black;
140        cmd_out.Width = cmd_line.Width;
141        cmd_out.Height = Window.Height - cmd_line.Height - MARGINS * 3;
142        cmd_out.X = cmd_line.X;
143        cmd_out.Y = Window.Height / 2 - cmd_out.Height / 2 - cmd_line.Height + MARGINS / 2;
144        cmd_out.SizeMode = TextSizeMode.None;
145        cmd_out.HorizontalAlignment = HorizontalAlignment.Left;
146        cmd_out.VerticalAlignment = VerticalAlignment.Top;
147        Timer.SingleShot(0.7, () => Add(cmd_out));
148
149
150        PhoneBackButton.Listen(ConfirmExit, "");
151        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "");
152        Keyboard.Listen(Key.Enter, ButtonState.Pressed, () => ProcessCommands(cmd_line, cmd_out), "");
153        Keyboard.Listen(Key.Tab, ButtonState.Pressed, () => AutoComplete(), "");
154
155        // Create netmap
156        netmap = new Widget(cmd_out.Width + MARGINS, Window.Height / 2 - MARGINS * 2);
157        netmap.SizingByLayout = false;
158        netmap.Layout = new RowLayout();
159        netmap.X = Window.Width - cmd_out.Width * 2.5 - MARGINS * 4.5;
160        netmap.Y = netmap.Height / 2 + MARGINS;
161        netmap.Color = Color.Black;
162        netmap.BorderColor = accent_color;
163        Timer.SingleShot(0.8, () => Add(netmap));
164
165        foreach (Device i in netmap_list)
166        {
167            netmap.Add(i);
168            Mouse.ListenOn(i, MouseButton.Left, ButtonState.Pressed, ClickConnect, "", i);
169        }
170        // Create info window
171        device_info = new Widget(cmd_out.Width + MARGINS, Window.Height / 2 - MARGINS * 2 - cmd_line.Height);
172        device_info.SizingByLayout = false;
173        device_info.Layout = new VerticalLayout();
174        device_info.X = Window.Width - cmd_out.Width * 2.5 - MARGINS * 4.5;
175        device_info.Bottom = cmd_line.Bottom;
176        device_info.Color = Color.Black;
177        device_info.BorderColor = accent_color;
178        Timer.SingleShot(0.3, () => Add(device_info));
179
180        info_label.HorizontalAlignment = HorizontalAlignment.Left;
181        info_label.Tag = "Title";
182        info_label.Left = device_info.Left + MARGINS;
183        info_label.Top = device_info.Top - info_label.Height * 2 - MARGINS * 2;
184        info_label.TextColor = accent_color;
185        info_label.Font = SOURCECODE_FONT;
186
187        Timer.SingleShot(0.6, () => Add(info_label));
188
189        // Create RAM bar
190        ProgressBar ram_bar = new ProgressBar(device_info.Width, cmd_line.Height);
191        ram_bar.Bottom = device_info.Top + MARGINS;
192        ram_bar.X = device_info.X;
193        ram_bar.BorderColor = accent_color;
194        ram_bar.Color = Color.Black;
195        ram_bar.BarColor = Color.Green;
196        ram_bar.BindTo(mem_counter);
197        Timer.SingleShot(1.1, () => Add(ram_bar));
198
199        Mouse.ListenMovement(1.0, checkHover, "");
200    }
201
202    void ClickConnect(Device dev)
203    {
204        Console.WriteLine(dev.Addr);
205        ProcessCommands(cmd_line, cmd_out, ("ssh " + dev.Addr));
206    }
207
208    void AutoComplete()
209    {
210        List<String> file_matches = new List<String>();
211        List<String> matches = new List<String>();
212        foreach(String i in command_list)
213        {
214            if (i.ToLower().StartsWith(cmd_line.Text.Split(' ')[0].ToLower()))
215            {
216                matches.Add(i);
217            }
218        }
219        if (matches.Count == 1)
220        {
221            if (cmd_line.Text.ToLower().StartsWith(matches[0].ToLower()))
222            {
223                foreach (File i in current_device.Files)
224                {
225                    if (i.Name.ToLower().StartsWith(cmd_line.Text.Split(' ')[1].ToLower()))
226                    {
227                        file_matches.Add(i.Name);
228                    }
229                }
230                if (file_matches.Count == 1)
231                {
232                    cmd_line.Text = cmd_line.Text.Split(' ')[0].Trim(' ') + " " + file_matches[0];
233                }
234                else
235                {
236                    foreach (String i in file_matches)
237                    {
238                        PrintOutput(i);
239                    }
240                }
241            }
242            else
243            {
244                cmd_line.Text = matches[0];
245            }
246        }
247        else
248        {
249            foreach (string i in matches)
250            {
251                PrintOutput(i);
252            }
253        }
254    }
255
256    void ProcessCommands(InputBox cmd_line, Label cmd_out, String cmd="")
257    {
258        /*
259         * Processes commands entered by the user.
260         */
261        if (cmd == "")
262        {
263            cmd = cmd_line.Text;
264            cmd_line.Text = "";
265        }
266        PrintOutput((current_device.Admin ? "root" : "guest") + "@" + current_device.Addr + " ~/# " + cmd);
267        String output = "";
268
269        // Clone a file to your system (always index 0)
270        if (cmd.StartsWith("scp")||cmd.StartsWith("copy"))
271        {
272            if (current_device.Admin)
273            {
274                String file_name = cmd.Split(' ')[1];
275                foreach (File i in current_device.Files)
276                {
277                    if (i.Name == file_name)
278                    {
279                        if (i.File_Type == "ware")
280                        {
281                            // TODO: Implement this
282                            //player_software.Add
283                        } 
284                    }
285                }
286            }
287        }
288
289        // Echo something
290        else if (cmd.StartsWith("echo "))
291        {
292            output = cmd.Split(' ')[1];
293        }
294
295        // Exit
296        else if (cmd.StartsWith("shutdown"))
297        {
298            Exit();
299        }
300
301        // Read a file
302        else if (cmd.StartsWith("cat"))
303        {
304            if (current_device.Admin)
305            {
306                String file_name = cmd.Split(' ')[1];
307                foreach (File i in current_device.Files)
308                {
309                    if (i.Name == file_name)
310                    {
311                        if (i.File_Type != "ware")
312                        {
313                            PrintOutput(i.File_Contents);
314                        }
315                    }
316                    else
317                    {
318                        PrintOutput("ERRNO2: " + file_name + ": No such file");
319                    }
320                }
321            }
322            else
323            {
324                PrintOutput("ERRNO1: Permission Denied");
325            }
326        }
327
328        // Get admin password
329        else if (cmd == "recoverpwd")
330        {
331            bool failure = false;
332            foreach (var i in current_device.Ports.Keys)
333            {
334                if (!current_device.Ports[i].Item2)
335                {
336                    PrintOutput("Unable to recover password until all ports open");
337                    failure = true;
338                }
339            }
340            if (!failure)
341            {
342                if (!current_device.Firewall)
343                {
344                    PrintOutput("Administrator Password: " + current_device.Password);
345                }
346                else
347                {
348                    PrintOutput("Firewall active, cannot proceed");
349                }
350            }
351        }
352
353        // Login admin
354        else if (cmd == "su " + current_device.Password)
355        {
356            current_device.GetAdmin(true);
357        }
358
359        // List files
360        else if (cmd == "ls")
361        {
362            foreach(File i in current_device.Files)
363            {
364                PrintOutput("- " + i.Name);
365            }
366        }
367
368        // Connect to system
369        else if (cmd.StartsWith("connect") || cmd.StartsWith("ssh"))
370        {
371            String address = cmd.Split(' ')[1];
372            bool is_dev_found = new bool();
373            is_dev_found = false;
374            foreach (Device i in netmap_list)
375            {
376                if (i.Addr == address)
377                {
378                    output = "Connected to " + address;
379                    current_device = i;
380                    is_dev_found = true;
381                    break;
382                }
383            }
384            if (is_dev_found)
385            {
386                Console.Write("Found device");
387            }
388            else
389            {
390                output = "ERRNO127: Invalid address.";
391            }
392        }
393        else
394        {
395            foreach (Ware i in player_software)
396            {
397                if (cmd.StartsWith(i.Name))
398                {
399                    if (Int32.TryParse(cmd.Split(' ')[1], out int asd))
400                    {
401                        PrintOutput("Running " + i.Name + ". ETA " + i.Speed + "s");
402                        i.Run(Int32.Parse(cmd.Split(' ')[1]), current_device, mem_counter);
403                    }
404                }
405            }
406        }
407       
408        /*else
409        {
410            output = cmd + " : Command not found.";
411        }*/
412        Timer.SingleShot(0.1, () => PrintOutput(output));
413    }
414    public static void PrintOutput(String txt)
415    {
416        /*
417         * Prints text to the output box
418         */
419        txt = System.Text.RegularExpressions.Regex.Replace(txt, @"[^\u0000-\u007F]+", string.Empty);
420        cmd_out.Text += (txt);
421        String[] rows = cmd_out.Text.Split('\n');
422        List<String> row_list = new List<String>(rows);
423        while (row_list.Count > Window.Height / cmd_out.Font.CharacterHeight)
424        {
425            row_list.RemoveAt(0);
426        }
427        cmd_out.Text = "";
428        foreach (String row in row_list)
429        {
430            cmd_out.Text += row + "\n";
431        }
432        //StringBuilder text = new StringBuilder(cmd_out.Text);
433    }
434
435    void checkHover(AnalogState mouseState)
436    {
437        foreach (Device i in netmap_list)
438        {
439
440            if (Mouse.IsCursorOn(i))
441            {
442                i.Image = device_icon_hover;
443            }
444            else
445            {
446                i.Image = device_icon;
447            }
448        }
449    }
450}
451
452class Device : GameObject
453{
454    public String Title;
455    public String Addr;
456    public String Password;
457    public List<File> Files;
458    public Dictionary<int, Tuple<String, bool>> Ports;
459    public bool Firewall;
460    public bool Admin;
461
462    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) : base(50, 50)
463    {
464        Image = device_icon;
465        Title = title;
466        Files = new List<File>();
467        Addr = address;
468        Password = password;
469        Firewall = firewall;
470        Admin = false;
471        Ports = new Dictionary<int, Tuple<String, bool>>();
472        if (files != null)
473        {
474            foreach (File i in files)
475            {
476                Files.Add(i);
477            }
478        }
479        foreach (var i in ports)
480        {
481            Ports.Add(i.Item1, Tuple.Create(i.Item2, false));
482        }
483    }
484
485    public int OpenPort(int num)
486    {
487        if (!Firewall)
488        {
489            Ports[num] = Tuple.Create(Ports[num].Item1, true);
490            return 1;
491        }
492        return 0;
493    }
494
495    public String GetAdmin(bool is_login)
496    {
497        if (!is_login)
498        {
499            foreach (KeyValuePair<int, Tuple<String, bool>> i in Ports)
500            {
501                if (!i.Value.Item2)
502                {
503                    return "ERRNO125: Port " + i.Key.ToString() + " is closed.";
504                }
505            }
506            if (Firewall)
507            {
508                return "ERRNO126: Firewall active.";
509            }
510        }
511        Admin = true;
512        return "Logged in as administrator.";
513    }
514}
515
516class Ware
517{
518    private bool Bypass_Firewall;
519    public String Port_Type;
520    public String Name;
521    public String Finish_Message;
522    private String Fail_Message_Port;
523    private String Fail_Message_Sec;
524    private String Fail_Message_Mem;
525    public int Speed;
526    public int Size;
527    public String output;
528
529    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)
530    {
531        output = "";
532        Bypass_Firewall = bypass_firewall;
533        Port_Type = port_type;
534        Name = name;
535        Finish_Message = finish_msg;
536        Fail_Message_Port = fail_msg_port;
537        Fail_Message_Sec = fail_msg_sec;
538        Speed = speed;
539        Size = size;
540        Fail_Message_Mem = "ERRNO12: Out Of Memory";
541    }
542
543    public void Run(int port, Device device, IntMeter mem)
544    {
545        if (mem.MaxValue - mem.Value > Size)
546        {
547            mem.Value += Size;
548            Timer.SingleShot(Speed, () => RunB(port, device, mem));
549        }
550        else
551        {
552            output = Fail_Message_Mem;
553        }
554    }
555
556    public void RunB(int port, Device device, IntMeter mem)
557    {
558        mem.Value -= Size;
559        foreach (int i in device.Ports.Keys)
560        {
561            if (device.Ports[i].Item1 == Port_Type)
562            {
563                if (Bypass_Firewall || !device.Firewall)
564                {
565                    output = Finish_Message;
566                    device.OpenPort(port);
567                }
568                else
569                {
570                    output = Fail_Message_Sec;
571                }
572                HackSim.PrintOutput(output);
573                return;
574            }
575        }
576        output = Fail_Message_Port;
577        HackSim.PrintOutput(output);
578    }
579}
580
581class File
582{
583    public String Name;
584    public String File_Type;
585    public List<File> Folder_Contents;
586    public String File_Contents;
587    public File(String name, String file_type, String file_contents=null)
588    {
589        Name = name;
590        File_Type = file_type;
591        File_Contents = file_contents;
592    }
593}
Note: See TracBrowser for help on using the repository browser.