[C#] C#eat Engine

Discussion in 'Source Code' started by krusty, Jul 25, 2014.

  1. krusty

    krusty Addicted Member Inventar

    Joined:
    Sep 8, 2012
    Messages:
    175
    Likes Received:
    0
    Hey Leute,

    vor einigen Monaten hatte ich den komischen Einfall, selbst so eine Art Cheat-Engine in C# zu schreiben.
    Ich habs natürlich nicht fertig bekommen. Ich wollte ursptünglich einen Disassembler einbauen, aber das wurde mir dann zu komplex.
    Das Projekt wie es momentan ist beinhaltet Klassen zur Suche von Werten im Speicher.
    Funktioniert momentan nur mit 32 Bit Adressen.
    Ich erinnere mich nicht mehr genau an alles, versuche es trotzdem zu erklären:
    Klassen:
    • c_MemoryReader : natürlich zum Auslesen von Werten im Speicher (byte, int, float, string, double ...)
    • c_MemoryWriter : Gegenstück zum MemoryReader, zum Schreiben in den Speicher.
    • c_Process : Klasse, die einen Prozess darstellt. Muss z.B. beim Erstellen eines c_MemoryReaders angegeben werden, damit dieser auf dem Prozess arbeiten kann.
    • ByteConverter : Erweiterung der BitConverter Klasse aus dem .net Framework, wird benutzt um alles mögliche in ein Byte-Array zu packen, oder alles mögliche aus einem Byte-Array zu holen.
    • WinApi : Beinhaltet sehr viele importierte WinApi Funktionen und Strukturen für Speicherseiten von Windowsprozessen.
    • c_Scan & c_Scan2 : Zwei Klassen zum Durchsuchen des Speichers, beide machen im Grunde das gleiche auf eine andere Art und Weise. Ich habe beide Klassen entworfen, weil eine davon sehr langsam sucht, mehr weiß ich leider nicht.
    • c_AddressTable : Kp, was ich da gemacht hab. Sollte glaub ich mal eine Liste werden, in der man Adressen Freezen kann, so wie man es aus Cheat Engine kennt. Momentan besitzt die Klasse nur eine Methode. Man gibt der Methode eine Adresse und die Methode gibt das Modul zurück, in dem die Adresse liegt, das ist recht gut zim Disassemblen
    Wie funktioniert die Suche ?
    für c_Scan
    Zunächst suchen wir uns einen Prozess und öffnen ihn:
    Code:
    c_Process p = new c_Process("calc");
    p.open();
    Jetzt können wir mit einem "Scan" darin suchen.
    Wir suchen nach 32Bit unsigned Integer, die genau den Wert 1337 haben:
    Code:
    c_Scan<UInt32> c = new c_Scan<UInt32>(p, SCANTYPE.EXACTVALUE, new UInt32[] { 1337 });
    List<c_MemoryAddress<UInt32>> f = c.doMemoryScan();
    f ist jetzt eine Liste, von Adressen, die den Wert 1337 haben.

    Wir können auf dieser Liste jetzt erneut einen Scan durchführen, dazu müssen wir lediglich die Liste der gerade gescannten Adressen übergeben.
    Jetzt scannen wir mal alle Adressen von gerade ebend, die zwischen 100 und 200 liegen:
    Code:
    List<c_MemoryAddress<UInt32>> f2 = c.reScan(f ,SCANTYPE.VALUEBETWEEN , new UInt32 [] { 1000, 2000} )
    Lassen wir uns das Ergebnis mal ausgeben:
    Code:
    foreach (c_MemoryAddress<UInt32> m in f2)
    {
                 s += m.Address.ToString("X") + " - " + m.Value.ToString() + "\n";
    }
    MessageBox.Show(s);
    für c_Scan2
    Funktioniert ähnlich, hier das Bsiepiel dafür:
    Code:
    c_Process p = new c_Process("calc");
    p.open();
    
    c_Scan2 c = new c_Scan2(p, SCANTYPE.EXACTVALUE, new object[] { (UInt32)1337 });
    List<c_MemoryAddress2> f = c.doMemoryScan(WinApi.ALLOCATIONPROTECT.PAGE_READWRITE);
    
    c.changeScanType(SCANTYPE.VALUEBETWEEN, new object[] { (UInt32)1000, (UInt32)2000 });
    List<c_MemoryAddress2> b = c.reScanMemory(f);
    
    string s = "";
    foreach (c_MemoryAddress2 m in b)
    {
       s += m.Address.ToString("X") + " - " + m.Value.ToString() + "\n";
    }
    MessageBox.Show(s);
    Wichtig ist, dass man immer schön castet, also wie Hier
    Code:
    new object[] { (UInt32)1000, (UInt32)2000 }
    immer explizite Datentypen angibt.

    Wie funktioniert die Suche genau ?
    Also, zunächst wird der Prozess geöffnet. Der Speicher von Prozessen unter Windows ist in Seiten (Pages) aufgeteilt. Diese werden von den c_Scan Klassen ausgelesen (getPageList oder so)
    Nicht auf alle Pages können wir zugreifen, einige sind vor Lese- oder Schreibzugriffen geschützt, deshalb durchsucht der c_Scan(2) nur Speicherseiten, die ein bestimmtes Flag besitzen.
    Jede Seite besitzt eine Startadresse und eine Seitengröße. Der c_Scan berechnet die Adressen und Scannt den Bereich von Startadresse bis (Startadresse + Seitengröße).

    Bei Fragen, immer her damit.
    Wenn ihrs benutzt, wäre nett, wenn ihr credits gebt.
    Sagt mir gerne auch bescheid, wenn ihr Klassen benutzt, würde mich interessieren, was ihr so daraus macht.

    Liebe Grüße,
    Alex




    [​IMG]
     
  2. Skyfail

    Skyfail Administrator Staff Member Administrator Inventar

    Joined:
    Mar 21, 2013
    Messages:
    792
    Likes Received:
    1
    Sieht gut aus, krusty! :)
     
  3. krusty

    krusty Addicted Member Inventar

    Joined:
    Sep 8, 2012
    Messages:
    175
    Likes Received:
    0
    Hätte jemand Interesse mit mir daran weiter zu arbeiten ? Ich hab zwar nicht so viel zeit, aber an sich ists doch n recht nettes Projekt.
    Die frage ist halt, ob es sich lohnt sowas zu programmieren.
     
  4. VBTyp

    VBTyp Addicted Member Inventar

    Joined:
    Apr 16, 2013
    Messages:
    431
    Likes Received:
    1
    Wenn du mir ne feste Aufgabe gibst und nichts dagegen hast, dass ichs nur mach, wenn ich zwischen meinen Hauptprojekten mal Zeit hab, gerne.
     
  5. krusty

    krusty Addicted Member Inventar

    Joined:
    Sep 8, 2012
    Messages:
    175
    Likes Received:
    0
    Bei mir wäre es ja nicht anders,
    Ich würde mir erst mal gedanken über einen pointerscan machen.
    Wie angesprochen wäre ein disassambler sehr cool, den könntexman an vielen stellen gebrauchen.
    Außerdem müsste man diexganzen winapi structs prüfen, einigexsind recht lasch kopiert, eventuell stimmen die größen nicjt überall.
    Dann könnte man sich Gedanken über 64 bit Prozesse machen...
     
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.