Je code le programme lite en c de base qui ajoute (ou sous) offset pour chaque octet dans le fichier binaire passé en argument. Ce travail pour tous les autres ELF, mais quand je suis en train de courir:
$ ./a.out a.out 1
(ajouter 0x01 à chaque octets),
fopen()
accident avec le message d'erreur « Fichier texte occupé ». J'ai vérifié avec lsof
, mais n'est pas ouvert sur le système de fichiers.
Je pensais que lorsqu'un fichier exécutable est en cours d'exécution, une image du fichier est chargée dans la RAM et le fichier est accessible.
Si quelqu'un sait quoi à ce sujet, je vais le prendre! Merci d'avoir pris le temps de me lire!ouvrir un fichier binaire runing
Voici le 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");
}
}
}
Le fichier est occupé car vous l'exécutez. Une fois qu'il a échoué, alors vous ne l'utilisez plus, donc lsof ne le montrerait pas verrouillé. EDIT TO ADD, le fichier sera occupé pendant toute la durée de la course, pas seulement en mémoire. – racraman
Donc, un exécutable ne peut pas le réécrire sur unix? – ghost
Merci pour la rapidité de la réponse – ghost