2012-04-29 7 views

Odpowiedz

42

Cokolwiek używasz do uzyskania demontaż stara się być pomocny, dając cel rozmowy jako przesunięcie od jakiegoś symbolu, który wie o - ale biorąc pod uwagę, że przesunięcie jest tak duża, prawdopodobnie jest zdezorientowany.

Rzeczywisty cel zaproszenia można obliczyć w następujący sposób:

  • E8 jest call ze względnym przesunięciem.
  • W 32-bitowym segmencie kodu odsunięcie jest określane jako podpisana wartość 32-bitowa.
  • Ta wartość jest uporządkowana w bajtach z małą liczbą bajtów.
  • Przesunięcie jest mierzone od adresu poniższej instrukcji.

np.

<some address>  E8 32 F6 FF FF   call <somewhere> 
<some address>+5  (next instruction) 
  • Przesunięcie jest 0xFFFFF632.
  • Zinterpretowana jako podpisana wartość 32-bitowa, jest to -0x9CE.
  • Instrukcja call ma numer <some address> i ma długość 5 bajtów; następna instrukcja to <some address> + 5.
  • Adres docelowy połączenia to <some address> + 5 - 0x9CE.
+0

Czołgaj się tak bardzo. Twój przykład jest na miejscu! – Michael

+0

@Matthew Czy instrukcja połączenia może mieć więcej niż 5 bajtów długości? (W archie x86, czy następny instric może być + 6)? W takim razie? – Rafa

+0

@Rafa, instrukcja względnego przesunięcia wywołania ma wartość 5 bajtów, ponieważ maksymalne przesunięcie względne musi mieścić się w 4 bajtach. Jeśli cel jest oddalony o więcej niż 2 ** 31 bajtów, 'mov reg, imm64; call reg' jest używany. –

-2

Jeśli analizujesz plik PE za pomocą dezasemblera, dezasembler mógł podać nieprawidłowy kod. Większość programów piszących o złośliwym oprogramowaniu wykorzystuje technologię E-8 jako technikę zapobiegającą dezasemblacji. Możesz sprawdzić, czy kody powyżej E8 są instrukcjami skoku, gdzie lokalizacja skoku jest po E8.