Supongamos que tengo una función:C: sobrescribir otro byte función a byte
int f1(int x){
// some more or less complicated operations on x
return x;
}
y que tengo otra función
int f2(int x){
// we simply return x
return x;
}
me gustaría ser capaz de hacer algo como lo siguiente :
char* _f1 = (char*)f1;
char* _f2 = (char*)f2;
int i;
for (i=0; i<FUN_LENGTH; ++i){
f1[i] = f2[i];
}
Ie Me gustaría interpretar f1
y f2
como matrices de bytes sin formato y "sobrescribir f1
byte por byte" y así reemplazarlo por f2
.
Sé que el código generalmente invocable está protegido contra escritura, sin embargo, en mi situación particular, puede simplemente sobrescribir la ubicación de la memoria donde se encuentra f1
. Es decir, puedo copiar los bytes en f1
, pero luego, si llamo a f1
, todo falla.
Entonces, ¿mi enfoque es posible en principio? ¿O hay algunas cuestiones dependientes de la máquina/implementación/que debo tener en cuenta?
Creo que "el código invocable está protegido contra escritura" es la respuesta a por qué está fallando. Dudo que sea el primero en decir esto, pero el código de auto modificación suele ser una idea terrible o un síntoma de un error. – DwB
@DwB Como mencioné en mi pregunta, descubrí que * puedo * escribir en la sección donde se almacenan las funciones. Simplemente * llamando * la variante sobrescrita produce un bloqueo. – phimuemue
también, tenga en cuenta que f1 es probablemente más largo que f2 ... es decir, está compuesto por más bytes –