Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1158
Herkunft: Norddeutschland

beantworten | zitieren | melden

Ich behaupte mal, dass es auch ohne ein Wort in Program.cs zu ändern geht, wenn man was in den Projekteigenschaften umstellt.

Btw: Gilt

+"Floste"
als ein Wort?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Floste am .
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers
Sarc
myCSharp.de - Member



Dabei seit:
Beiträge: 426

beantworten | zitieren | melden

Wie Floste vorgeschlagen hat einfach den Namen mit + an das string.Empty anfügen.
Alternativ:

if (args.Length() == 0 || args[0] == string.Empty) {
    Console.WriteLine("Bitte geben Sie den Namen des Angestellten an, den Sie feuern möchten!");
    return;
}

public static class X
{
    public static int Length(this string[] s)
    {
        return s.Length == 0 || s[0].Equals("MyUsername") ? 0 : 1;
    }
}
private Nachricht | Beiträge des Benutzers
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1158
Herkunft: Norddeutschland

beantworten | zitieren | melden

Alternativ:

Exakt das gleiche hatte ich auch probiert, aber die property vom string hat vorrang -> geht nicht!

Vielleicht solltest du deinen code mal compilieren^^

Also ich finde es viel schöner einfach garnichts zu ändern an program.cs und stattdessen eine alternative main einzustellen:

using System.Linq;
using System.Reflection;

public static class ABoringClass
{
    static void Main(string[] args)
    {
        if (args.FirstOrDefault() == "Ihr Name") args[0] = "";
        typeof(Program).InvokeMember("Main", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Static, null, null, new object[1] { args });
    }
}
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Floste am .
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers
Sarc
myCSharp.de - Member



Dabei seit:
Beiträge: 426

beantworten | zitieren | melden

hmm, vielleicht solltest Du denn obigen Code mal kompilieren... ^^
private Nachricht | Beiträge des Benutzers
pdelvo
myCSharp.de - Member

Avatar #avatar-3354.png


Dabei seit:
Beiträge: 1407

beantworten | zitieren | melden

oder doch mit ner extension. und dann aber ganz dreißt einen Buchstabendreher reinbauen. aus Length wird Lentgh ;) Und schon kann mans mit ner Extensionmethode machen
private Nachricht | Beiträge des Benutzers
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1158
Herkunft: Norddeutschland

beantworten | zitieren | melden

Fehler
Fehler 1 Methodenname erwartet. C:\********\test\Program.cs 8 13 test
t
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers
Sarc
myCSharp.de - Member



Dabei seit:
Beiträge: 426

beantworten | zitieren | melden

Zitat von pdelvo
oder doch mit ner extension. und dann aber ganz dreißt einen Buchstabendreher reinbauen. aus Length wird Lentgh ;) Und schon kann mans mit ner Extensionmethode machen
hmm, die Extensionmethod die ich oben gepostet habe funktioniert doch, auch mit dem Methodennamen "Length".
zumindest kompiliert das bei mir...
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1380
Herkunft: Berlin

beantworten | zitieren | melden

Hi,

mein erster gescheiterter Ansatz war einfach eine neue Main-Methode zu definieren, (ohne parameter, aber mit int als return typ) in der Hoffnung dass der Compiler irgendeiner Reihenfolge beim Ermitteln der Main-Methoden hat. Dem ist aber nich so, wenn mehrere passen könnten, gibts einfach den Fehler, dass mehrere Einstiegspunkte definiert sind.

Aber der wirkliche Trick besteht im Wörtchen partial.

Also wird die gegebende Klasse einfach als partial markiert und in der Solution die nachfolgende Datei irgendwoe versteckt hinzugefügt:

using System;
using System.Linq;

static partial class Program 
{
  static Program() // Typinitialisier! Ha, ich werd vor der Main gerufen!
  {
    if("MyName".Equals(Environment.GetCommandLineArgs().Last()))
    {
      Main(new string[0]); // Main kann man sogar für den Hack wiederverwenden
      Environment.Exit(0); // uuunnd tschüss
    }	
  }
}

beste Grüße
zommi
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von zommi am .
private Nachricht | Beiträge des Benutzers
Spontifixus
myCSharp.de - Member

Avatar #avatar-3052.gif


Dabei seit:
Beiträge: 408
Herkunft: Hannover

beantworten | zitieren | melden

Hallo zommi,

der Trick mit dem partial-keyword und dem Typinitialisierer war gefragt. Allerdings kommt mein Typinitialisierer mit einer einzigen Zeile Code aus - ohne sich dabei auf die Kommandozeilenparameter zu beziehen ;)
Ich werd nochmal ein Weilchen warten und ansonsten meinen Code posten...

@AndereAnsätze: Egal was dabei rauskommt: bis jetzt ist zommi der erste der sich tatsächlich an die Aufgabenstellung gehalten hat. (Eine versteckte Datei in der Solution)...

Viele Grüße,
Markus :)
private Nachricht | Beiträge des Benutzers
bSharp
myCSharp.de - Member



Dabei seit:
Beiträge: 51

beantworten | zitieren | melden

Oder so...


        static void Main(string[] args)
        {
            if (args.Length == 0 || args[0] == String.Empty)
            {
                Console.WriteLine("Bitte geben Sie den Namen des Angestellten an, den Sie feuern möchten!");
                return;
            }
        }


    class String
    {
        public static string Empty = "Mein Name";
    }
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von bSharp am .
private Nachricht | Beiträge des Benutzers
bSharp
myCSharp.de - Member



Dabei seit:
Beiträge: 51

beantworten | zitieren | melden

Haha man muss nichtmal etwas in der Datei ändern.
Projekteigenschaften -> Anwendung -> Startobjekt: Hier wählt man einfach eine andere Klasse mit Main-Methode und kann tun was man will. :)
private Nachricht | Beiträge des Benutzers
Spontifixus
myCSharp.de - Member

Avatar #avatar-3052.gif


Dabei seit:
Beiträge: 408
Herkunft: Hannover

beantworten | zitieren | melden

Hallo bSharp,

auch deine Lösung erzielt den gewünschten Effekt, aber hält sich nicht ganz an die Aufgabenstellung. Allerdings hat deine Lösung auch was - denn wer vermutet schon, dass sich hinter einem String nicht ein System.String verbirgt...

Dann stelle ich hier mal meine Lösung vor. Die Ursprungsklasse wird (wie von zommi bereits vorgeschlagen) um das keyword partial ergänzt.

static partial class Program {

    [STAThread]
    static void Main(string[] args) {

        if (args.Length == 0 || args[0] == string.Empty) {
            Console.WriteLine("Bitte geben Sie den Namen des Angestellten an, den Sie feuern möchten!");
            return;
        }

        // Jede
        // Menge
        // Code
        // um
        // den
        // Angestellten
        // loszuwerden
        // ...

    }

}

Die andere Hälfte der Klasse Program, die wir dem Programm unterschieben enthält (wie von zommi vorgeschlagen) einen Typinitialisierer - denn nur der wird in diesem Beispiel vor der Methode Main ausgeführt.

Aber worin liegt nun die Magie die die Überprüfung in der originalen Main-Methode ein unerwartetes Ergebnis liefern lässt? Der gewünschte Effekt lässt sich mit einer einzigen Zeile voll Schabernack erzielen:

static partial class Program {

    static Program()  {
        typeof(string).GetField("Empty").SetValue(null, "Ihr Name");
    }

}

Da zommi an der Aufgabenstellung am nächsten dran war darf er weitermachen! :)

Ich muss allerdings gestehen, dass ich nicht von ganz allein auf diese Aufgabenstellung gekommen bin: The Daily WTF: The Disgruntled Bomb (in den Kommentaren findet sich die Anregung...)

Viele Grüße,
Markus :)
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1380
Herkunft: Berlin

beantworten | zitieren | melden

Hi Spontifixus,

danke für den Lösungs-Zuspruch und insbesondere Danke für die schöne Aufgabe. Ich kann nun hoffentlich etwas ähnlich schönes bieten:
Im Anhang befindet sich eine kleine .NET-Applikation die einen geheimen Text enthält. Dieser Text ist "verschlüsselt" hinterlegt und wird angezeigt, wenn man das richtige Password eingegeben hast.

[B]Wie lautet der geheime Text?[/B]
Alle Mittel und Wege sind zugelassen - seid kreativ !

[COLOR]Ich habe ein paar Abwehrmaßnahmen/Hindernisse/Fallstricke eingebaut, sonst macht es ja keinen Spaß ;)[/COLOR] Der verschlüsselte, geheime Text befindet sich in der statischen Variable CryptoGame.Program.CryptedText.

Möge der schnellste gewinnen! :-)

Viel Vergnügen und beste Grüße
zommi
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von zommi am .
Attachments
private Nachricht | Beiträge des Benutzers
el_panter
myCSharp.de - Member



Dabei seit:
Beiträge: 406
Herkunft: Sömmerda

beantworten | zitieren | melden

morgen

besteht die möglichkeit das programm für eine frühere frameworkversion zu kompilieren?
MfG Paul
private Nachricht | Beiträge des Benutzers
Joetempes
myCSharp.de - Member

Avatar #avatar-3309.jpg


Dabei seit:
Beiträge: 914
Herkunft: Germany

beantworten | zitieren | melden

Lösung:

Der geheime Text lautet "Bankgeheimnis".
Das Passwort ist "lkgnjokfejjop";

Vorgehensweise:
Reflektor!

Code:


namespace PW_hack
{
    static class Program
    {
        private static int numberA;
        private static int numberB;
        private static int numberC;
        private static int baseCharacter = 0x6d;
        private static string CryptedText = "Cctjjcjlqpqgp";

        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            string refPass = Program.ReferencePassword();
            string refPassDecry = Program.Decrypt(refPass);

            string hashRef = Program.HashPassword(refPass);
            string hashEntered = Program.HashPassword("lkgnjokfejjop");

            bool result = hashRef == hashEntered; //Strike?
        }

        private static string ReferencePassword()
        {
            //Stupid Check removed...

            int[] numArray = new int[] { 11, 0x17, 0x3e, -11, 0x1f, -22, 0x18, 0x48, 0x53, 0x1f, 0x20, -24, -33 };
            numberA = 3;
            numberB = 7;
            numberC = -10; // hier auf -10 gesetzt, wie im Dissasebler gesehen (numberA + numberB = -10)

            StringBuilder builder = new StringBuilder();
            for(int i = 0; i < numArray.Length; i++)
            {
                char ch = (char)(baseCharacter + (numArray[i] / numberC));
                builder.Append(ch);
            }
            return builder.ToString();
        }

        private static string Decrypt(string password)
        {
            StringBuilder builder = new StringBuilder();
            for(int i = 0; i < Math.Min(password.Length, CryptedText.Length); i++)
            {
                builder.Append((char)((CryptedText[i] + password[i]) - baseCharacter));
            }
            return builder.ToString();
        }

        private static string HashPassword(string password)
        {
            byte[] bytes = Encoding.ASCII.GetBytes(password);
            return BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(bytes));
        }
    }
}

Comment:
Das war ne sehr schöne Aufgabe, hat mir wirklich Spaß gemacht und meinem Chef 1h meiner Arbeitszeit gekostet.

Ich überleg mir was neues (Das ich das noch erlebe...).
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Joetempes am .
private Nachricht | Beiträge des Benutzers
xxxprod
myCSharp.de - Experte

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1420
Herkunft: Österreich\Wien

beantworten | zitieren | melden

Also wie du das mit den -10 rausgefunden hast bleibt mir ein Rätsel.

Ansonsten mit numA+numB kommt 10 raus(wie Reflector das halt auch anzeigt) und dann wäre das Passwort "noslpkotuppkj" und der geheime Text dann "Dezimalsystem";

Lg XXX


//EDIT: Lol aber mit der originalen Assembly funktionierts natürlich nicht. :-)
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von xxxprod am .
private Nachricht | Beiträge des Benutzers
Joetempes
myCSharp.de - Member

Avatar #avatar-3309.jpg


Dabei seit:
Beiträge: 914
Herkunft: Germany

beantworten | zitieren | melden

Zitat von xxxprod
Also wie du das mit den -10 rausgefunden hast bleibt mir ein Rätsel.
Attachments
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1380
Herkunft: Berlin

beantworten | zitieren | melden

Hi,

sehr gut! Dann bist du jetzt dran.
Zitat
//EDIT: Lol aber mit der originalen Assembly funktionierts natürlich nicht. :-)
So war es gedacht ;-)
Die normale Assembly über Reflection einfach ansprechen geht nicht so einfach, weil hash-checks auf die entry-assembly drin sind. Den Code aber einfach rauskopieren, kopiert etwas falsches, wegen dem "numberA + numberB" - Hack ;)
Wenn man übrigens genau hinschaut, sieht man dass der Reflector das "+" dazwischen auch grün macht, es also zum Bezeichner gehört anstatt schwarz wie den normalen Additionsoperator ;D

Und ich hab ganz schön lange gebraucht, bis ich ein Programm hab, was mir Wort-Paare ausspuckt, sodass bei dem +- Fehler beides mal sinnvolle Wörter rauskommen - damit man denkt, man sei bereits fertig ;)

Noch eine Frage an Joetempes. Konntest du den Program-Konstruktor mit dem Reflector ansehen? Den hab ich nämlich so manipuliert, dass Reflector bei mir in jeder Ansicht abschmiert ;)

beste Grüße
zommi
private Nachricht | Beiträge des Benutzers
Joetempes
myCSharp.de - Member

Avatar #avatar-3309.jpg


Dabei seit:
Beiträge: 914
Herkunft: Germany

beantworten | zitieren | melden

Hallo zommi,

der Konstruktor an sich ging nicht zu öffnen, es folgte eine Exception vom Reflactor.
Es ging nur so, wie in meinem angehängten Bild.

Also, ich überleg mir was...
private Nachricht | Beiträge des Benutzers
Scavanger
myCSharp.de - Member

Avatar #avatar-3209.jpg


Dabei seit:
Beiträge: 323

beantworten | zitieren | melden

Auch wenns schon gelöst ist:
Hier noch der Beweis das man den Konstruktor durchaus mit dem Reflektor ansehen kann:

Vorgehensweise:
Die Assembly mit ildasm disassemblieren, die .il Datei öffnen, dann im Konstruktor den ganzen überflüssigen IL-Code rausschmeißen (was meinen Texteditor an den Rand der Leistungsfähigkeit brachte, so viele NOP auf einem Haufen! 8o). Dann sieht man eh schon was der Konstruktor eigentlich macht.
Jetzt noch mit ilasm neu kompilierten und: Tada!

Wenn man jetzt noch in der ReferencePassword()bei Instruktion 0018 aus "bne.un.s IL_0022" z.B.
"beq.s IL_002d" macht, umgeht man den Hash-Check und die neu kompilierte Assembly läuft.
Attachments

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
private Nachricht | Beiträge des Benutzers
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1158
Herkunft: Norddeutschland

beantworten | zitieren | melden

[offtopic]Mein Jade.NET kann das auch so, der generierte code ist aber etwas seltsam^^ Guter test iwie[/offtopic]
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Floste am .
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers
Joetempes
myCSharp.de - Member

Avatar #avatar-3309.jpg


Dabei seit:
Beiträge: 914
Herkunft: Germany

beantworten | zitieren | melden

Ich gebe die Aufgabe ab, 24h sind mir zu kurz....
private Nachricht | Beiträge des Benutzers
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1158
Herkunft: Norddeutschland

beantworten | zitieren | melden

Zitat
Ich gebe die Aufgabe ab, 24h sind mir zu kurz....

Das heißt dann wohl, ich darf eine stellen, wenn ich möchte?

Ich hab mal ein .net-programm geschrieben, das macht ne passwortabfrage. Es ist auf den ersten blick mit 65 zeilen ziemlich einfach und überschaubar, aber... guckt einfach selbst rein... :evil:

Ich habe auf ziemlich viele gemeinheiten verzichtet und es kommen keine hashes/kryptozeugs vor, kein dateizugriff und kein netzwerkzugriff, es wird kein code nachgeladen, es ist alles managed code und lässt sich mit reflector anzeigen.

Bin mal gespannt, wer als erster ne idee hat (oder auch nicht).
(Wenn jemand zweifeln sollte: es ist lösbar!)

Genaue aufgabenstellung: Finde eine eingabe, die das angehängte programm dazu bringt, "korrekt" auszugeben.

(Irgendwie denke ich, dass es niemand schaffen wird.)
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Floste am .
Attachments
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2346

beantworten | zitieren | melden

Ist cool, ist es überhaupt möglich ohne Eingriff ein "korrekt" zu erhalten?
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1158
Herkunft: Norddeutschland

beantworten | zitieren | melden

Ich hab mir schon gedacht, dass das bezweifelt werden wird:
Zitat von oben
(Wenn jemand zweifeln sollte: es ist lösbar!)

JA, es ist möglich! Das ist ja grade das witzige^^

EDIT: Hab mir das ganze im reflector angeguckt. Das return false ist ziemlich falsch übersetzt! Es steht so nicht im code:


        return ergebnis;

Ich bleibe dabei: Es gibt eine lösung!
Dieser Beitrag wurde 5 mal editiert, zum letzten Mal von Floste am .
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2346

beantworten | zitieren | melden

Aufgrund des return false; auch meine Frage. =) Jade machts hingegen richtig.

Irgendwie hab ich das Gefühl ich überseh was...

Denn laut Code müssten eigentlich alle Einträge des Arrays (je Methode) passen. Also überseh ich definitiv den springenden Punkt warum sie es nicht tun.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von inflames2k am .
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1158
Herkunft: Norddeutschland

beantworten | zitieren | melden

Zitat
Denn laut Code müssten eigentlich alle Einträge des Arrays (je Methode) passen.

Jap, das ist 100% richtig!
Nur habe ich 2 msil-instruktionen vertauscht
Zitat
Also überseh ich definitiv den springenden Punkt warum sie es nicht tun.
Der springende punkt ist ein typensprung.
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2346

beantworten | zitieren | melden

Sag mal zeigt dein Jade den Code in der richtigen Reihenfolge an? - Denn anders als beim Reflector seh ich darin die Prüfung der Eingabe vor der eigentlichen Eingabe.
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1158
Herkunft: Norddeutschland

beantworten | zitieren | melden

Eigendlich sollte es in der richtigen reihenfolge anzeigen, tut es allerdings in desem falle nicht :(. es fehlt ein goto, das aus bestimmten gründen nicht angezeigt wird. Ich werd mich zur nächsten version ans beheben machen. Wenigstens kann ich mich trösten, dass reflector auch mist baut.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Floste am .
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers
markus111
myCSharp.de - Member

Avatar #avatar-3108.png


Dabei seit:
Beiträge: 520
Herkunft: Henstedt-Ulzburg

beantworten | zitieren | melden

Halloo Hacker-Community,

ich habs: das "Passwort" ist einfach System.String[]
Wie ich drauf gekommen bin? Ich weiß es grad selber nicht, ich weiß nur: geraten ist es nicht!

mfg.
markus111
private Nachricht | Beiträge des Benutzers