2012-04-29 12 views

Respuesta

42

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.
+0

Tanque que tanto. ¡Tu ejemplo es perfecto! – Michael

+0

@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

+0

@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. –

-2

Si está analizando el archivo PE con un desensamblador, es posible que el desensamblador le haya dado el código incorrecto. La mayoría de los programadores de malware utilizan la inserción de E8 como técnica antidesensamblaje. Puede verificar si los códigos sobre E8 son instrucciones de salto donde la ubicación del salto es después de E8.

Cuestiones relacionadas