VisualBasic Minecraft Anti-Cheat Software Multicomputering erkennen

D3sTROYER

Cadet 3rd Year
Registriert
Sep. 2011
Beiträge
36
Hallo,

ich bin derzeit dabei eine Anticheatsoftware für Minecraft zu programmieren.
Das Programm funktioniert wie folgt:

Der Benutzer lädt sich das Programm herunter, welches dann in bestimmten Abständen den Minecraft-Ordner scannt (Es erstellt MD5´s von den Dateien und gleicht diese mit einem Server ab.)

Das ganze funktioniert ja auch super gut, nur ist das Problem wie soll ich jetzt erkennen ob PAC (Das Anti-Cheat Programm) auch auf dem PC ausgeführt wird, auf dem der Benutzer spielt?

Es währe ja möglich eine VM zu Installieren (Mit dem Anti-Cheat und Minecraft) und dann auf dem echten PC zu Cheaten.

Wie kann ich dieses verhindern? (Per IP ist dieses nicht möglich, da die Computer ja hinter dem gleichen Modem sind).

Zudem habe ich auf dem Minecraftserver ja nur die Möglichkeit die IP auszulesen.


Hat da jemand eine Idee?

Vielen Dank schonmal ;)

MfG Kevin
 
Zuletzt bearbeitet:
Im Endeffekt muss dein Programm irgendwie auf den Arbeitsspeicherbereich von Minecraft zugreifen und dort iwie die Sitzungsid, Server-IP oder sonst was auslesen.
 
Gut, das dachte ich mir schon, aber Minecraft läuft ja auf Java-Basic als Sub-Prozzess.
Nach meinen Kenntnissen kann ich diesen Prozzess mit einem externen Programm nicht auslesen(Bzw. wüste nicht wo ich dort ansetzen soll).

Wüstest du dort eine Möglichkeit?

MfG Kevin
 
Naja, du weißt doch, wie der Minecraft Prozess heißt. Also suchst du den einfach, fertig.
Einzig knifflige ist es, den Client eindeutig zu identifizieren. Ein ziemlich simple Lösung wäre eine Kombination aus Username + ProcessID + Handle + WindowHandle. Das sollte eigentlich jede Kollision ausschließen.

Hier als Beispiel, ist C#, musst du dir selbst übersetzen. Natürlich musst da noch geprüft werden, ob es überhaupt einen Process an Stelle 0 gibt etc.

Code:
Process process = Process.GetProcessesByName("MineCraftProcessName")[0];
int processID = process.Id;
IntPtr handle = process.Handle;
IntPtr mwHandle = process.MainWindowHandle;
string username = Environment.UserName;

string s = string.Format("{0}-{1}-{2}-{3}", username, processID, handle, mwHandle);
byte[] data = Encoding.ASCII.GetBytes(s);
string clientID = Convert.ToBase64String(data);
 
Vielen Dank,

aber damit kann ich ja auch nicht auslesen ob der Benutzer wirklich mit "diesem" Pc auf dem Server spielt.


Code in VB form:
Code:
        Dim Mprocess As Process = Process.GetProcessById(1337)
        Dim processID As Integer = Mprocess.Id
        Dim handle As IntPtr = Mprocess.Handle
        Dim mwHandle As IntPtr = Mprocess.MainWindowHandle
        Dim username As String = Environment.UserName

        Dim s As String = String.Format("{0}-{1}-{2}-{3}", username, processID, handle, mwHandle)
        Dim data As Byte() = Encoding.ASCII.GetBytes(s)

        Dim clientID As String = Convert.ToBase64String(data)

Man müsste auf den String von Minecraft zugreifen in dem die IP vom Server liegt, denn man kann sich ja mit seinem Minecraft-Account nur einmal einloggen.

hätte da jemand eine Möglichkeit?

MfG Kevin
 
Zuletzt bearbeitet:
Hallo D3sTROYER,

D3sTROYER schrieb:
Man müsste auf den String von Minecraft zugreifen in dem die IP vom Server liegt, denn man kann sich ja mit seinem Minecraft-Account nur einmal einloggen.

hätte da jemand eine Möglichkeit?

Du könntest Dir mit GetExtendedTcpTable alle TCP-Verbindungen holen, diese durchgehen und diejenige mit der "richtigen" processID herausfiltern ;)

HTH

BigNum
 
Zuletzt bearbeitet:
D3sTROYER schrieb:
Hey BigNum,

Minecraft verwendet allerdings eine UDP-Verbindung, ich habe aber gesehen das es diese Funktion auch für UDP gibt.

Könntest du mir dort ein kleines Beispiel basteln?
Nein, das musst Du schon selber machen, ist ja auch nicht allzu schwer: Ruf die Funktion wie in "Remarks" beschrieben mit "ulAf"=AF_INET und "TableClass"=UDP_TABLE_OWNER_PID auf, dann erhältst Du eine Tabelle, in der die PIDs für die jeweilige Verbindung stehen. Also musst Du nur noch die Tabelle durchfräsen (for!) und mit Deiner vorgegeben PID vergleichen, dann hast Du was Du willst...


BigNum
 
Zurück
Oben