Falls der String eine Ressource ist, kann man es mit einem Ressourceneditor probieren: z.B Reshack und hoffen.
Falls nicht, wird es kompliziert (Gründe siehe oben - fügt man einfach Zusatzbytes ein, verschiebt sich im Programm alles und die anderen Adressen stimmen nicht mehr): eine Methode wäre es, mit einem PE-Editor wie LordPE eine neue Section dazuzufügen, in dieser den String hinzuschreiben und die Verweise in der Exe darauf umzubiegen. Das würde z.B so aussehn: in LordPE die Sections anzeigen lassen, dann per Rechtsklickmenü "Load section from disk" eine kleinere Textdatei oder ähnliches (was groß genug ist, um die Strings aufzunehmen) als Section hinzuzufügen - dann braucht man nicht im PE-Editor die Section per Hand zu vergrößern.
In diese Section trägt man die gewünschten Strings ein, wobei wie erwähnt am Ende jedes Strings noch ein 00 Byte stehen muss.Dabei sollte man sich die vom PE Editor eingetragene VirtualAdress /VOffset/Virtual Offset (Name variiert je nach Editor) merken. Nun kann man das Programm in OllyDbg laden. Im Dumpfenster (unten) sollte man zu den eingetragegen Strings gehen, um die genaue Adresse zu erfahren: STRG+G und als Adresse die vorher gemerkte VirtualAdress aus dem PE-Editor + 40 0000 eintragen (die Rechnung erfolgt natürlich hexadezimal

). Nun wird im Dumpfenster die "eingefügte" Section angezeigt und man kann sich in aller Ruhe die virtuellen Adressen der Strings notieren. Als nächstes lässt man sich alle Strings über Rechtsklickmenü ->"Search for"->"all referenced string" anzeigen. Aus der Liste sucht man sich alle Vorkommen des zu ersetzenden Strings aus (Suche per Rechtsklickmenü->Search for text) an diese Stellen geht man im Debugger hin und korrigiert die Adresse des Strings.
Über "Rechtsklick"->"Copy to executable" kann man sein Werk abspeichern.
Aber da es bestimmt noch nicht kompliziert genug war

, ist noch folgendes zu beachten:
die Strings können nicht nur direkt adressiert werden - das Programm kann auch je nach Umsetzung des Compilers den String über eine Grundadresse+distanz zum String referenzieren, wobei es dann zur Laufzeit berechnet wird:
bsp:
Code:
mov edi,40 0000
Zugriff auf den String
mov eax, 20
push [edi+eax]
sowas wird OllyDbg nicht als Refernz auflisten und man muss sich dann relativ gut mit dem Debugger auskennen, um alle Referenzen zu finden. Das aber nur, damit man sich nach dem Ersetzen nicht wundert, warum trotzdem der alte String angezeigt wird.
Dann gibt es bei Delphi noch die "schöne" Eigenschaft, dass die Strings im eigenen Format abgelegt werden. D.h man hat einen String
"abc". Vor dem String muss ein DWORD als Längenangabe stehen, zusätzlich zu der Nullterminierung. Also
nochmal vor diesem Abschnitt ist noch irgendeine interne Delphistruktur, auf die Delphi unbedingt Schreibzugriff haben muss, um Programmabstürze zu vermeiden.
Das muss man beachten, wenn man die neue Section hinzufügt (diese muss Read/Write Zugriff besitzen) und Strings einträgt (vor dem String genug Platz lassen - wieviel, kann ich nicht aus dem Kopf sagen, bei bestehendem Interesse aber nachschauen).