Supponiamo Ho una funzione:C: sovrascrivere un'altra funzione byte per byte
int f1(int x){
// some more or less complicated operations on x
return x;
}
e che ho un'altra funzione
int f2(int x){
// we simply return x
return x;
}
Vorrei essere in grado di fare qualcosa di simile alla seguente :
char* _f1 = (char*)f1;
char* _f2 = (char*)f2;
int i;
for (i=0; i<FUN_LENGTH; ++i){
f1[i] = f2[i];
}
Ie Vorrei interpretare f1
e f2
come matrici di byte grezzi e "sovrascrivere f1
byte per byte" e, quindi, sostituirlo con f2
.
So che in genere il codice callable è protetto da scrittura, tuttavia, nella mia situazione particolare, è possibile semplicemente sovrascrivere la posizione di memoria in cui si trova f1
. Cioè, posso copiare i byte su f1
, ma in seguito, se chiamo f1
, il tutto si blocca.
Quindi, il mio approccio è possibile in linea di principio? O ci sono alcune questioni relative alla macchina/all'implementazione/che devo prendere in considerazione?
Credo che "il codice chiamabile sia protetto da scrittura" è la risposta al perché non funziona. Dubito che sia il primo a dirlo, ma il codice auto-modificante di solito è una pessima idea o un sintomo di un bug. – DwB
@DwB Come ho accennato nella mia domanda, ho scoperto che * posso * scrivere nella sezione in cui sono memorizzate le funzioni. Solo * chiamando * la variante sovrascritta provoca un arresto anomalo. – phimuemue
, inoltre, considerare che f1 è probabilmente più lungo di f2 ... cioè è composto da più byte –