2010-07-28 16 views
9

"tipik bir Windows x86 veya AMD64 mimarisine düşünün, hafıza yazılabilir ancak idam (DEP düşünün) olamaz veri bölümleri ve yazılamaz çalıştırılabilir bölümlerde bölünmüş olduğunu."JIT, belleğe enjekte edilen kodu nasıl derlenir ve çalıştırılır?

"JIT, bellek içi yöntemlerini derler yapar (genellikle) yerine, bir sonraki talimat işaretçisi bunu ulaşabileceğiniz etrafında hareket JIT işaret (mevcut yönerge işaretçi değiştirir, diske şey saklamaz) yeni oluşturulan kod için işaret ve daha sonra yürütür. "

Bu iki paragraf

, basitleştirilmiş aşırı biraz, temelde JIT ve Windows' bellek modelinin anladığım ise. Ayrıca, bazı yürütülebilir kodları el ile bellekte kopyalamaya çalıştığımda ve bunu çalıştırmayı denediğimde, genellikle bunu yapamayacağımı biliyorum (DLL enjeksiyonunda değilse).

JIT tasarımcıları bu engelleri nasıl aştı? Ring-0 sürücüsü kullanıyorlar mı yoksa her şey kullanıcı modunda mı yapılıyor?

cevap

9

Sadece Windows VirtualProtect() API işleviyle yapılır. Sanal bellek sayfası özelliklerini değiştirir. PAGE_READWRITE'dan JIT derleyicisi, makine kodunu PAGE_EXECUTE_READ adresine yazabilir, böylece çalıştırılabilir. Sayfa, JIT derleyicisini de çalıştıran işlemin sahibi olduğu için bunu yapmak için özel ayrıcalıklara gerek yoktur.

+0

Gerçekten, * bu * basit? Mantıklı. (OT) Ah, hatırlıyorum, son zamanlarda kendi işlemimde olmayan bir şey enjekte etmem gerekti (yani, çalıştırılabilir, tipik tavuk/yumurta problemini ilk önce boşaltmak için gereken mevcut çalıştırılabilir dosyayı silmek için). – Abel

+0

@Hans: Bu konuyla ilgili daha fazla bilgi edinmek istiyorum, bunun [Sosyal MSDN gönderisi] ile nasıl bir ilişki içerdiğini merak ediyorum (http://social.msdn.microsoft.com/Forums/en-US/clr/thread/2a043d8c-3ac4-4b3d- 9837-0bfe8e7d6788), bayrağı değiştirmek ve bu şekilde çalışamayacağını iddia etmek için 'VirtualProtect' kullanmak için Yönetici haklarına ihtiyacınız olduğunu açıklıyor. ActionScript ile aynı prensip, "VirtualAlloc", [bu blog yazarı tarafından açıkça görüldüğü gibi] ile çalışır (http://null.co.in/2010/04/29/spraying-just-in-time/). yanlış adlar, 3. resmine altyazı bakın). Her iki yazı da bunun yerine VirtualAlloc'un olacağını varsaymamı sağladı. Düşünceleriniz burada mı? – Abel

+0

@Abel: Tanıdık görünüyor. Hayır, o yazıya yönetici haklarının gerekmediğini not ettim. OP kabul etti. –

İlgili konular