Maschinenbefehltabelle unter Windows XP 32 Bit
-
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.