Beiträge von K03

    Die gibts wie Sand am Meer.Er hat einfach einen funktionierenden C++ Cheat der undetected ist, wovon es allerdings auch immer mehr gibt, leider.

    Mein hack ist in lua..( 98%)
    benutzt nur c++ für nospread (nicht selbst gemacht) und antianti aim
    zum laden benutze ich zudem ein lua hook den ich selbst geschrieben habe^^

    Vorwort dies ist eine Weiterführung zu dem Letzen teil( Detours 1/2 ).
    Fals ihr diesen noch nicht gelesen habt, solltet ihr euch überlegen dies zuerst zutun.
    Dort habe ich gezeigt wie das Prinzip hinter Detouren erklärt, hier werde ich auf die Detection und noch ein paar sinnvolle Beispiele der Anwendung von Detouren geben.


    Also starten wir mal mit der Detection:
    Es gibt viele Möglichkeiten um Herauszufinden ob eine Funktion Gedetourd wurde, oder nicht.
    Die einfachste ist die Adressen im Speicher zu vergleichen dies ist simpel zu ereichen indem man tostring( any type )  aufruft.
    Wenn man dieser Funktion eine Funktion Übergibt  print( tostring( function() end ) )  so gibt sie ein String aus der wie folgt aussieht Funktion: 0x4fbf82c0 dies repräsentiert die Adresse der Funktion im speicher.
    Jedoch wenn man mit dieser Methode Funktionen überprüft muss man im Vorfeld ( vor der detour ) die Adresse speichern!


    Also...
    Wie mach ich es besser ( *im nachhinein* ) ?
    Nun Gmod stellt uns hierfür perfekte Funktionen zur Verfügung ( ich liste hier nur die eine auf! es gibt natürlich mehr )


    debug.getinfo( function , string )
    diese returnt eine Tabelle mit Folgenden Feldern( https://wiki.garrysmod.com/page/Structures/DebugInfo ) :


    So ist es natürlich super einfach herauszufinden ob eine Funktion Gedetourd wurde oder nicht.
    Indem man überprüft ob sie die src oder die linedefined Herausfindet Doch Halt.


    Es gibt trotzdem Möglichkeiten Dies zu Fälschen z.b kann man mit Runstring den Src Faken und die line auch. ( wenn man weis was man tut ich werde hier zu keine src geben möchte nicht das ihr das könnt *cac bypass* )


    Also muss es doch ein weg geben es noch besser zu machen
    -JA


    string.dump( function , boolean )
    Dies gibt uns den Bytecode einer funktion zurück ( bitte aufpassen auf NULL-chars *string.dump * ) ( -> https://wiki.garrysmod.com/page/string/dump )



    nunja um Speicher zu Spiechern rate ich jedoch util.CRC( string ) zu benutzen um eine eindeutige crc checksume zu bilden JEDOCH MUSS MAN DIES TUN BEVOR SIE GEDETOURD WURDE


    so zum Schluss: die Funktionen die zur Detection Benutzt werden sind meist in der debug , jit und jit.util Lib



    So jetzt zu den Sinnvollen Detours:
    Ich persönlich detour nicht so gerne da es ( wie bereits erwähnt ) mit Rechenleistung verbunden ist.
    jedoch ist es immer eine gute Idee RunConsoleCommand zu detrouren um zusehen wenn Admins ( über ULX ) etwas in eurer Console ausführen wollen.
    Sowie file.Read damit sie nicht eure daten ( im Gmod Verzeichniss ) auslesen können.


    Fals ihr fragen / Vorschläge / Kritik habt Schriebt ein Kommentar oder eine PM.


    <3 K03 <3


    Btw ich werde bald mit einem Tutorial Anfangen indem ich versuche Lua zu erklären und irgend etwas Sinnvolles zu schrieben :) ( fals ihr Ideen habt oder dabei sein wollt ( z.b ihr Source Code habt den ich benutzen soll oder gute Ideen ) schreibt ein Komentar )

    Jedem sollte klar sein das es in lua Funktionen gibt..
    Z.b.:

    Code
    function foo( text ) 
        print( text ) 
    end


    diese kann man einfach mit foo( "hallo welt" )  aufrufen


    nun kann man in lua alles in allem speicher und überschreiben das ermöglicht ganz neue Wege wie:

    Code
    function foo( text ) 
        print( text ) 
    end 
    local x = foo//x ist jetzt auch eine Referenz auf foo
    x("hallo") -> foo( "hallo" )//bei dem aufruf von x rufen wir die orginal foo auf



    Doch was bringt und das jetzt ?
    Nun wir können somit Referenzen auf Funktionen speichern und die Orginale überschreiben


    Code
    function foo( text ) 
        print( text ) 
    end 
    local x = foo//x ist jetzt auch eine Referenz auf foo
    foo = function( ) end //foo ist jetzt auf eine andere Funktion
    //bemerke die Orginal Funktion ist immer noch da nur zeigt jetzt x auf sie und nichtmehr der Platzhalter "foo" die Orginale Funktion bleibt jedoch nur im Speicher solang eine gültige Referenz auf sie besteht (siehe: garbagecollector )


    Nun wenn jemand versucht foo( "hallo welt" )  so gelangt er nicht an die foo Funktion sondern an die leere "Überschriebene" jedoch ist die Orginale immernoch mit x("hallo welt") aufrufbar.


    Aber was bringt uns das?
    Ganz einfach, man kann so werte faken oder debuggen es hat quasi unendlich viele Anwendungsgebiete...


    Hier ein Beispiel:


    Code
    local old = FindMetaTable("Player")["IsAdmin]//speichern der alten Funktion
    FindMetaTable("Player").IsAdmin = function( ply )//überschreiben der funktion
          if ( ply == LocalPlayer() ) then //code den ich ausführen will
                 return true  
          end 
        return old( ply )//und am ende die orginale aufrufend damit es keiner merkt
    end



    Also kann man jetzt ganz einfach Funktionen wie print o.ä. Detouren und rausfinden mit Hilfe der Debug Funktionen von wo es aufgerufen wird.
    Doch halt!
    Es ist zu raten keine Funktionen zu detouren die oft benötigt werden da es je nach Hook( den Code den ich in der Funktion ausführen lassen will ) zu massiven Performenc Problemen kommen kann.




    Man kann außerdem auch so beeinflussen was eine Funktion zurückliefert wie in dem beispiel wenn der übergeben Spieler der Lokale ist wird die Orginale nicht aufgerufen! Man sollte sich aber immer vor Augen haben was dies für Probleme machen kann ( immer richtige typen returnen vor allem bei Globalen Funktionen ) !



    <3 K0e <3



    btw ich suche immer noch nach Themen falls ihr was nicht wisst oder Intressen habt könnt ihr diese mir gerene mitteilen ( pm oder als Komentar )

    ich bin mir nicht ganz sicher was das machen soll vor allem wie der Aufruf aussehen sollte da v eine Tablle ist jedoch als 2 Aufrufparameter übergeben wird aka. richtiger Aufruf wäre ja dann:table:print({value = 1 })
    zudem muss GetValue definiert sein.. und ( kleiner tipp ) Funktionen IMMER klein schrieben ( bzw erster Buchstabe ) (das hilft der Übersicht und wird später in richtigen Programmen helfen glaub mir )


    zudem wird local value = _p:GetValue() nie benutzt und ist demnach überflüssing

    Nun ich wollte hier mal etwas Klar stellen :)
    ich möchte hinweisen das der sich anschließen Text für Programmiere bzw Leute die sich ein bischen mit lua auskennen geschrieben ist

    Also ihr habt bestimmt schon öfters mal Funktionen Gesehen wie player:SteamID().
    Nun dieser Aufruf ist KEIN normaler Aufruf denn der Spieler ansich ist eine Tabelle ( bzw userdata ).
    Welche eine Meta Tabelle hat mit Funktionen...
    Nun wie ruft lua die oben gennante Zeiele auf ?


    FindMetaTable( "Player" ).SteamID( player ) 


    also merkt man Meta Funktionen haben als ersten Parameter immer ein Referenz auf die Tabelle von der sie aufgerufen werden.
    Nun Dies kann man sich leicht zu nutze machen z.b siehe mein lua oop thread dort benutz ich es um objekte zu erstellen.


    aber hier noch ein beispiel zum zeigen warum es schlau ist:

    Code
    local test = { i = 1}
    	  test.print = function( tab ) print( tab.i ) end //nun kennt tabelle test print


    es gibt jetzt zwei Möglichkeiten dies aufzurufen:
    test:print()
    test.print(test)
    Beides ist genau gleich!


    nun mit diesem Wissen ist es möglich eine Funktion zu erstellen mit der man diese Table returnt um so Objekte in Lua zu haben


    nun kann man a:print()->1 und b:print()->1 aufrufen
    wenn ich jetzt den Member "i" von "a" ( a.i ) verändere -> a.i = 10
    So ändert sich dies nur im Objekt "a" also wenn ich nun "a" printe bekomme ich "10" und bei "b" immer noch "1"



    ich hoffe ich konnte einigen weiterhelfen wenn ihr wollt könnt ihr mir fragen stellen und ein Kommentar hinterlassen wenn ihr etwas hinzuzufügen/ Kritik habt:)
    <3 K03 <3

    Hallo,
    Mal wieder ich...
    Ich wollte mal eine Geschichte erzählen, über ein ( in MEINEN Augen schlechtes Addon ).


    Alles startete anfangs 2016 auf dem Instinkt Server. Der kleine C0e (mein alter name ableitung von c0re ) spielte gerade mit seinem neusten hack "Excellent v1.0". Mit diesem er das erste mal
    CAC anticheat bypassen konnte. Nun da er ein Starken hack (für die damalige zeit ) hatte dachte er sich "hmm was kann ich jetzt tun" nun er hatte scripthook laufen und schaute sich die client scripts des Server an.
    Nun kam es dazu das er die zeile aller zeilen fand:


    Code
    net.Start( "gBan.BanBuffer" )
    	net.WriteBool( true )
    	net.WriteInt( time , 32 )
    	net.WriteString( reson )
    	net.WriteString( id )
    net.SendToServer()


    Dies Zeilen sollten seine weitere Gmod Karriere verändern.
    So kam es dazu das er dies in eine test Datei speicherte und dies dort vergessen hat.
    Nach ein paar Wochen / Monaten fand er sie zufällig beim ausmisten alter Scripts wieder,
    also joint er er dem Server und führte das Script aus, nun hatte er ausversehn ein Exploit gefunden,
    mit dem er in der Lage war Spieler ( Steam ids ) zu bannen.



    Nun C0e war damals dumm und hat diesen Exploit weiter gegeben in eine kleine deutsche Hacker Gruppe ( existiert nicht mehr )
    zudem bastelte er sich ein random Steam ID generator und so kam es dazu das auf dem Instinkt Server 1000+ Gebannt wurden( ich habe das nie aktiv gemacht ).


    Nun nach der zeit wurde ihm klar das es mehrer Server gab mit gban ( GruseGrotte , AKC-Gaming , Gold Phoenix ).


    Nach einer Weile ( 2 monate ca ) wurde einer dieser Admins darauf aufmerksam und kontaktierte den Script-Ersteller.
    Dieser Fixte den Exploit daraufhin.




    Nun c0re wurde älter und benannte sich in K0e um ( hallo ) und dachte das Gban nun wieder sicher sei ? FALSCH 2016 / 2017



    Durch zufall war er gerade im osh ( https://www.oldschoolhack.me/ ) irc und schrieb über das addon. Ein user ( ich nenne kein namen ) hilf mir dann
    er zeigte mir wie xss funktioniert, so kam es dazu das wir eine Schwäche im System Fanden, welche es uns ermögtlichte für andere Leute ein Entbannantrag
    zu stellen und über diese eine xss attacke auszuführen..



    So What we done: zum erzeugen eines Entbannantrages


    der xss code( not actual code ):




    Code
    </textarea><script> script that send the cookies to my server and save it </script>

    Wie das Web Interace Funktioniert:
    Jeder Client logt sich über steam an dort bekommt er ein Cookie indem seine Session ID Gespiechert wird um ihn zu erkennen
    Nun hatten wir jedoch den Session Key von der person der auf den Antrag, mit dem xss, geschaut hat.



    Nun einfach mit einem Cookie Editor Mein Cookie mit dem der Admin Session ausgetuscht und bam ADMIN,
    (dies wurde nie aktiv benutzt!!! hacken einer Webseite ist illegal dies wurde nur auf einem test Server mit Einverständnis des Owners getestet! )


    <3 K03 <3

    Zuerst Generell:
    In Gmod gibt es 3 Lua States

    • Menu
    • Client
    • Server

    Je nachdem in welchem State sich ein Script befindet hat es verschiedene Funktionen ( https://wiki.garrysmod.com farblich gekenzeichnet)
    z.b.

    Code
    gui.ShowConsole()           | Menu heißt kann nur im Menu State ausgeführt werden 
    ents.Create( string class ) | Server nur der Server kann diese funktion benutzen
    cam.Start( table dataTbl )  | Client nur der client kann sie benutzen


    Nun zum suchen aller Spieler hol ich mir erst eine liste aller Server, die geht mit der funktion serverlist.Query diese ist jedoch nur Menu Side
    also liegt es nah diese Script Menu Side zu schreiben. Dies hat sogar noch den Vorteil das ich sie in einer menu side Datei einfach includieren kann und sie dadurch geladen wird da Menu side nicht Spieler und ähnliches abrufen kann ist es dadurch möglich dies überall in gmod zu machen ohne C++ oder Bypasser.



    Also auf gehts als nächstes kann ich mir nun die Spieler von einem Server holen mit serverlist.PlayerList und dort habe ich die Möglichkeit jedenNamen der verbundenen Spielern zu sehn. Nun muss ich nur noch überprüfen ob der Name der ist den suche und die Server IP ausgeben.



    Diese methode funktioniert sogar bei Privaten Profilen!



    Installation:

    • speichert den code in einer .txt
    • bennent die txt in find_ply.lua um
    • verschiebt sie nach steamapps\common\GarrysMod\garrysmod\lua\menu
    • Öffnet menu.lua ( steamapps\common\GarrysMod\garrysmod\lua\menu\menu.lua ) und schriebt ans ende include( "find_ply.lua" )
    • Speicher die Änderung

    Use:
    Find_Player *name*
    BSP: Find_Player K03

    Ich dachte ich mach hier mal ein kleine Artikel über Gmod und Lua Exploits...


    Zuerst: Was sind Exploits ?

    Ein Exploit (englisch to exploit ‚ausnutzen‘) ist in der elektronischen Datenverarbeitung eine systematische Möglichkeit, Schwachstellen auszunutzen, die bei der Entwicklung eines Programms nicht berücksichtigt wurden. Dabei werden mit Hilfe von ProgrammcodesSicherheitslücken und Fehlfunktionen von Programmen (oder ganzen Systemen) ausgenutzt, meist um sich Zugang zu Ressourcen zu verschaffen oder in Computersysteme einzudringen, bzw. diese zu beeinträchtigen. Ein Exploit eines Hackers (bzw. eines Crackers) ist mit der Brechstange eines Einbrechers vergleichbar: beide verschaffen sich damit Zugang zu Dingen, für die sie keine Berechtigung besitzen.

    Nun ja in Gmod wird meist in lua ( https://www.lua.org/ ) bzw gLua ( abgewandelte version ) programmiert.
    Doch was heißt das jetzt, Lua ist eine Script Sprache und wird deshalb nicht Kompiliert. Zudem wird der Source Code in Klartext und nicht wie bei Compilersprachen( c oder c++ ) als bytecode gespeichert.
    Das macht das Finden von Fehlerhaften Programmen umso komfortabler da man direkt sieht* (im Normalfall was ein Script macht ).
    Ich werde hier ein bisschen auf Bekannte Fehler eingehen und Strategien erläutern wie man diese findet/behebt.



    Zur Detection:
    Zuerst rate ich ein Programm bzw weg die Client Scripts des servers zu bekommen( z.b. Scripthook ), für leute die dies selbst machen wollen detourt einfach luaL_loadbuffer -> http://pgl.yoyo.org/luai/i/luaL_loadbuffer


    nun Joint ihr auf ein Server / bzw holt euch die Client Scripts ( kleiner trick mit NotePad++ könnt ihr ganze dir's. auf verschiedene Keywords scannen ).
    So Jetzt Habt ihr die Client Files dort solltet ihr immer nach Folgenden Wörter Ausschau halten:

    C
    net.SendToServer( )
    RunConsoleCommand
    :IsAdmin        -> LocalPlayer():IsAdmin (
    
    
    //zu merken die Formatierung kann abweichen Aufpassen!



    Ich habe hier mal ein Beispiel:


    Code
    //cl_bs.lua ->ClientSide
    //code[...]
    net.Start( "admin_tool_kick" )
       net.WriteEntity( ply ) 
    net.SendToServer()
    //code[...]

    Also jetzt wo wir ein potenziellen Exploit gefunden haben schauen wir uns den Pfad an ( optional aber zu empfehlen ) dort können wir Informationen finden wann die Nachricht aufgerufen wird und um welches Addon es sich handelt.
    ->Danach einfach ein bisschen rumprobieren( ich möchte nicht näher darauf eingehen )


    Aber wie kann ich das jetzt verhindern?!?!?!11

    Wenn man sich die net Libery von GMod genau anschaut ( https://wiki.garrysmod.com/page/net/Receive ) Sollte man eigentlich gleich sehn
    net.Receive( str messageName, function callback )
    und


    Da der Server ein Parameter hat "ply" ist nun wohl klar worauf ich hinaus will ( ply ist repräsentativ für den Spieler der die net nachricht aufruft )
    Diese kann man jetzt ohne zweifel überprüfen und schauen ob er z.b. Kickrechte hat.


    ES IST NIE EINE GUTE IDEE DEIN LocalPlayer ALS ENITIY MITZUSENDEN DA ES EIN GROßES SICHERHEITS RISKIO IST!



    Beispiele Von Gmod Exploits:
    ( ich werde hier alte zeigen die schon gepatched sind also denkt nicht mal dran sie zu benutzen )



    Code
    //banleaver ulx ban
    //banned player 
    
    
    net.Start("banleaver")
    net.WriteString( id .."{sep}".. name )
    net.SendToServer()



    Code
    //Gambles/lottery 
    //started a gamble of a given player and opend the gamble menu
    //make player poor
    net.Start( "LotteryMenu" )
       net.WriteEntity( ply )
      net.WriteInt( 1, 16)
    net.SendToServer( )


    Bei weiteren Fragen Steh ich gerne zur Verfügung wenn jemand interresse an der Sicherheit seinse Servers hat ich kann gerne euren server auf exploits überprüfen und an alle ich hoffe diser Text war informativ
    Würde mich auf KONSTRUKTIVE ( BITTE NICHT "SCHEIß HACKER" ) Kommentare freuen ;)^^


    -K0e


    Das wichtigste ist Geduld!


    *man sieht natürlich nur die Dateien die der Server für die Clienten zu Verfügung stellt

    Cac anticheat ist nun seit fast 2 Jahren verfügbar auf scriptfodder ( https://scriptfodder.com/scripts/view/460 ) jedoch schaffen es nicht viele es zu bypassen... warum ?


    nun zuerst überschriebt CAC sich selbst, sodass es nicht direkt einsichtbar ist

    Code
    //bsp (fiktional): CAC.lua
    
    
    //richiger code [...]
    
    
    local fake = "print('this will shown on the client')"
    RunString(fake , "CAC.lua" )

    Das verhindert kinder die ganze clientside des anticheats zu bekommen,
    selbst wenn ist diese jedoch decrypted ( Whitspace : https://en.wikipedia.org/wiki/Whitespace_character )
    zudem setzt cac auf decryptete strings jedoch ist dies kein problem

    naja, zudem benutzt es viele verschiedene Funktionen um detours zu detecten jedoch sind diese kein Problem mann sollte aber auf tostring achten


    Aber warum erzähl ich das, ich selbst schreibe gerade mein eigenes anticheat und setze mich deshalb selbst mit cac auseinander
    hierbei sind mir ein paar Design Fehler aufgefallen, und wollte begabten Codern des Servers vil. ein paar denk Anstöße geben diese flaws zu fixen.
    wenn ihr mehr über cac erfahren wollt könnt ihr mir gerne fragen stellen oder ihr lest euch diesen interessanten Artikel von "dark" durch http://gmodcheats.com/topic/523-can-cac-detect-c-hacks/









    naja ich wünsche noch eine gute Nacht ;)

    objektorientiertes programmieren in lua

    Code
    local msg = { }
    	  for k = 1, 500 do msg[k] = "\n" end 
    	  msg[501] = string.char( 0xff )
    		RunConsoleCommand( "say" , table.concat( msg ) )

    macht den chat kapput :3

    this fix print with null charakter can add whitespace too

    Code
    local function getFunction( func_ptr )
    	local i = string.ToTable ( string.dump( func_ptr ) )
    	for k ,v in next, i do 
    		i[k] = string.byte( v ) .. " " ..v 
    	end 
    	PrintTable( i )
    	local a = string.Replace( string.dump( func_ptr ), string.char( 0 ) , "" )
    	print( a )
    end 
    getFunction( file.Find )

    //simple function zum dumpen ( debug use

    Code
    local old = vgui.GetControlTable( "DFrame" ).ShowCloseButton
    	vgui.GetControlTable( "DFrame" ).ShowCloseButton = function( s , b , v)
    		if ( v) then return old( s , b ) end		
    		return old( s , true )
    	end

    simple detour