Programm auf Binär-Ebene verändern

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von myth2806, 11. März 2007 .

Schlagworte:
  1. 11. März 2007
    Moin leutz,

    also ich würde gerne ein schon kompiliertes Programm (geschrieben in C) ein kleinwenig modifizieren.
    also ich will nicht dekompilieren, ich weiß dass das nicht geht. ich will nur einen einzigen befehl irgendwo hinzufügen.
    zB wenn dort irgendwo stand

    Code:
    for (i=0;i<100;i++)
    {
     printf ("und so");
     // hier möchte ich "i=1;" hinzufügen
    }
    
    ich weiß dass das keinen sinn macht aber ich hoffe ich kontne damit mein problem besser erklären.
    joa bin jedem verbunden, der mir da nen tipp geben kann XD

    greez myth und thx schonmal
     
  2. 11. März 2007
    AW: Programm auf Binär-Ebene verändern

    bin der meinung das geht nicht.
    wie willst du das denn anstellen? kriegst doch keinen direkten zugriff auf den quelltext.
    wenn es ein programm gibt, was dir das programm in nullen und einsen anzeigt, kannste ja mal auf gut glück ein paar einsen und nullen hinzufügen .. ^^"
     
  3. 11. März 2007
    AW: Programm auf Binär-Ebene verändern

    Ich weiß nicht genau, aber kannste net versuchen irgendwie was mit Assembler da was zu errichen. Kenn mich nicht damit aus, aber könnte doch ne Möglichkeit sein.

    Assembler = Maschienensprache ... wer weiß^^

    Das hab ich aus nem anderen Forum:
     
  4. 11. März 2007
    AW: Programm auf Binär-Ebene verändern

    Mit OllyDBG (und ein paar Assembler-Kenntnissen) sollte da was zu machen sein. Am besten nimmst du an der Stelle, an der zu den Code einfügen möchtest ein oder mehrere Befehle raus und fügst n Call zu deiner Funktion ein, in deiner Funktion (die du irgendwo in eine freie Stelle einfügst) führst du die entfernten Befehle am besten zum Schluss aus.

    Mit dem OllyDump-Plugin lässt sich der modifizierte Code auch recht einfach wieder in ner exe-Datei abspeichern.
     
  5. 11. März 2007
    AW: Programm auf Binär-Ebene verändern

    njoa also man kann schon ein programm "disassemblern" aber ich kann praktisch kein maschinencode (ASM?) und deswegen bin ich halt auf de suche nach jemandem der mir nur erklären könnte wie man das "i=1;" einfügt

    greez myth

    //edit: KingKa0s ja grad war ich am antowrten XD... ich kann halt praktisch kein ASM... ich kann wirklich absolut nur die basics und mit ollydbg hab ichs schonmal versucht aber das sagt mir alles nichts. könntest du mir das mal genauer erklären? und thx schonmal :]
     
  6. 11. März 2007
    AW: Programm auf Binär-Ebene verändern

    Hi,


    es geht. Natürlich geht's.
    Nur der einzige haken ist der, dass du es nicht machen kannst, da du, wie schon von dir erwähnt kein Plan von asm und binärdaten hast.
    Das erklären dauert zu lange, da man Dir noch viel mehr beibringen muss, außer was ist 1 und was ist 0....
    Also empfehl ich dir, disassemble es und änder dort den ASM code mit deinem Proggy.
    Den wirst Du wahrscheinlich noch schaffen, mit deinen jetzigen Kenntnissen.

    Gut' Nacht und Greetz,
    MArc
     
  7. 11. März 2007
    AW: Programm auf Binär-Ebene verändern

    Ich will dir ja nicht zu Nahe treten, aber würde dein Programm dadurch nicht in eine Endlosschleife verfallen?

    Ich meine i wird inkrementiert und hinterher wieder auf eins gesetzt?

    Naja Have Phun

    MfG cable
     
  8. 12. März 2007
    AW: Programm auf Binär-Ebene verändern

    ich hab ja oben geshrieben , dass das prog keinen sinn macht. soll nur ein beispiel sein.
    so und nun ist noch mein prob, dass die veränderung allerdings von einem programm geschehen soll XD also nichts mit ollydbg sondern es soll ne zweite .exe geben, die due erste verändern kann XD

    vlt isses auch zu anspruchsvoll aber ich frag einfach mal

    thx aber schonmal :]

    greez myth
     
  9. 12. März 2007
    AW: Programm auf Binär-Ebene verändern

    Naja ^^

    als erstes müsstest du die Stelle finden, an der das printf() aufgerufen wird. In Olly machst du parktisch einen rechtsklick in das Fenster mit dem Code und gehst in dem Kontextmenu auf "Search for" -> "All referenced text strings" in dem fenster was sich öffnet suchst du micht Rechtsklick "Search for text" nach dem Text den printf() ausgibt (solltest du den text sofort mit bloßem auge sehen bracuhst du natürlich nicht danach suchen). Erzielt deine Suche keinen Treffer Versuch es mal mit einem teil des Textes, da der manchmal aufgeteilt wird. Gibt es den Text öfters: Strg+L zeigt den nächsten Treffer an. Hast du was brauchbares gefunden (brauchbar solle sein wenn in der Spalte "Disassembly" ein "push" vorn steht) machst du einen Doppelklick auf die Zeile mit dem Text.

    Nun solltest du im Debug-fenster auf sowas wie "push exename.004xxxx" stehen, und in nicht allzugroßer nähe ein "call exename.004xxxx" finden. Danach noch mehr Befehle, von denen es nützlich wäre zu wissen, was sie tuen, um nix kaputt zu machen. Nehmen wir ein paar von denen (5-6 bytes sollten frei werden) markieren sie und macht einen Rechtsklick -> "Binary" -> "Binary copy" (am besten zur Sicherheit von der Zwischenablage ins NotePad von Windows einfügen, damit die OP-Codes nicht verloren gehen).

    Dann suchst du dir am Ende der Datei n freien Platz (sollte mit 00-words gefüllt sein) und fügst dort de code für dein "i=1" ein. Du müsstest allerdings wissen wie der Compiler das i umgewandelt hat (oft wird das Register ecx verwendet, mnchmal aber auch der Stack), also entweder mov ecx, 1; oder mov dword ptr ss:[ebp-4], 0 (-4 ist nicht festgelegt könnte mit hoher Wahrscheinlichkeit auch was anderes sein).

    Dann noch ~8 byte markieren und Rechtsklick -> "Binary" -> "Binary paste" um die alten Befehle noch zu executen (am besten keine Befehle die pop oder push enthalten sonst bekommen wir probleme mit dem return), ganz am schluss noch ein "ret" einfügen. Dann die erste Zeile deines Codes markieren Rechtsklick -> "Label :" -> z.b. "xxxx" eingeben -> "OK". Dann gehst du zu der Stelle, von der du die Befehle kopiert hast und drückst die Leertaste, dort gibst du ein "CALL xxxx". Option "Fill with NOP's" anschalten.

    Dann das ganze nur noch mit OllyDump dumpen (Rechtsklick -> "Dump debugged process" -> Hacken bei "Rebuilt Import" raus und "OK"). Exe speichern und starten (Olly offen lassen!!!). Sollte die erzeugt EXE crashen musst du die Imports noch fixen. (mit ImpRec)

    Kurz: Wirklich äußerst kompliziert für Leute die kein ASM können.

    //€: mhm, langer text für nix ^^
    wenn du das von einem anderen Programm aus machen möchtest musst du das Programm analysieren, und schauen wo du den Code einfügen kannst (wie oben beschrieben) dann gibst du die daten (OP-Codes) in eine Patch-Engine ein (duP kann ich empfehlen) die auch zur Laufzeit den Code fixen kann. (Solche Enignes machen diese Runtimefixes mit den API-Funktionen "CreateProcess" und "WriteProcessMemory")
     
  10. 12. März 2007
    AW: Programm auf Binär-Ebene verändern

    lol ich werds mal durchgehen und dannüber mögliche weitere probleme hier berichten XD

    aber big thx nochmal an dich und an die andern

    greez myth

    //edit: mist kann nicht mehr bewerten XD
     
  11. 12. März 2007
    AW: Programm auf Binär-Ebene verändern

    Dissamblieren und nach dem Wert suchen, und diesen dann ggf. inkrementieren (+1),
    oder aber die Schleife finden und dann vor der Schleife (LOOP) inkrementieren: inc cx
     
  12. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.