Programmering III Experthold

From Teknologisk videncenter
Revision as of 09:50, 11 December 2017 by Makn (talk | contribs)
Jump to: navigation, search

Generelt:

Mail: makn@mercantec.dk

Torsdag

Sådan importeres en .exe fil ind i et application domain:

        static void Main(string[] args)
        {
            AppDomain appDomain = AppDomain.CreateDomain("New Domain");
            appDomain.ExecuteAssembly("HelloWorld.exe");

        }


Hent denne fil, og lav et program der bruteforcer kodeordet. kodeordetindeholder kun lowerCase bogstaver, som ikke indeholder æ, ø eller å (hint: kodeordet er "hot"):

Efter at du har hentet filen, højreklik da på den og vælg egnskaber/properties. Nederst i venstre hjørne er der et flueben som skal fjernes i "fjern blokering".

MadsFjernBlokering.jpg


https://drive.google.com/file/d/1KuRDP74fuzuChf4RfFNq2E5pRw6MH2Wp/view?usp=sharing

Eksempel på kode:

        static void Main(string[] args)
        {
            AppDomain encryptedFile = AppDomain.CreateDomain("New Appdomain");
            string[] key = {"aaa"};

            int success = encryptedFile.ExecuteAssembly("EncryptedFile.exe ", key);

            if(sucess == 1)
            {
                 Console.Writeline("Koden var korrekt");
            }
            else
            {
                 Console.WriteLine("Koden var forkert");
            }


            Console.ReadKey();
        }


Hjælpekode:

        static void Main(string[] args)
        {
            char[] letters = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };

            int numberOfLetters = letters.Length; //26 LETTERS
            Console.WriteLine("Number of letters: {0}", numberOfLetters);

            for (int i = 0; i < numberOfLetters; i++)
            {
                Console.WriteLine(letters[i]);
            }
            Console.ReadKey();
        }


Udvid din bruteforce algoritme så den kan distribueres på flere PC'er, så de hver kan tage et segment af kode, Prøv at knække koden på følgende fil: https://drive.google.com/file/d/1Fu9I-6HCKhU71gE1rMxpk-UZ2XrwVjeY/view?usp=sharing Husk at fjerne blokaden lige som ved den sidste fil

Koden indeholder 6 ialt bogstaver (stadig kun lowercase bogstaver). Benyt hinandens computere til at finde koden.


Fredag:

Godmorgen. I dag vil jeg gerne have at i gennemgår følgende emner: UDP netværks-protokollen og tråde.


For at kunne sene data fra én PC til en anden igennem et netværk skal man benytte en netværks-protokol. Der findes mange protokoller som kan benyttes, men i skal i dag arbejde med UDP protokollen.

UDP er en simpel protokol som kan sende en datapakke afsted imod en IP adresse, men om pakken når frem eller ej, finder vi aldrig ud af. Der er altså i visse tilfælde 50% chance for at pakken når frem til modtageren, hvis vi er på et dårligt netværk.

For at se UDP i aktion, skal vi benytte en Listener og en Sender.

Prøv at indsætte følgende kode i 2 forskellige C# konsol programmer, og start Listeneren først, derefter start Senderen.

Listener:

static void Main(string[] args)
        {
            UdpClient client = new UdpClient(11001);
            IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 11001);

            byte[] recievedBytes = client.Receive(ref endpoint);
            string recievedMessage = Encoding.ASCII.GetString(recievedBytes);
            Console.WriteLine("Beskeden var: " + recievedMessage);
            Console.ReadKey();
        }


Sender:

        static void Main(string[] args)
        {
            Console.WriteLine("Type an IP address:");
            string ip = Console.ReadLine();

            UdpClient client = new UdpClient();
            IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(ip), 11001);

            string message = "Hej!";

            byte[] bytesToSend = Encoding.ASCII.GetBytes(message);
            client.Send(bytesToSend, bytesToSend.Length, endpoint);
            Console.WriteLine("Message sendt!");
            Console.ReadKey();
        }

For at et program både kan sende OG modtage datapakker igennem UDP, skal vi benytte en tråd. En tråd er en måde hvor vi kan få vores applikation til at udføre 2 forskellige jobs på samme tid.

I C# er det heldigvis nemt at oprette en tråd.

Eksempel på en tråd:

static void Main(string[] args)
        {
            Console.WriteLine("Start");
 
            Thread thread = new Thread(myThread);
            thread.Start();
 
            string input = Console.ReadLine();
            Console.WriteLine(input);
            Console.ReadKey();
        }
 
        static void myThread()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(i);
            }
        }



Opgave: Lav et program, som både kan sende og modtage data til og fra hinanden.


Se hvor langt du kan nå. Vi gennemgår løsningen på mandag.


TCP:

TCP sender:

static TcpClient tcpClient;
        static NetworkStream ns;
        static IPEndPoint endPoint;

        static void Main(string[] args)
        {
            tcpClient = new TcpClient("172.16.237.161", 11000);
            ns = tcpClient.GetStream();

            for (int i = 1; i <= 100; i++)
            {
                byte[] bytesToSend = Encoding.ASCII.GetBytes(i.ToString() + "\n");
                ns.Write(bytesToSend, 0, bytesToSend.Length);
            }
            Console.ReadKey();
        }


TCP listener:

static TcpListener tcpListener;
        static TcpClient tcpClient;
        static IPEndPoint endPoint;
        static NetworkStream ns;
        static Stopwatch sw;
        static long milliseconds;
        static int index = 0;
        static bool run = true;

        static Thread t;

        //Listens for TCP data
        static void Main(string[] args)
        {
            t = new Thread(ListenerThread);
            sw = new Stopwatch();

            IPEndPoint ipEndPoint_any = new IPEndPoint(IPAddress.Any, 11000);

            tcpListener = new TcpListener(ipEndPoint_any);
            tcpClient = new TcpClient();
            tcpListener.Start();

            tcpClient = tcpListener.AcceptTcpClient();
            endPoint = (IPEndPoint)tcpClient.Client.RemoteEndPoint;
            ns = tcpClient.GetStream();
            t.Start();

            Console.ReadKey();
            Console.WriteLine("I recived " + index + " number of packages out of 100.");
            Console.WriteLine("It took " + milliseconds + " milliseconds in total");
            run = false;
            t.Abort();
            Console.ReadKey();
        }

        static void ListenerThread()
        {
            while (run)
            {
                if (ns.DataAvailable)
                {
                    if (!sw.IsRunning)
                    {
                        sw.Start();
                    }
                    byte[] recivedBytes = new byte[512];
                    byte[] trimmedBytes;
                    int bytesRead = ns.Read(recivedBytes, 0, recivedBytes.Length);
                    trimmedBytes = new byte[bytesRead];
                    Array.Copy(recivedBytes, trimmedBytes, bytesRead);
                    string result = Encoding.ASCII.GetString(trimmedBytes);
                    Console.Write(result);
                    milliseconds = sw.ElapsedMilliseconds;
                    index++;
                }
            }
        }

Opgave:

Lav et simpelt chatprogram der benytter TCP, hvor man både kan sende og modtage beskeder.