Ich Codierung Lite-Programm in grundlegenden c, die hinzufügen (oder Sub-) Offset für jedes Byte in Binärdatei im Argument übergeben. Diese Arbeit für alle andere ELF, aber wenn ich versuche zu laufen:
$ ./a.out a.out 1
(add 0x01 zu jedem Byte),
fopen()
Absturz mit der Fehlermeldung „Textdatei besetzt“.
Ich habe mit lsof
überprüft, ist aber nicht auf dem Dateisystem geöffnet.
Ich dachte, dass, wenn eine ausführbare Datei ausgeführt wird, ein Abbild der Datei in RAM geladen wird und auf die Datei zugegriffen werden kann.
Wenn jemand was darüber wissen, nehme ich es! Vielen Dank, dass Sie sich die Zeit genommen haben, mich zu lesen! HierÖffnen Sie eine running Binärdatei
ist der Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void usage (char *pgr_name); // print usage and exit
void fatal(char *s); // print s, call perror("") and exit(-1)
// lite hexdump ([0xff] x16 | ...a...b...c...d)
void dump (const unsigned char *data_buffer, const unsigned int len);
int main(int argc, char **argv) {
FILE *my, *crypted;
void *content;
unsigned char *ascii;
char output[256] = "";
int i, bytes_read, offset;
if (argc < 3)
usage(argv[0]);
offset = atoi(argv[2]);
if (offset < -255 || offset > 0xff) {
printf("bad offset\n");
usage(argv[0]);
}
printf("offset %d\n", offset);
// open src
if ((my = fopen(argv[1], "rb+")) == NULL)
fatal("in opening argv[1]");
// alloc memory for src
if ((content = malloc (10000)) == NULL)
fatal("in malloc");
// read src
bytes_read = fread(content, 1, 9999, my);
printf("%d bytes read\n", bytes_read);
// for reading easily
ascii = (unsigned char *) content;
dump(content, bytes_read);
// apply offset on each bytes
for (i=0; i<bytes_read; i++)
ascii[i] = ascii[i] + offset;
printf("\n\ntranslation complete\n\n");
dump(content, bytes_read);
strncpy(output, argv[1], 250);
strcat(output, ".cry");
// open dest
if ((crypted = fopen(output, "wb+")) == NULL)
fatal("in open crypted");
// write src translated in dest
bytes_read = fwrite(content, 1, bytes_read, crypted);
printf("%d bytes written\n", bytes_read);
// terminate pgrm
fclose(crypted);
fclose(my);
free(content);
return 0;
}
void fatal(char *s) {
if (s) {
fprintf(stderr, "[!] Fatal [!] : %s\n", s);
}
perror("");
exit(-1);
}
void usage (char *pgr_name) {
printf("Usage : %s <binary input> <offset [-255:255]>\n\n", pgr_name);
exit(0);
}
void dump (const unsigned char *data_buffer, const unsigned int len) {
unsigned char byte;
unsigned int i, j;
for (i=0; i<len; i++) {
byte = data_buffer[i];
printf("%02x ", data_buffer[i]);
if (((i%16) == 15) || (i==len-1)) {
for (j=0; j < 15-(i%16); j++)
printf(" ");
printf("| ");
for (j=(i-(i%16)); j<=i; j++) {
byte = data_buffer[j];
if (byte > 31 && byte < 127)
printf("%c", byte);
else
printf(".");
}
printf("\n");
}
}
}
Die Datei wäre beschäftigt, weil Sie sie ausführen. Sobald es fehlgeschlagen ist, wird es nicht mehr ausgeführt, sodass lsof nicht anzeigt, dass es gesperrt ist. EDIT TO ADD, die Datei wird für die gesamte Dauer des Laufs beschäftigt sein, nicht nur in den Speicher geladen werden. – racraman
Also kann eine ausführbare Datei ihn nicht unter Unix neu schreiben? – ghost
Vielen Dank für die Geschwindigkeit der Antwort – ghost