PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : WinXP - 1 Byte einer Binärdatei elegant ändern?


hadez16
2008-01-14, 09:39:27
Hallo

ich suche eine Möglichkeit ein bestimmtes Byte einer Binärdatei (es handelt sich um eine Lotus Notes Datenbank) möglichst elegant ändern zu können.

In C++ bin ich nicht bewandert genug was den Umgang mit Dateien angeht um das in absehbarer Zeit realisieren zu können.

Den Befehl debug.exe hab ich mir auch schon angesehen aber er meldet beim Öffnen der Datei "zuwenig Arbeitsspeicher", warum auch immer.

Natürlich kann ich das Byte mit einem Hexeditor abändern aber es sollte möglichst automatisiert geschehen.

Nun meine Frage, gibt es für sowas so etwas wie einen Kommandozeilen-fähigen Hexeditor, dem ich per Batchroutine beibringen kann was er machen soll?

Oder ähnliche Programme die dafür ausgelegt sind solche Dinge zu bewerkstelligen?

Bin für jede Hilfe dankbar

Grüße

dariegel
2008-01-14, 09:44:28
Schau doch mal auf Programmer's Tools (http://www.protools.cjb.net/), dort gibt es Patchengines, die auf Basis einer Hexadresse und die an dieser Stelle zu ändernden Bytes einen Patch generieren. Die entstehende EXE-Datei ist dann unabhängig ausführbar.

Gast
2008-01-14, 10:22:42
fopen, fseek, fwrite

hadez16
2008-01-14, 12:04:28
fopen, fseek, fwrite

ja, wenn du mir jetzt noch ein kleines beispiel nennst wie ich in einer binärdatei ein byte gezielt suche o.ä. und es ersetze?

Haarmann
2008-01-14, 13:38:59
Mit nem klassischen Hex Editor?

Aber ob ich das bei ner Notes DB nutzen würde... eher nicht.

PHuV
2008-01-14, 14:31:02
ja, wenn du mir jetzt noch ein kleines beispiel nennst wie ich in einer binärdatei ein byte gezielt suche o.ä. und es ersetze?

Schneller Hack (in C):


#include <stdio.h>
#include <stdlib.h>

/* Aufruf mit
* prg Datei Suchbyte Neues_Byte
*/
int main(int argc, char *argv[])
{
char *buf;
FILE *datei;
long datlen=0;
long i=0;

if ((datei = fopen(argv[1], "r+")) == NULL)
{
printf("Konnte Datei %s nicht finden bzw. öffnen!\n", argv[1]);
return EXIT_FAILURE;
}

fseek(datei, 0L, SEEK_END);
datlen = ftell(datei);

rewind(datei);

buf = malloc(sizeof(char) * datlen + 1);
fread(buf, datlen-1, 1, datei);

for (i=0;i<datlen;i++)
{
if (argv[2][0] == buf[i])
{
buf[i] = argv[3][0];
}
}
rewind(datei);
fwrite(buf, 1, datlen, datei);

free(buf);
fclose(datei);
}



Wenn Du Hexwerte angeben willst, mußt Du die Übergaben entsprechend ändern. Weiteres Problem, das Programm erstetzt alle Bytes entsprechenden Wertes. Willst Du nur eines mitgeben, müßtest Du die exakte Position mitgeben und per fseek hinspringen. Wenn es eine absolute Position wäre, wäre es natürlich vorteilhaft, bei relativen Positionen bräuchtest Du jedoch eine absolut sichere vorhergehende Kennung, damit Du sicher das Byte identifizieren kannst.

Fragen, warum änderst Du nicht mit sed, tr oder sonstwas (vorausgesetzt, Du arbeitest unter Unix oder hast MKS/Cygwin installiert)?