Potrzebuję pomocy, aby zrozumieć następującą instrukcję montażu. Wydaje mi się, że dzwonię pod adres w UnNknownValue + = 20994A?Potrzebujesz pomocy w zrozumieniu instrukcji E8 asm call x86
E8 32F6FFFF - call std::_Init_locks::operator=+20994A
Potrzebuję pomocy, aby zrozumieć następującą instrukcję montażu. Wydaje mi się, że dzwonię pod adres w UnNknownValue + = 20994A?Potrzebujesz pomocy w zrozumieniu instrukcji E8 asm call x86
E8 32F6FFFF - call std::_Init_locks::operator=+20994A
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.np.
<some address> E8 32 F6 FF FF call <somewhere>
<some address>+5 (next instruction)
0xFFFFF632
.-0x9CE
.call
ma numer <some address>
i ma długość 5 bajtów; następna instrukcja to <some address> + 5
.<some address> + 5 - 0x9CE
.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.
Czołgaj się tak bardzo. Twój przykład jest na miejscu! – Michael
@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
@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. –