Soru:
'Mov edi, edi'nin amacı nedir?
Mellowcandle
2013-03-25 14:56:00 UTC
view on stackexchange narkive permalink

Bu talimatı birkaç Windows programının başında görüyorum. Bir kaydı kendine kopyalıyor, bu yüzden temelde bu bir nop işlevi görüyor. Bu talimatın amacı nedir?

The Essence: İki baytlık bir NOP'dir. Böylece, işlemci siz değiştirirken kodun bu bölümünü çalıştırmaya çalıştığında, tamamlanmamış / yanlış bir talimat yüklemeden iki baytı atomik olarak yamalayabilirsiniz.
X86-64 "mov edi'de, edi" bir NOP değildir. X86-64'te "rdi" nin ilk 32 bitini sıfırlar. 32 bitlik kodda "mov edi, edi" NOP olarak kullanılabilir.
üç yanıtlar:
#1
+68
QAZ
2013-03-25 15:03:13 UTC
view on stackexchange narkive permalink

Raymond Chen (Microsoft), bunu ayrıntılı olarak tartışan bir blog gönderisine sahip:

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

Kısacası, çalışma zamanı sıcak yamalamayı desteklemek için uygulanan bir derleme zamanı eklemesidir, bu nedenle işlev, yürütmeyi başka bir kod parçasına yeniden yönlendirmek için bir JMP talimatı ile ilk iki baytın üzerine yazılabilir.

"Mov edi, edi" komutunun önüne muhtemelen 5 boş bayt hakkında bir not eklemelisiniz.
Neden "66 90" gibi gerçek bir 2 baytlık NOP değil? Bu daha verimli olacaktır: arka uç uop gerekmiyor, EDI için ekstra gecikme yok (önemliyse), çıktıyı yeniden adlandırmak için fiziksel kayıt gerekmez. Belki de, araçların, anında düzeltme kodu dışında doğal olarak oluşmadığını algılayabileceği bir "imza" olması gerekiyor?
@PeterCordes: Raymond Chen, https://devblogs.microsoft.com/oldnewthing/20130102-00/?p=5663 "MOV EDI, EDI'yi iki baytlık NOP talimatı olarak kullanma kararının CPU üreticileriyle görüştükten sonra geldiğini de tartışıyor. en iyi iki baytlık NOP için öneriler "
@BenSchwehn: Huh, muhtemelen bu kararın geçmişi P5 Pentium günlerine dayanıyor, burada bir "66" ön eki komutun kodunun çözülmesi için fazladan bir döngü almasına neden oluyor. P6'dan sonraki CPU'lar için talihsiz bir durum. Ayrıca isteğe bağlı olarak bir çerçeve işaretçisi kullanan işlevler için 2 baytlık "push ebp" kodlaması gibi yararlı bir talimat olmaktan ziyade bir NOP olması gerektiği için talihsiz bir durumdur. (1 baytlık kısa biçimle değil, modrm bayt ile "itme r / m32" biçimini kullanmak.) Ancak, bu biraz daha az basittir ve hiçbir şeyi zorlamak istemeyen işlevleri zorlamamak için bir alternatife ihtiyaç duyar.
#2
+19
peter ferrie
2013-03-30 03:59:49 UTC
view on stackexchange narkive permalink

Belirli bir konuma, mov komutundan 5 bayt önce atlanması amaçlanmıştır. Oradan, 32-bit bellek alanında başka bir yere uzun bir sıçrama için değiştirilmek üzere tasarlanmış 5 bayta sahipsiniz. Hot-patch yaparken, 5 bayt atlamanın ilk olarak yerleştirilmesi gerektiğini ve ardından mov'un değiştirilebileceğini unutmayın. Diğer tarafa gidersek, değiştirilen mov-jmp'nin ilk önce çalışmasını ve orada ne olursa olsun 5 bayta atlamasını riske atarsınız (varsayılan olarak hepsi sıfırdır, ancak asla bilemezsiniz).

[ekleme aşağıdaki gibidir ]

5 bayt atlamasının yazılmasıyla ilgili olarak - ayrıca atomik olarak 4 bayttan fazla yazmanıza izin verecek tek bir talimat vardır - cmpxchg8b ve bu amaç için ideal bir talimat değildir. Önce 0xe9 ve sonra bir dword yazarsanız, o zaman 0xe9 dword yerleştirilmeden önce çalıştırılırsa bir yarış koşulunuz olur. Önce uzun atlamayı yazmak için başka bir neden daha.

Genellikle NOP'lar veya INT3'ler.
Doğru, ama INT3'ler söz konusu olduğunda, bunu kesinlikle kazara çalıştırmak istemezsiniz.
Ve işlevin * zaten * saptırılmış olması durumunda, önce 4 baytlık atlama hedefi adresini yazmak, önceki "jmp" nin sahip olduğu "rel32" nin atom olarak yerini alacaktır. (Dword'ün 4 bayt hizalı olduğu varsayılırsa, bu, işlevler 8 veya 16 bayt hizalıysa olacaktır. Bir işlevin başlangıcında biter.)
#3
+8
rebel87
2015-10-03 12:54:27 UTC
view on stackexchange narkive permalink

courtey Hotpatching and the Rise ofThird-Party Patches sunumu BlackHat USA 2006'da Alexander Sotirov

Hotpatching Nedir? Anında düzeltme, bir uygulamanın davranışını çalışma zamanında ikili kodunu değiştirerek değiştirme yöntemidir. Pek çok kullanımı olan yaygın bir tekniktir:

• hata ayıklama (yazılım kesme noktaları)

• çalışma zamanı araçları

• Windows API işlevlerini bağlama

• yürütmeyi değiştirme veya kapalı kaynak uygulamalara yeni işlevler ekleme

• yazılım güncellemelerini yeniden başlatmadan dağıtma

• güvenlik açıklarını düzeltme

Anında düzeltme orijinal ve yamalı ikili dosyaları karşılaştıran otomatik bir araç tarafından oluşturulur. Değiştirilen işlevler, .hp.dll uzantılı bir dosyaya dahil edilir. Anında düzeltme DLL'si çalışan bir işlemde yüklendiğinde, savunmasız işlevin ilk yönergesi, anında yamaya atlamayla değiştirilir.

The / hotpatch derleyici seçeneği, her işlevin ilk talimatının, hotpatch tarafından güvenle üzerine yazılabilen bir mov edi, edi talimatı olmasını sağlar. Windows'un eski sürümleri bu seçenekle derlenmez ve anında uygulanamaz.



Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...