CIL nop işlem kodunun amacı nedir?


82

MSIL'den geçiyorum ve MSIL'de pek çok nop talimatı olduğunu fark ediyorum .

MSDN makalesi, herhangi bir işlem yapmadıklarını ve işlem kodu yamalıysa alanı doldurmak için kullanıldığını söylüyor. Hata ayıklama yapılarında sürüm sürümlerinden daha fazla kullanılırlar.

Bu tür ifadelerin daha sonraki talimatları hizalamak için derleme dillerinde kullanıldığını biliyorum, ancak MSIL'de neden MSIL düğümlerine ihtiyaç var?

(Editörün notu: kabul edilen yanıt, sorunun başlangıçta sorulduğu MSIL / CIL NOP'ları değil, makine kodu NOP'ları hakkındadır.)


19
Bu yanıtlarda, dil derleyicisi tarafından derleme içine yayılan MSIL nop yönergesi ile derleme çalıştırıldığında JIT derleyicisi tarafından yayılan x86 nop yönergeleri (bu platformda) arasında kitlesel bir karışıklık vardır. [Aslında kabul edilen yanıt x86 nops hakkındadır ve MSIL ile hiçbir ilişkisi yoktur.] İdeal olarak bu soru 2 farklı soruya bölünmelidir: MSIL :: nop? ve yerel platform nop amacı?
Steve Steiner

Yanıtlar:


107

ŞİD'ler birkaç amaca hizmet eder:

  • Oluşturulan kodda başkalarıyla birleştirilse bile hata ayıklayıcının bir satıra bir kesme noktası yerleştirmesine izin verirler.
  • Yükleyicinin farklı boyuttaki bir hedef ofsetiyle bir sıçramayı yamalamasına izin verir.
  • Önbelleğe almak için iyi olabilecek bir kod bloğunun belirli bir sınırda hizalanmasına izin verir.
  • Genel işlevin boyutunun değişmesi konusunda endişelenmenize gerek kalmadan yeni bir bölüme yapılan bir çağrı ile kod parçalarının üzerine yazmak için artımlı bağlantıya izin verir.

Gönderen Wikipedia : "Bir NOP en yaygın, tehlikeleri önlemek için böyle bir atlama olarak geçersiz varolan talimat işlemek için, bir dal geciktirme yuvası işgal etmek ya da bir yer tutucu olarak değiştirilmesi, kuvvet hafıza sıralamasına bağlı olarak, zamanlama amaçları için kullanılır Program geliştirmede daha sonra aktif talimatlarla (veya yeniden düzenleme sorunlu veya zaman alıcı olduğunda kaldırılan talimatları değiştirmek için) Bazı durumlarda, bir NOP'un küçük yan etkileri olabilir; örneğin, Motorola 68000 serisi işlemcilerde NOP opcode işlem hattının senkronizasyonuna neden olur. "
mbomb007

11

İşte nasıl MSIL / CIL nops ( değil x86 makine kodunop ) hata ayıklama tarafından kullanılır:

Nops, örtük sıra noktalarını tanımlamak için dil derleyicileri (C #, VB, vb.) Tarafından kullanılır. Bunlar, JIT derleyicisine makine talimatlarının IL yönergelerine nerede geri eşleştirilebileceğini söyler.

Rick Byer'in DebuggingModes.IgnoreSymbolStoreSequencePoints hakkındaki blog girişi, birkaç ayrıntıyı açıklıyor.

C # ayrıca çağrı talimatlarından sonra Nops yerleştirir, böylece kaynaktaki geri dönüş yeri konumu çağrıdan sonraki hat yerine çağrıdır.


C # ayrıca çağrı talimatlarından sonra Nops yerleştirir, böylece kaynaktaki geri dönüş yeri konumu çağrıdan sonraki hat yerine çağrıdır. Bunu anladığımdan emin değilim. Herhangi bir referansınız var mı?
user492238

8

Bir sürüm yapısının hiçbirini yayınlamayacağı kodda satır tabanlı işaretçiler (örneğin kesme noktaları) için bir fırsat sağlar.


Kesme noktalarının sıfırda olması gerekiyor mu? Neden normal işlem koduna bir kesme noktası koymuyorsunuz?
Dan Goldstein

4
birçok normal işlem kodu, sürüm yapılarında optimize edilir. Kırılma noktalarının hala işaret edeceği bir yer tutucu yoksa bu, kırılma noktalarınızı bozar
Jimmy

1
Hata ayıklama yapılarında, kodun talimat içermediği yerlerde kırılması için bir talimat sağlamak için de kullanılırlar. Örneğin parantez açma.
Greg D

1
Kaynak olarak blogs.msdn.com/oldnewthing/archive/2007/08/17/4422794.aspx için bir referans eklemek isteyebilirsiniz .
Greg D

1
Bunu gerçek bir cevap haline getirdikleri için Greg ve Jimmy'ye teşekkürler.
harpo

6

Ayrıca, belirli işlemciler veya mimariler için optimize ederken kodun daha hızlı çalışmasını sağlayabilir:

İşlemciler uzun süre kabaca paralel olarak çalışan birden çok işlem hattı kullanır, bu nedenle aynı anda iki bağımsız talimat verilebilir. İki işlem hattına sahip basit bir işlemcide, birincisi tüm talimatları destekleyebilirken, ikincisi yalnızca bir alt kümeyi destekler. Ayrıca, henüz bitmemiş olan önceki bir talimatın sonucunu beklemek gerektiğinde, boru hatları arasında bazı duraklamalar vardır.

Bu koşullar altında, özel bir nop , bir sonraki talimatı belirli bir boru hattına (ilki veya ilki değil) zorlayabilir ve aşağıdaki talimatların eşleşmesini iyileştirerek, nop maliyetinin amorti edilenden daha fazla olmasını sağlayabilir .


5

Kanka! İşlemsizlik harika! Zaman tüketmekten başka hiçbir şey yapmayan bir talimattır. Karanlık çağlarda, onu kritik döngülerde zamanlamada mikro ayarlamalar yapmak için veya daha da önemlisi kendi kendini değiştiren kodda bir dolgu olarak kullanırdınız.


Doğrudan donanım üzerinde çalıştırıldığında kullanımını anlıyorum, ancak MSIL JIT'lidir.
Dan Goldstein

MSIL yalnızca JIT'e sahip sistemlerde JIT'lidir - MSIL, JIT'i talep etmez.
kaide

5

Yakın zamanda çalıştığım bir işlemcide (dört yıl boyunca) NOP, bir sonraki işlem başlamadan önceki işlemin bitmesini sağlamak için kullanıldı. Örneğin:

kaydedilecek yük değeri (8 döngü alır) nop 8 kayda 1 ekle

Bu, kayıtların ekleme işleminden önce doğru değere sahip olmasını sağlamıştır.

Başka bir kullanım, belirli bir boyutta (32 bayt) olması gereken kesme vektörleri gibi yürütme birimlerini doldurmaktı çünkü vektör0 için adres, diyelim ki, vektör 1 0x20 için 0 idi, bu nedenle derleyici NOP'leri oraya koyduysa gerekli.


4

Hata ayıklama sırasında düzenleme ve devam etmeyi desteklemek için bunları kullanıyor olabilirler . Hata ayıklayıcıya, ofsetleri değiştirmeden eski kodu yenisiyle değiştirmek için çalışma alanı sağlar.


4
Düzenleme için VS'de hata ayıklayıcı desteğini uyguladım ve devam ettim (CLR veya derleyici parçalarını uygulamadım). Nops, bir yöntemin eski sürümünden yeni sürümüne doğru eşleştirmeleri sağlamak için hikayenin bir parçasıdır (özellikle yürütme işleme kodundan atlamalar durumunda). Bununla birlikte, MSIL'in değiştirilmesi tüm işlev temelinde yapılır. CLR tarafından yönetilen kod için, bu parçayı gerçekleştirmek için msil'de 'yer bırakmaya' gerek yoktur. Burada söyledikleriniz yerel Düzenleme ve devam etme açısından doğrudur.
Steve Steiner

4

Biraz alışılmadık bir kullanım, arabellek taşması istismarlarında kullanılan NOP- Slides'tır.


bunu arıyordu :)
Suraj Jain

Bağlantınızı Düzeltin, çalışmıyor, lütfen her zaman emin olun, web arşiv bağlantısını gönderdiniz, çünkü 404'ü bulamazlar.
Suraj Jain

Şu anda shellcode üzerinde çalışıyor ve NOP hakkında daha fazla bağlam istiyor. Biraz geri gitmem gerekti
saniboy

4

50 yıl çok geç ama hey.

Montaj kodunu elle yazıyorsanız, Nop'lar kullanışlıdır. Kodu kaldırmanız gerekiyorsa, eski işlem kodlarını geçersiz kılabilirsiniz.

benzer şekilde, bazı işlem kodunun üzerine yazıp başka bir yere atlayarak yeni kod ekleyebilirsiniz. Oraya, üzerine yazılan işlem kodlarını ve yeni kodunuzu yerleştirirsiniz. Hazır olduğunda geri atla.

Bazen mevcut olan araçları kullanmanız gerekirdi. Bazı durumlarda bu sadece çok basit bir makine kodu düzenleyicisiydi.

Günümüzde, derleyicilerle teknikler artık hiçbir anlam ifade etmiyor.


3

Bunların klasik kullanımlarından biri, hata ayıklayıcınızın her zaman bir kaynak kodu satırını bir IL talimatıyla ilişkilendirebilmesidir.


Msil, çalıştırıldığında JIT derlendiğinden, bu eşlemeyi kaybetmek mümkündür (örneğin, yerel talimatın benzersiz MSIL komutu yoktur). NOP'lar, böyle bir eşleştirmeyi korumak için dil derleyicisinden JIT derleyicisine bir iletişim mekanizması olarak kullanılır.
Steve Steiner

3

Yazılım kırma sahnesinde, bir uygulamanın kilidini açmanın klasik bir yöntemi, anahtarı veya kaydı veya zaman aralığını kontrol eden satırı bir NOP ile yamalamaktır, böylece hiçbir şey yapmaz ve uygulamayı kayıtlıymış gibi başlatmaya devam eder. .


5
Ben çok emin no-op talimatlar :-) insanlara yardım korsan yazılıma icat edilmedi ediyorum
Simon Howard

3

Ayrıca, bir yer tutucu olarak ne yaptığını gizlemek için kendisini değiştiren kodda NOP'lar gördüm (veeery eski kopya koruması).


3

Ddaa'nın dediği gibi, nops, yığındaki varyansı hesaba katmanıza izin verir, böylece dönüş adresinin üzerine yazdığınızda, nop kızağına atlar (arka arkaya çok sayıda düğüm) ve ardından bazılarına atlamak yerine çalıştırılabilir koda doğru şekilde vurur. başlangıç ​​değil talimatta bayt.


1

Bağlayıcının daha uzun bir talimatı (tipik olarak uzun atlama) daha kısa olanla (kısa atlama) değiştirmesine izin verirler. NOP fazladan alanı kaplar - diğer sıçramaların çalışmasını engelleyeceği için kod hareket ettirilemez. Bu bağlantı anında gerçekleşir, bu nedenle derleyici uzun veya kısa bir atlamanın uygun olup olmadığını bilemez.

En azından geleneksel kullanımlarından biri bu.



1

.NET derleyicileri MSIL çıktısını hizalar mı? IL'ye erişimi hızlandırmak için yararlı olabileceğini düşünürdüm ... Ayrıca, benim anladığım kadarıyla, taşınabilir olacak şekilde tasarlandı ve diğer bazı donanım platformlarında uyumlu erişim gerekli.


1

İlk öğrendiğim montaj SPARC idi, bu yüzden dallanma gecikmesi yuvasına aşinayım, eğer onu başka bir talimatla dolduramazsanız, genellikle dallanma talimatının üstüne koyacağınız veya döngülerde bir sayacı artıracağınız talimat, kullanırsınız. bir NOP.

Kırmaya aşina değilim, ancak NOP kullanarak yığının üzerine yazmanın yaygın olduğunu düşünüyorum, bu nedenle kötü amaçlı işlevinizin nerede başladığını tam olarak hesaplamak zorunda kalmazsınız.


1

ISR'ye girdikten sonra biriken gecikmeyi otomatik olarak ayarlamak için NOP'leri kullandım. Zamanlama için çok kullanışlı.


-1

nopbellek bozulmasında yararlı olacaktır. Elbettenop benzerxchg eax, eax


Başka bir cevap , kod enjeksiyon açıklarından yararlanma amaçlı NOP slaytlarından bahsetti. Yani yaptığımız başka bir yanıt aynı soru üzerine. Bu cevap, ne kadar yararlı olduklarından bahsetmiyor ve henüz bilmiyorsanız açık değildir.
Peter Cordes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.