Lo que usted está utilizando para obtener el desmontaje está tratando de ser útil, al dar en el blanco de la llamada como un desplazamiento desde algún símbolo que se sabe sobre - pero teniendo en cuenta que el desplazamiento es tan grande, es probable que esté confundido.
El objetivo real de la llamada se puede calcular como sigue:
E8
es una call
con un desplazamiento relativo.
- En un segmento de código de 32 bits, el desplazamiento se especifica como un valor de 32 bits con signo.
- Este valor está en orden de bytes little-endian.
- El desplazamiento se mide desde la dirección de las siguientes instrucciones.
e.g.
<some address> E8 32 F6 FF FF call <somewhere>
<some address>+5 (next instruction)
- El desplazamiento es
0xFFFFF632
.
- Interpretado como un valor de 32 bits con signo, esto es
-0x9CE
.
- La instrucción
call
está en <some address>
y tiene 5 bytes de longitud; la siguiente instrucción está en <some address> + 5
.
- Por lo tanto, la dirección de destino de la llamada es
<some address> + 5 - 0x9CE
.
Tanque que tanto. ¡Tu ejemplo es perfecto! – Michael
@Matthew ¿podría la instrucción de llamada tener más de 5 bytes de longitud? (En un archi x86, ¿puede el siguiente instr. Estar en + 6)? En cual caso? –
Rafa
@Rafa, la instrucción de desplazamiento relativo de la llamada es de 5 bytes, porque el desplazamiento relativo máximo debe caber en 4 bytes. Si el objetivo está a más de 2 ** 31 bytes de distancia, 'mov reg, imm64; call reg' se usa. –