Länge einer Compilierten Funktion ermitteln



  • MarcelL schrieb:

    Fehlt somit noch das Ende welches unbekannt ist. Da ich die Funktion selber kenne und diese keinen Rückgabeparameter hat, wird diese folglich am Ende mit einem Assembler 'RET' (Return, Maschinencode 0xC3) ausgeführt.

    Und wie kannst du dir sicher sein, das 0xc3 nicht noch in irgendeiner anderen Befehlssequenz vorkommt?

    Und auch der Vorschlag von yogle ist zweifelhaft, da es keine Garantie gibt, dass die Funktionen in der entsprechenden Reihenfolge im Code abgelegt werden.
    Imo ist sowas nur auf Assemblerebene zuverlässig machbar.



  • Sobald ein Sprungbefehl in der Funktion drin ist (z.B. durch "if" verursacht), kann der Compiler die beiden Code-Fragmente an vollkommen unterschiedlichen Stellen (nicht mal aufeinanderfolgend) anbringen! Ganz zu schweigen was der Compiler macht, wenn man die Optimierungen aktiviert.



  • musst dir halt einen kleinen disassembler schreiben oder eine fertige disassembler lib nehmen.
    moeglich is das damit durchaus blos einfach nach dem opcode suchen 0xC3 kann nicht zuverlaessig funktionieren da, wie schon gesagt wurde, der wert 0xc3 auch als parameter zu einem opcode vorkommen kann.
    In der theorie muss zwar eine funktion nicht mit einem 'ret' beendet werden is aber sicher zu 99% der fall



  • achja um einen disassembler wirst du wahrscheinlich auch mit der methode yogle nicht herumkommen da wenn du eine funktion wo anders hinkopierst relative adressen (zb von 'call's) nicht mehr stimmen! Die muesstest du finden und anpassen wenn die funktion lauffaehig bleiben soll...



  • groovemaster schrieb:

    MarcelL schrieb:

    Fehlt somit noch das Ende welches unbekannt ist. Da ich die Funktion selber kenne und diese keinen Rückgabeparameter hat, wird diese folglich am Ende mit einem Assembler 'RET' (Return, Maschinencode 0xC3) ausgeführt.

    Und wie kannst du dir sicher sein, das 0xc3 nicht noch in irgendeiner anderen Befehlssequenz vorkommt?

    Weil diese "spezielle" Funktion minimal gehalten ist und maximal 70 Byte Lang ist.

    Weil ich den compilierten Code in Assembler angeschaut habe und keine weiteren 0xC3`s vorkommen.

    Weil es soeben funktioniert hat.

    Das es keine 100% kompatible Lösung gibt ist mir klar. Ich muss halt jetzt bei jedem compilieren schauen wie der passende Assembler Code ausschaut.


  • Mod

    MarcelL schrieb:

    [quote="groovemasterWeil diese "spezielle" Funktion minimal gehalten ist und maximal 70 Byte Lang ist.

    Und wer garantiert Dir, dass eine unterschiedliche Ladeposition (Relokation) nicht zu einer Änderung in Deinem Code führt?



  • Naja, das sagte ich doch. Ich kenne den Assembler Code der hinter dieser "minimal" Funktion steckt.



  • MarcelL schrieb:

    Naja, das sagte ich doch. Ich kenne den Assembler Code der hinter dieser "minimal" Funktion steckt.

    Wenn Du denn Assembler-Code eh kennst, dann brauchst Du hier noch so unnötige und unzuverlässige Methoden anwenden. Dann mach sowas wie:

    unsigned char myFunction[] = {0x03, 0x22, 0x54, 0x02, 0xc3 };
    


  • MarcelL schrieb:

    Weil diese "spezielle" Funktion minimal gehalten ist und maximal 70 Byte Lang ist.

    Dann schreib sie doch komplett mit Inline Assembler, dann bekommst du auch problemlos die Länge raus.



  • Wozu willst du das überhaupt?



  • hustbaer schrieb:

    Wozu willst du das überhaupt?

    brauche das für für eine DLL Injektion ohne dabei über die Windows Hook Funktionen zu gehen.

    Ich öffne einen Prozess, allokiere mir ein wenig virtuellen Speicher. Injiziere dann meine Dll, eine Struktur mit eine paar Funktionspointer und die "Funktion" über die wir reden um einen Thread in der Dll zu starten :-).



  • das hört sich illegal an



  • MarcelL schrieb:

    brauche das für für eine DLL Injektion ohne dabei über die Windows Hook Funktionen zu gehen.

    Ich öffne einen Prozess, allokiere mir ein wenig virtuellen Speicher. Injiziere dann meine Dll, eine Struktur mit eine paar Funktionspointer und die "Funktion" über die wir reden um einen Thread in der Dll zu starten :-).

    Mit welchen Ziel ?



  • Ein Kollege von mir meinte, dass es unmöglich wäre bei einem Computerspiel welches von Punkbuster geschützt wird einen Trainer zu benutzen.

    Einer der einfachsten Methoden solche Programme zu überlisten ist nunmal die Dll Injektion :-).



  • Hmm dieses PunkBuster hört sich interessant an. Die Erfolgsgeschichte des Programms ist ja atemberaubent, heutzutage bauen ja wahnsinnig viele dieses Ding in ihr Spiel ein!

    PunkBuster scannt anscheinend aber auch den Speicher ab. Mit nur den Code reinzuladen und auszuführen wird es wohl nicht getan sein. Was willst du denn am Spiel/Code verändern?



  • yogle schrieb:

    Hmm dieses PunkBuster hört sich interessant an. Die Erfolgsgeschichte des Programms ist ja atemberaubent, heutzutage bauen ja wahnsinnig viele dieses Ding in ihr Spiel ein!

    Naja das hat ja auch einen Grund... *Kopfschüttel*

    PS: Hier mal die Funktionsweise:

    PunkBuster funktioniert nach dem Client-Server-Prinzip. Der PunkBuster-Client läuft auf dem Computer des Spielers und überwacht, ähnlich einem Virenscanner, den PC und scannt dabei den Arbeitsspeicher und einige Spieledateien auf der Festplatte nach Cheats. Der Server fragt in regelmäßigen Abständen bei den verbundenen Clients nach, ob der Spielerechner noch cheatfrei ist. Der Spieler wird aus dem Spiel ausgeschlossen, sobald ein bekannter Cheat gefunden wird.

    Da der Spieler gewöhnlich vollen Zugriff auf seinen Computer hat, kann dieser mit ausreichend Erfahrung die Funktionsweise eines Programms manipulieren, also auch den Anti-Cheat-Client wirkungslos machen. Even Balance versucht dies zu verhindern, indem es PunkBuster zum Beispiel Prüfsummen abgleichen lässt, um die Echtheit des Programms zu verifizieren. Zudem müssen Spiele, und somit auch Punkbuster, unter dem Betriebssystem Windows mit Administratorrechten gestartet werden.

    PunkBuster ist mit einem Updatesystem ausgestattet, das Server und Client automatisch auf den neuesten Stand bringt. Durch ständiges Aktualisieren der Software können so schnell neue Cheats gesperrt werden, sofern sie dem Entwickler bekannt sind. Ein weiteres Feature ist zudem die Möglichkeit für den Serverbetreiber, Bildschirmfotos von allen zum Server verbundenen Spielern zu machen, um nachzprüfen, ob ein Spieler die Darstellung manipuliert hat.

    Quelle ➡ http://de.wikipedia.org/wiki/PunkBuster



  • Naja, CreateRemoteThread wäre wohl am einfachsten, was? :^)
    Andrerseits wird der PunkBuster das wenn er schlau ist mitbekommen...
    Wenn er auch nur ein bisschen schlauer ist bekommt er das CreateThread aber auch so mit. Aber probieren schadet nicht, vielleicht haben die ne allgemeine "thread überwachung" nicht hinbekommen so dass sie sich mit genügend normalen Tools, Libraries und Programmierpraktiken verträgt.

    Vielleicht könntest du versuchen eine Windows Funktion ala GetMessage zu "hooken" (patchen), indem du die ersten paar Bytes mit einem jmp auf einen Stub überschreibst. Brauchste allerdings einen dynamischen Disassembler dazu, oder viel Vertrauen dass sich die Implementierung der entsprechenden Funktion nicht so schnell ändert. Und ist auch nicht ganz einfach...
    Siehe hier: http://www.internals.com/articles/apispy/apispy.htm
    (Der Absatz "Patch the API")

    BTW: in dem Fall wäre es (wenn du bei deinem Ansatz bleiben willst) denke ich wirklich einfacher die Funktion in inline-asm zu schreiben, dann kannst du die auch schön position-independant schreiben und musst nicht erst Adressen patchen.

    Noch eine andere Möglichkeit wäre vielleicht nen Filtertreiber über irgendein Gerät drüberzustülpen welches das Spiel garantiert verwendet - dann bist du gleich mit Kernelmode-Rechten im Prozess deines Interesses unterwegs. Auch nicht übel.


Anmelden zum Antworten