2012-04-10 20 views
15

Aşağıdaki montaj kodu neden bir hata ayıklama aracıdır?Bu kod neden bir hata ayıklayıcısını algılamamı sağlıyor?

l1: 
call l3 
l2: 
;some code 
l3: 
mov al, 0c3h 
mov edi, offset l3 
or ecx, -1 
rep stosb 

Ben C3hRETN olduğunu biliyorum ve stobsedi kaymış ve bunun nedeni rep ait ecx kez yapılır göre işlem kodu olarak al değeri yazar olduğunu biliyoruz.

Ayrıca, stobs ve stosw, özgün mimarisi olarak intel mimarisinde önceden getirildiyse, çalışacaklarının da farkındayım.

Hata ayıklama modunda programı çalıştırırsak, ön getirme geçersiz olur ve l2 etiketi çalışır (tek adım olduğu için) aksi halde hata ayıklayıcı yoksa l1 ile l3 arasında ping-pong olur. sağ?

+1

Tek adım olarak ayarlanıp ayarlanmadığına bağlı değil mi? Çünkü dürüstçe, hata ayıklayıcının neden bunun üzerinde yanıldığını göremiyorum. Kurallar tek adımda biraz farklı. bağlantıdan – 0xC0000022L

+0

http://stackoverflow.com/questions/12633599/anti-debug-using-prefetch-queue-doesnt-work-with-my-cpu – 0x90

cevap

13

programın hataları olduğu zaman (kesme oluştuğunda) (diğer bir deyişle tek basamaklı) önceden getirme sıra her adımda yıkanır. Bununla birlikte, normal olarak çalıştırıldığında, rep stosb'a olmayacaktır. Eski işlemciler, rep movs ve rep stosb dışında değiştirilen kendi kendini değiştiren kodu desteklemek için önbelleğe alınan alana bellek yazıldığında bile temizlenemedi. (IIRC sonunda i7 işlemciler giderilmiştir.)

varsa bir ayıklayıcı (tek adım) kodu doğru çalıştırır ve rep stosb ret l2 ile değiştirilmesi durumunda çalıştırılacaktır yüzden

. Hata ayıklayıcısı olmadığında rep stosb devam edecektir, çünkü en büyük olasılıkla ecx en büyük ihtimalle yazacak bir yere yazacak ve bir istisna oluşacaktır.

Bu anti-ayıklama tekniği this paper tarif edilmektedir.

+1

teşekkürler! –

+2

Tüm yollar Peter Ferrie'ye gidiyor ... – Leigh

2

Hata ayıklayıcısının burada yaptığı tek şey, gecikme süresi eklemektir. Bunun nasıl çalıştığı anahtar olabilir. Intel (ve ben de AMD'nin) elkitabında, programın CPU'ya değiştirilen komutu değiştiren önbellek hattının değiştiğini bildirmedikçe, kendi kendini değiştiren kodun "çalışmaya" uygun olmadığını belirtiyor. Bu prefetch mantığını ucuza yapmaktır; çip tasarımcılar sürekli olarak, bir talimat önbelleğinin her baytının hala geçerli olduğunu test eden bir donanıma sahip olmak istemezler.

yüzden rep stosb sonra bir dönüş depolayan l1 aramalar l3 olduğunu ile debugger'lar olur ve dönüş L3 containng cachecline zorlayarak, tek adım içinde hata ayıklayıcı tarafından uyarılan uzun gecikmelere becaued idam Nelerin varsayalım değiştirildikten sonra tekrar edilmek üzere.

ayıklayıcıya olmadan ben stosb işletilirse sonra talimat (gösterilmemiştir) tahmin ediyorum. Eğer "hata ayıklayıcısına" bir sıçrama olsaydı, o zaman sıçramanın başarısı, tek adımlı hata ayıklayıcısının kullanılmadığını gösterirdi. Bir uygulamada bu kodu bulduysanız

, bunu çalıştırmak için çöp olur.

İlgili konular