Maschinenbefehltabelle unter Windows XP 32 Bit



  • Ich versuche mich derzeit ein bisschen im Disassemblieren von Anwendungen, wofür ich einen Hex-Editor (zum Verändern der Anwendungen) und IDA (zum Anzeigen der Anweisungen) unter Windows XP 32 Bit. Das mache ich deshalb, weil ich mit dem Hex-Editor sehr schlecht lesen und mit IDA sehr schlecht schreiben kann und ich eher über moderates Wissen der Assemblerprogrammierung verfüge - ist nichts illigales, nur eine einfache Stringer-/übersetzung. Die Strings sind übrigens nullterminiert, wie in C.

    Einfache Textersetzungen mit einem von mir geschriebenen Programm funktionieren bereits, ohne dass das Programm abstürzt oder zu viel oder zu wenig Zeichen ausgegeben werden, was daran liegt, dass mein Programm genau weiß, welchem String an dem jeweiligen Offset der jeweilige Speicher zur Verfügung steht, sodass die String notfalls gekürzt in die Anwendung geschrieben werden. Jedoch habe ich das Problem, dass die Anwendung von sich aus und auch mit originalen Strings in bestimmten Fenstern den Text immer doppelt anzeigt, und dass das Fenster nicht groß genug dafür ist. So in etwa kann man sich das ganze vorstellen:

    +--------------------------------+
    |Das ist ein String!      Das ist|
    +--------------------------------+
    

    Ein Fehler, den ich eigentlich behoben haben möchte und was auch kein Problem darstellen sollte. Ich weiß genau, wo die Ausgabe erfolgt (indem ich die Adresse des Strings habe suchen lassen, was mir ein Stück Code zusammen mit anderen Strings, die über das gleiche Fenster ausgegeben werden, gezeigt hat) und das Programm verwendet die C-Win-API, daher kenne ich alle Funktionen, die mir IDA so liefert. Mit dem Hex-Editor könnte ich nun die entsprechenden Befehle editieren - wenn ich denn welches kennen würde, denn der einzige Maschinenbefehl, den ich auswendig kann, ist 0x90 - nop. Natürlich verstehe ich auch call, push, pop, add, sub usw., aber schreiben kann ich sie nicht.

    Im Internet unter google und auch sonst finde ich nichts, was einer Befehl-Codetabelle, die mir helfen würde, entspricht. Daher frage ich hier nach, ob jemand eine solche Tabelle kennt.



  • google: AMD / Intel developer manuals
    Ansonsten benutz OllyDbg – mit dem kann man den Code direkt bearbeitend, ausführen und speichern.



  • Versteh ich nicht, du machst mit Ida rum und Hexeditor und willst nicht wissen wollen/können, was für ein Maschinenbefehl an Stelle x steht?



  • gc schrieb:

    Versteh ich nicht, du machst mit Ida rum und Hexeditor und willst nicht wissen wollen/können, was für ein Maschinenbefehl an Stelle x steht?

    Offensichtlich hast du es nicht verstanden. Ich weiß, was sie bedeuten, aber ich weiß nicht, welche Maschinenbefehle ich verwenden kann, um den Fehler zu beheben. Deshalb ...



  • Ich hab das jetzt so verstanden (@ Glühbirne) :

    z.b. dein Programm sieht so aus:

    main()
    {
    string var = "abc";
    if ( var != "abc" )
    {
    cout<<"error";
    }

    cout<< var;
    }

    Du willst z.b. das folgendes abgefragt wird if (var=="abc")

    Du willst das bei var nicht abc sondern sondern z.b. hallo

    Jetzt willst du die änderungen in der exe vornehmen.
    Die änderungen willst du mit einem Hex Editor machen. ( opcodes ändern )

    Die Lösung ( falls ich das Problem überhaupt erkannt habe^^ )
    Lad dir mal ImmunityDebugger oder OllyDebugger runter damit geht es ganz einfach.

    Lad dir hier mal die ersten 2 oder 3 Tutorials runter:

    http://tuts4you.com/download.php?list.17

    Danach sollte es kein Problem mehr für dich sein. ( Ist aber alles auf englisch )

    Ansonsten gibt es hier eins auf deutsch [Ist aber nicht so umfangreich]:
    (Guck im Bereich Reverse Engineering)
    www.bass.phpnet.us



  • Mein Programmablauf ist folgender:

    1.Der Anwender wird abgefragt, welche Sprache er haben will. Je nachdem wird dann eine andere Stringtable-Datei eingelesen und verwendet.
    2. Die Datei wird (mit der Win-API) geöffnet und in einen Buffer geschrieben.
    3. Die Strings in der Tabelle werden auf das entsprechende Maß gekürtzt (hierfür nutze ich Konstanten für jeden String) und dann in den Buffer geschrieben. Es gibt immer ein Nullterminierungszeichen am Ende, wenn der String vorher länger war, wird der anschließende Bereich mit 0 überschrieben. Es wird nicht überprüft, ob der String bereits drin steht, es wird einfach geschrieben.
    4. Die Datei wird gesichert.

    Eigentlich ein ganz einfaches Programm. Aber hier geht es mir nicht um das Programm, ich habe es nur erwähnt, um zu beschreiben, wie ich auf den Fehler gestoßen bin. Ich teste das editierte Programm natürlich ausgiebig (der Konstanten wegen - die Strings selbst können nicht falsch sein, aber eventuell die Art, wie sie gekürtzt werden), und dabei ist mir die doppelte Ausgabe aufgefallen.

    o_O schrieb:

    Die änderungen willst du mit einem Hex Editor machen. ( opcodes ändern )

    Nein, dafür habe ich ja meine Anwendung. Sie erlaubt mir, die Arbeit des Ersetzens der Strings für ein paar tausend Durchläufe ganz schnell zu erledigen. Nur ist mir dabei aufgefallen, dass die neuen Strings (und später auch teilweise die alten, unveränderten) doppelt angezeigt werden. Das hat nichts mit meinem Programm zu tun.

    Mein Problem ist nun, dass ich den Fehler beheben will. Ich kenne die Speicheradresse des Befehls, dadurch habe ich auch das Offset, welches ich verändern muss, um das doppelte Anzeigen zu verhindern (Offset im Speicher und Offset in der Anwendungsdatei sind ja verschieden). Aber ich kenne nicht die entsprechenden Assemblerbefehle, um die Funktion, die sich um das Anzeigen kümmert, zu ändern ... Platz für eine neue Funktion hätte ich aber genug, sodass ich einfach ein paar Sachen ändern kann, ohne dass die Länge der Datei sich dahingehend verändert, dass Sachen plötzlich an der falschen Stelle stehen.

    Ein bisschen Assembler kann ich, aber meine Fähigkeiten sind marginal. Ich weiß, was/wofür die Register sind, ich weiß um die Call-Conventions, ich weiß, wie ich Funktionen aufrufe und Sachen auf den Stack lege und auch von demselbigen lösche. Aber sonst ...



  • und wie soll man dir da jetzt helfen? Hellsehen kann hier keiner.
    BTW: Kennst du OllyDbg?



  • Welche Funktion kümmert sich den um das Anzeigen ?
    [Meine Kristallkugel ist leider kaputt. QQ]

    Poste dochmal etwas Code ...

    Wird die Funktion vielleicht 2 mal aufgerufen obwohl es nur 1 mal sein sollte?



  • loopback schrieb:

    und wie soll man dir da jetzt helfen? Hellsehen kann hier keiner.

    Sagt mal, wollt ihr mich verarschen? Ich meine doch, dass ich zwei mal gesagt habe, dass ich nicht weiß, wie ich das Problem lösen kann und dass ich mich deshalb ein bisschen in die Opcodes einlesen wollte. Nur leider finde ich keine vernünftige Tabelle dafür.

    loopback schrieb:

    BTW: Kennst du OllyDbg?

    Nein. Kurz und bündig, warum sollte ich das Tool benutzen?

    O_o schrieb:

    Welche Funktion kümmert sich den um das Anzeigen ?
    [Meine Kristallkugel ist leider kaputt. QQ]

    Poste dochmal etwas Code ...

    Geht nicht. Ich darf den Maschinencode verändern, aber keine Teile davon posten. Zudem ist das ganze so bescheuert verschachtelt, dass ich garantiert Teile davon vergesse, sollte ich den Code posten. Ich muss es selbst machen.

    O_o schrieb:

    Wird die Funktion vielleicht 2 mal aufgerufen obwohl es nur 1 mal sein sollte?

    Nein, darauf achte ich. Ich vermute eher (kann ich allerdings nicht genau sagen), dass die Schleife zum Einlesen des Strings 'ne Macke hat, denn es erscheinen ja keine 2 Fenster. Das ganze scheint wie eine besondere MessageBox ausgeführt zu werden, da die Offsets der Strings auf den Stack gelegt und von dort auch wieder genommen werden (es IST im Grunde eine MessageBox ohne Button und Überschrift, ein temporäres Benachitigungsfeld sozusagen) Es liegt wohl ein Verarbeitungsfehler vor.

    Theoretisch ist es möglich, noch massig Assemblerbefehle dort zu sichern. Der Entwickler hat mehr auf Schnelligkeit als auf Kompaktheit gesetzt, also gibt es jede Menge freie Felder mit Platz für Funktionen. Problem ist nur, dass ich nicht weiß, wie man den Fehler behebt ...



  • Wenn du so viel Ahnung von Assembler hast, warum gehst du denn so weit nach unten? Hast du den Original-Quelltext nicht mehr zur Verfügung, um das Problem auf einer höheren Ebene analysieren zu können?



  • CStoll schrieb:

    Wenn du so viel Ahnung von Assembler hast, warum gehst du denn so weit nach unten? Hast du den Original-Quelltext nicht mehr zur Verfügung, um das Problem auf einer höheren Ebene analysieren zu können?

    Ist ein Fremdprogramm. Ich darf es verändern, aber ich darf keine Teile an die Öffentlichkeit geben. Und der Spasti, der es programmiert hat, meldet sich nicht, also muss ich mich wieder mal darum kümmern. Zugegeben, ich weiß nicht einmal, ob der englisch spricht, klingt eher so, also hätte das jemand für ihn übersetzt.



  • Glühbirne schrieb:

    klingt eher so, also hätte das jemand für ihn übersetzt

    Damit meine ich Google-Translator.



  • du hättest dir ja mal die Mühe machen können, und meinen letzten Betrag durch lesen können - Daraus wird ersichtlich, wie man sich die Dokumentation, und somit auch ‚Opcode-Tabellen‘, der Hersteller 'beschaffen' kann.
    OllyDbg ist im Übrigen (oh wie überraschende) ein Debugger, der es unter Anderem erlaubt eine EXE zu modifizieren. Damit erspart man sich das unnötige gefrickel mit den opcodes.



  • masm schrieb:

    du hättest dir ja mal die Mühe machen können, und meinen letzten Betrag durch lesen können - Daraus wird ersichtlich, wie man sich die Dokumentation, und somit auch ‚Opcode-Tabellen‘, der Hersteller 'beschaffen' kann.
    OllyDbg ist im Übrigen (oh wie überraschende) ein Debugger, der es unter Anderem erlaubt eine EXE zu modifizieren. Damit erspart man sich das unnötige gefrickel mit den opcodes.

    Na gut, ich probiere es aus. Und melde mich, falls es funktioniert.


Anmelden zum Antworten