Code aus dem Speicher ausführen



  • Ist es möglich, Code aus einer Datei (.exe/.dll oder so) in den Speicher zu laden und ihn dann da auszuführen? So à la:

    char data[12345];
    ... //lade den Code da rein
    foo(data);
    


  • Ich glaube eigentlich nicht das es Maschienen gibt die den Code nicht aus dem Speicher heraus ausfuehren, also wenn du ein Programm startest sollte der da automatisch, je nach groesse, ganz oder Teilweise, reingeladen werden.



  • Das ist mir schon klar, ich dachte eigentlich an einen Ablauf wie:

    • A lädt B
    • A murkst ein bisschen am Code von B herum
    • A führt den modifizierten Code von B in einem neuen Prozess/Thread aus


  • Unter Windows kannst du dir ne DLL (und AFAIK auch ne Exe) als Modul laden und dann wenn du die Parameter, Rückgabe etc. kennst Funktionen daraus ausführen. LoadLibrary und GetProcAddress aus der WinAPI können dir da weiter helfen. Für weitere Infos solltest du dich in das WinAPI-Forum verschieben lassen 😉 .



  • schau dir mal an, wie buffer overflows ausschauen. (google) is bisschen kompliziert, musst bisschen asm können, dann kannste sowas in dein programm eingauen



  • Original erstellt von Entyl_Sa:
    Ich glaube eigentlich nicht das es Maschienen gibt die den Code nicht aus dem Speicher heraus ausfuehren

    Klar der Code eines Programms wird fast immer in den Speicher geladen. Das nutzen Cheats/Exploits/Würmer etc aus.

    So gibt es z.B. OpenGL Hacks (um z.B. die Wände transparent machen), die nachdem das Spiel die opengl32.dll geladen hat, mittels WriteProcessMemory(...) den Code manipulieren.



  • Original erstellt von Korbinian:
    schau dir mal an, wie buffer overflows ausschauen. (google) is bisschen kompliziert, musst bisschen asm können, dann kannste sowas in dein programm eingauen

    Das Problem ist ja nicht in erster Linie, den Code zu verändern, sondern ihn auszuführen. Anfangen drin rumzuschreiben kann ich dann, wenn ich so weit bin, dass ich den Code laden und ausführen kann. Ich hab mir mal LoadLibrary() angeguckt, das sieht schon gut aus, aber in der MSDN DBase steht, LoadLibrary() würde die DllMain() der Bibliothek ausführen. Erstens ist das ja das, was ich eigentlich nicht will, ich will ja erst laden, dann was anderes machen und *dann* erst ausführen. Und zweitens scheint es so, als würde das gar nicht stimmen, ich hab es mal probiert und die DllMain() wurde gar nicht ausgeführt.



  • Original erstellt von UncleSniper:
    [QBDas Problem ist ja nicht in erster Linie, den Code zu verändern, sondern ihn auszuführen.QB]

    genau das kannst du bei buffer-overflows machen 🙂 den code verändern is dann wohl kein problem (einfach den code in nen string reinschreiben (als asm anweisungen in HEX code)



  • Original erstellt von Korbinian:
    genau das kannst du bei buffer-overflows machen 🙂 den code verändern is dann wohl kein problem (einfach den code in nen string reinschreiben (als asm anweisungen in HEX code)

    Du meinst ich soll so was machen wie

    char foo[1];
    memcpy(foo, "\x90\x90\x90\x90\x90codecodecodecode", 21);
    

    (Oder so ähnlich - ich hab mich mit Buffer Overflows noch nicht so beschäftigt...)

    Wenn ja, dann muss ich jetzt fragen: Ist das die feine Englische? Ich habe da so meine Zweifel... Auserdem denke ich, dass sich da das OS einschalten könnte...

    Edit:
    Ich bin jetzt so weit, dass ich per LoadLibrary() eine DLL lade, aber wie könnte ich auf den Code jetzt zugreifen, um ihn zu verändern?

    [ Dieser Beitrag wurde am 16.05.2003 um 16:30 Uhr von UncleSniper editiert. ]



  • Das feine englisch hört schon da auf, wo du an dem fremden Code rumfuschst.



  • Gibt es da irgendeinen besonderen Zweck den du verfolgst? Vielleicht könnten wir dir dann besser helfen ...



  • Original erstellt von Luckie:
    Das feine englisch hört schon da auf, wo du an dem fremden Code rumfuschst.

    Wer sagt denn, dass es "fremder" Code ist? Es könnte ja auch mein eigener sein...

    Original erstellt von malfunction:
    Gibt es da irgendeinen besonderen Zweck den du verfolgst? Vielleicht könnten wir dir dann besser helfen ...

    Nein, eigentlich nicht. Es hätte mich nur mal interessiert...


Anmelden zum Antworten