[C#] Een anti-cheat programmatje maken

  • Onderwerp starter Onderwerp starter avo
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

avo

Gebruiker
Lid geworden
26 sep 2006
Berichten
35
Hi,
een vriend van mij heeft aan me gevraagt voor een anti-cheat programmaatje te maken voor zijn private server.
ik ken wel de basis van C# maar niet volledig.

het programmatje dat ik moet maken voor hem heb ik eventjes in stapjes opgeschreven:
1) wanneer de anti-cheat programma aanstaat moet het elke keer vernieuwt worden voor te krijken of er geen cheat open staat.
2) Als het programmatje met de naam "Cheat" open staat, dat het onmiddelijk sluit.


Het puntje nummer 1) moet gebreuren met een iteratie.
En het puntje nummer 2) weet ik niet hoe ik dit kan doen, maar ik denk in een constrole structuur.

Maar hoe kan ik dit eigenlijk doen.

ik heb heel weinig van code:
Code:
        static void Main(string[] args)
        {
            Console.SetCursorPosition(1, 1);
            Console.ForegroundColor = ConsoleColor.Green;
            Console.Write("[INFO]:");
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine(" Anti-Cheat programma is gestart");
            // doorloopt elke keer de instructies. 
            for(int i = 0; i > -1; i++)
            {
                   //  Hier de if instructies. 
            }
        }

ik hoop dat iemand me opweg kan helpen.


Hartelijk dank
 
Laatst bewerkt:
Deze vorm van anti-cheat zou dan bij de spelers zelf als programma geïnstalleerd moeten staan en uitgevoerd moeten worden wanneer de speler het spel opstart. Dit op zijn private server zetten heeft dus geen zin, want van daaruit kun je niet zien wat voor programma's de speler open heeft staan. En je kunt van een cheatende speler niet verwachten dat hij het anti-cheat programma zelf op zal starten. Dus zal deze vorm van anti-cheat in het spel zelf verwerkt moeten worden.

Simpelweg zoeken op een programma met een bepaalde naam zal niet helpen. Desnoods zal een cheater zijn programma Notepad noemen en uitvoeren.

Om werkelijk iets tegen cheaters te doen zul je aan de kant van de server in de gaten moeten houden of de binnenkomende pakketjes verdacht zijn of niet, en aan de hand hiervan maatregelen nemen.
 
Laatst bewerkt:
Dat is wel juist wat je zegt, maar als iemand cheat en hij/zij kent er niets van en download het en probeert het te openen en het sluit elke keer, dan verwijdert hij/zij het en gebruikt het niet meer.
Niet veel mensen weten het om de naam ervan te verranderen, het is maar voor een deel tegen te houden.

De anti-cheat ga ik in een DLL zetten en die DLL implementeren in de Launcher.exe
wanneer de launcher geopend wordt word de DLL al actief.
 
hallo,
ik ben het met Arjan B eens
je kunt de anti-cheat beter niet in een .dll file zetten maar gewoon in de .exe file (dus als een class binnen het spel zelf), dat verkleint de kans dat het verwijderd of veranderd wordt

bovendien hangt het van het spel af welke manier van anti-cheat je moet gebruiken,
in de meeste gevallen is het inderdaad beter dit (op zijn minst gedeeltelijk) server-side te doen, door bijvoorbeeld in bepaalde spellen te kijken of de persoon onnatuurlijk snel reageert (bijv. elk frame schiet, dit kan een persoon niet)

als je zegt om welk spel het gaat kunnen we/ik je verder helpen

mvg jorn
 
Hoe krijg je die .dll dan bij de speler geïnjecteerd? Moet hij de launcher nog downloaden? Dan kun je het net zo goed meteen in de launcher zelf verwerken :).

Als je hier werkelijk mee door wilt gaan zou ik zoeken naar hoe je de handle van een venster krijgt in Windows en hoe je daar de caption van krijgt. linkje
 
Security through obscurity is no security at all :p

Verder is het schrijven van een beveiliging niet zo eenvoudig als je wellicht denkt: hoe/wat/waar moet je iets beveiligen als je zelf niks weet over het omzeilen van een beveiliging?
Zo ben ik er vrij zeker van dat je er niet van op de hoogte bent dat de broncode van jouw programma standaard gewoon beschikbaar is via bijvoorbeeld .NET reflector: de hacker heeft dus
het volledig inzicht op de werking van de beveiliging en kan het 'cheatprogramma' daar zonder moeite op laten anticiperen (en daarmee sluit je dus ook niet de groep 'n00bs die downloaden' uit :p)

Bovendien hangt het van het spel af welke manier van anti-cheat je moet gebruiken,
in de meeste gevallen is het inderdaad beter dit (op zijn minst gedeeltelijk) server-side te doen, door bijvoorbeeld in bepaalde spellen te kijken of de persoon onnatuurlijk snel reageert (bijv. elk frame schiet, dit kan een persoon niet)

Het is inderdaad het beste om server-side te controleren omdat je daar zelf de controle blijft houden, wat bij een client-side beveiliging niet het geval is.

Als je hier werkelijk mee door wilt gaan zou ik zoeken naar hoe je de handle van een venster krijgt in Windows en hoe je daar de caption van krijgt

En hoe betrouwbaar is de caption van een window? Bij "cheat"-programma's als CE/MHS worden die ook gewoon omzeild door de data te wijzigen waarop gecontroleerd wordt. Dat is in principe toch maar een kleine moeite om te implementeren.
 
Ja, het is wel een lastig stukje :p.
wanneer je de launcher opend, update hij automatisch, als de update 100% is dan kun je op de play knop drukken.

Ik wil eigenlijk met dit programma verder gaan.
Zo bouw ik verder mijn basis uit en leer ik er meer bij.
ik ga tegen hem ook zeggen dat hij desnoots GameMasters moet aanwerven voor het onder controle te houden ;).

Eerst ben ik het aan het maken in een executable bestandje, als dat bestandje af is, maak ik een hallo applicatie'tje met de naam Cheat, wanneer ik de hallo applicatie open doet dat het daarna gewoon afsluit.
en daarna ging ik het in DLL zetten.
dit dll bestandje toeveoegen aan mijn reference en naderhand coderen in launcher.exe

En voor het omzeilen dat kun je altijd denk ik.
Zelf veel ken ik er niet van, dat is wel waar wat jullie zeggen :rolleyes:.

Het is een lastig onderwerpje voor een anti-cheat programmaa'tje te maken.
vermits ik nog maar de basis heb.


Danku allemaal voor jullie informatie :D.
 
Laatst bewerkt:
Als ik het goed voor heb zoek je dus zoiets voor een assembly?
Code:
            for(int i = 0; i > -1; i++)
            {
                foreach (Process pros in Process.GetProcesses())
                {
                    if (pros.ProcessName.Contains("cheat"))
                    {
                        //  Wanneer er een bastand met de naam cheat openstaat. 
                        // Wordt het bestand automatisch gesloten + u client. 
                        Process[] Naam = Process.GetProcessesByName("Hier_Naam_Spel");
                        foreach (Process Naam01 in Naam)
                            Naam01.Kill();
                        pros.Kill();
                    }
                }
            }
Dit detecteerd alleen de naam " cheat " als je andere namen of hoofdletters wil additieven dan moet je gewoon de hele if-statement kopieren en de andere nam erin zetten zoals bijvoorbeeld: Cheat of ChEaT , ....
Je moet wel oppassen want, nu gaat het komen.
Als u bestand anticheat noemt en je runt het, dan sluit het automatich af, dit komt omdat je de naam cheat in u anticheat hebt staan.


Mvg, Jim
 
Code:
            for(int i = 0; i > -1; i++)
            {
                foreach (Process pros in Process.GetProcesses())
                {
                    if (pros.ProcessName.Contains("cheat"))
                    {
                        //  Wanneer er een bastand met de naam cheat openstaat. 
                        // Wordt het bestand automatisch gesloten + u client. 
                        Process[] Naam = Process.GetProcessesByName("Hier_Naam_Spel");
                        foreach (Process Naam01 in Naam)
                            Naam01.Kill();
                        pros.Kill();
                    }
                }
            }

Let er op dat het bovenstaande een oneindige lus is, aangezien je start met "i = 0" en omdat je vervolgens i alleen maar verhoogt zal "i > -1" altijd (nou ja, niet altijd als je denkt aan overflow..) gelden.
Ik neem aan dat die lus er per ongeluk in is gelaten, gekopieerd van de opening post, aangezien die lus geen doel dient ^^.
 
Laatst bewerkt:
Ik wou het eigenlijk zelf inelkaar steken, maar dat geeft niets :).

Mag ik één n00by vraagje stellen ?
wat doet foreach eigenlijk ?
 
Het gaat elk element in een lijst af.

Code:
foreach (TypeVanElement element in lijstVanElementen) {
    // doe iets met element
}

doet hetzelfde als:

Code:
for (int i = 0; i < lijstVanElementen.size(); ++i) {
    // doe iets met lijstVanElementen[i]
}

Al kun je (volgens mij, raadpleeg Google als ik fout zit) in een foreach lus niet aanpassingen maken aan de waardes van de elementen van de lijst.

http://www.dotnetperls.com/foreach
Niets wat Google je niet had kunnen vertellen ^^.
 
Laatst bewerkt:
Sorry, :(
Dankuwel allemaal voor mij wat te helpen :).
Nu ga ik eens proberen om de code van jimowns wat verder uit te breiden.


Vriendelijke groetjes Avo.
 
Beste "avo",

Ik heb uw vraag verplaatst van "C / C++" naar "C#.net"

Met vriendelijke groet,
Stefan (Tha Devil)
Moderator Helpmij.nl
 
Ik wil eigenlijk met dit programma verder gaan.
Zo bouw ik verder mijn basis uit en leer ik er meer bij.

Het zal een goede opdracht voor je zijn om C# beter onder controle te krijgen, maar niet op het gebied van security. .NET RCE trekt me persoonlijk niet aan, dus ben daar nooit mee bezig, maar je moet de code op zijn minst met behulp van een obfuscator "onleesbaar" maken voor de hacker (omdat anders de code zoals ik al zei gewoon beschikbaar is). Als de code gewoon leesbaar is dan kan het patchen van één byte al voldoende zijn om de beveiliging te omzeilen. Zoals ik al zei hou ik me niet bezig met .NET RCE, dus het voorbeeld is gewoon C(++)/ASM:

[cpp]
const unsigned int CHEATER_DETECTED = 1;
// ...
if (detectCheater() == CHEATER_DETECTED) // stop het programma
[/cpp]

Wordt vertaald naar iets als:

[cpp]
call detectCheater ; aanroep van functie die controleert of er gecheat wordt (het resultaat wordt opgeslagen in eax)
cmp eax, 1 ; controleer of het resultaat gelijk is aan 1 (true -> er wordt gecheat)
je exit ; indien er een cheater gedetecteerd is wordt het programma afgesloten
[/cpp]

Je kan er van uitgaan dat de detectCheater functie enkel een 0 of een 1 oplevert (false/true), dus bij het wijzigen van 'cmp eax, 1' naar bijvoorbeeld 'cmp eax, 5', zal er nooit aan de voorwaarde voldaan worden die aangeeft dat er een cheater gevonden is. Of bijvoorbeeld gewoon alle bovenstaande instructies vervangen met NOP's, wordt het programma zelfs nog iets sneller :p
(in het voorbeeld van jimowns is het bijvoorbeeld voldoende om enkel de for-loop te patchen zodat deze nooit uitgevoerd wordt = weg met je beveiliging)

Er zijn trouwens wel wat dingen te bedenken om het de aanvaller lastiger te maken (al heb ik die enkel in C/C++/ASM toegepast en steekt .NET anders in elkaar, al is dat afgaande op challenges van bijvoorbeeld crackmes.de ook gewoon goed te beveiligen), maar het is geen eenvoudige kost en aan je posts te zien lijkt het me eerst verstandig om eerst gewoon de basis van het programmeren en C# an sich te leren. ;)
 
Hier snap ik nietveel van :(, hoe ik beste kan update.
Het is allemaal heel ingewikkeld op het gebiedt van securety.

Ja de basis van C# daar ben ik mee bezig :p, maar ik moet oefeningentjes zoeken op internet maar kan er niet veel vinden.

De oefeningen kan ik zo'n beetje wel goed maken in mijn boekje.
Maar als ik zoiets als dit moet doen dan zit ik totaal in de knoop :p.

en het probleem is ook eigenlijk wel, als jullie programmeren hoe doen jullie dat dan ?
want er zullen mss wel veel manieren zijn, hoe je kunt programmeren.
ik doe het letterlijk uit mijn hoofd en probeer het te onthouden, ik weet dat dit niet goed is, maar hoe doen jullie dat dan ?
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan