Pitanje:
Koja je svrha 'mov edi, edi'?
Mellowcandle
2013-03-25 14:56:00 UTC
view on stackexchange narkive permalink

Ovu uputu vidim na početku nekoliko Windows programa. Kopira registar u sebe, tako da u osnovi ovo djeluje kao nop . Koja je svrha ove upute?

Suština: To je dvobajtni NOP. Tako možete atomsko zakrpati dva bajta, a da procesor ne učita nepotpune / neispravne upute kada on pokuša izvršiti ovaj dio koda dok ga mijenjate.
U x86-64 `mov edi, edi` nije NOP. U x86-64 poništava gornja 32 bita `rdi`-a. U 32-bitnom kodu `mov edi, edi` može se koristiti kao NOP.
Tri odgovori:
#1
+68
QAZ
2013-03-25 15:03:13 UTC
view on stackexchange narkive permalink

Raymond Chen (Microsoft) ima post na blogu koji detaljno raspravlja o tome:

https://devblogs.microsoft.com/oldnewthing/20110921-00/?p=9583

Ukratko, primjenjuje se dodavanje vremena kompajliranja kako bi se podržalo vruće krpanje vremena izvođenja, tako da funkcija može imati prva dva bajta prepisana JMP naredbom za preusmjeravanje izvršavanja na drugi dio koda.

Vjerojatno biste trebali dodati napomenu o 5 praznih bajtova koji prethode uputi `mov edi, edi`.
Zašto ne pravi 2-bajtni NOP poput `66 90`? To bi bilo učinkovitije: nije potreban stražnji kraj, nije potrebna dodatna latencija za EDI (u slučaju da je to važno), niti je potreban fizički registar za preimenovanje izlaza. Možda bi to trebao biti "potpis" koji alati mogu prepoznati kao da se ne pojavljuju u prirodi, osim u kodu hotpatch-a?
@PeterCordes: Raymond Chen govori o tome da je i https://devblogs.microsoft.com/oldnewthing/20130102-00/?p=5663 "odluka o korištenju MOV EDI, EDI kao dvobajtne NOP upute došla nakon savjetovanja s proizvođačima procesora za njihov preporuke za najbolji dvobajtni NOP "
@BenSchwehn: Huh, vjerojatno ta odluka datira iz P5 Pentium dana, gdje je prefiks `66` učinio da naredba uzima dodatni ciklus za dekodiranje. Žalosno je za kasnije procesore od P6 i dalje. Također je žalosno što to mora biti NOP, umjesto da bude korisna uputa poput dvobajtnog kodiranja `push ebp` za funkcije koje koriste pokazivač okvira. (Upotreba obrasca `push r / m32` s modrm bajtom, a ne 1-bajtnim kratkim obrascem.) Ali to je nešto manje jednostavno za rukovanje i potrebna mu je alternativa da ne pesimizujete funkcije koje ne žele ništa pritisnuti.
#2
+19
peter ferrie
2013-03-30 03:59:49 UTC
view on stackexchange narkive permalink

Namijenjen je skoku na određeno mjesto, 5 bajtova prije mov upute. Odatle imate 5 bajtova koji su namijenjeni prilagodbi u skok u dalj negdje drugdje u 32-bitnom memorijskom prostoru. Imajte na umu da prilikom vrućeg zakrpanja prvo treba postaviti preskakanje 5 bajtova, a zatim mov možete zamijeniti. Ako krenete u drugom smjeru, riskirate da se zamijenjeni mov-jmp pokrene prvi i skoči na 5 bajtova bilo čega što se tamo nalazi (prema zadanim postavkama to je sve, ali nikad se ne zna).

[dodatak slijedi ]

Što se tiče pisanja skoka od 5 bajtova - tu je i problem što postoji samo jedna uputa koja će vam omogućiti da atomsko napišete više od 4 bajta - cmpxchg8b, a to nije idealna uputa za tu svrhu. Ako prvo napišete 0xe9, a zatim dword, tada imate uvjet za utrku ako se 0xe9 izvrši prije nego što postavite dword. Još jedan razlog da prvo napišem skok u dalj.

To su općenito NOP-ovi ili INT3-i.
Tačno, ali u slučaju INT3s, to definitivno ne želite pokretati slučajno.
A u slučaju da je funkcija * već * zaobilazna, pisanje ciljne adrese od 4 bajta prvo će atomski zamijeniti sve `rel32` prethodne` jmp`. (Pod pretpostavkom da je dword poravnan s 4 bajta, što će i biti ako su funkcije poravnate s 8 ili 16 bajtova. Završava na početku funkcije.)
#3
+8
rebel87
2015-10-03 12:54:27 UTC
view on stackexchange narkive permalink

courtsey Hotpatching i uspon zakrpa trećih strana prezentacija Alexandera Sotirova na BlackHat USA 2006.

Što je Hotpatching? Hotpatching je metoda za modificiranje ponašanja aplikacije pomoću modificiranja njenog binarnog koda tijekom izvođenja. To je uobičajena tehnika koja ima brojne namjene:

• otklanjanje pogrešaka (točke prekida softvera)

• runtime instrumentacija

• povezivanje funkcija Windows API-ja

• izmjena izvršenja ili dodavanje nove funkcionalnosti aplikacija s zatvorenim izvorom

• postavljanje softverskih ažuriranja bez ponovnog pokretanja

• popravljanje sigurnosnih ranjivosti

Hotpatches generiraju se automatiziranim alatom koji uspoređuje izvorne i zakrpane binarne datoteke. Funkcije koje su se promijenile uključene su u datoteku s nastavkom .hp.dll. Kad se hotpatch DLL učita u tekućem procesu, prva se uputa ranjive funkcije zamjenjuje preskakanjem na hotpatch.

Opcija kompajlera / hotpatch osigurava da prva uputa svake funkcije bude mov edi, edi uputa koju hotpatch može sigurno prepisati. Starije verzije sustava Windows nisu kompatibilne s ovom opcijom i ne mogu se hitno spajati.



Ova pitanja su automatski prevedena s engleskog jezika.Izvorni sadržaj dostupan je na stackexchange-u, što zahvaljujemo na cc by-sa 3.0 licenci pod kojom se distribuira.
Loading...