Detours 1/2

  • 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 )