x86 emülatörü yazarken öğrendiğim tuhaf şeyler
- x86 ve amd64 emülatörleri yazarken öğrenilen çeşitli trivia ve tuhaf noktalardan bahsediliyor
- Time Travel Debugging(TTD), bir sürecin yürütülmesini komut düzeyinde kaydetmek için CPU emülatörü kullanıyor
- TTD'nin ilk sürümü iDNA olarak adlandırılıyordu; assembly ile yazılmıştı, hızlıydı ama bakımı zordu
- İkinci sürüm C++ ile yazıldı ve bakım kolaylığı artırıldı
İşe yaramaz x86 kodlama trivia'ları
- x86 kodlama şeması, aynı komutun birden fazla şekilde kodlanmasına izin veriyor
int 3 komutu CD 03 veya CC olarak kodlanabiliyor
EAX yazmacına "akümülatör yazmacı" denir ve kodlamada gerçekten bir farkı vardır
REX öneki, 64 bit kodda daha geniş bir yazmaç aralığına erişim sağlar
- Komutlar en fazla 15 bayt uzunluğunda olabilir; bu sınır aşılırsa bir istisna oluşur
- Adres override öneki, 64 bit modda 32 bit adreslere başvurabilmeyi sağlar
Tuhaf bayrak özellikleri
INC komutu, ADD komutundan farklı olarak taşıma bayrağını güncellemez
CMPXCHG8B/CMPXCHG16B komutları yalnızca sıfır bayrağını değiştirir
- Kaydırma ve döndürme komutları, kaydırma miktarı 1'den büyükse taşma bayrağını tanımsız durumda bırakır
Kaydırma komutlarında daha fazla sürpriz
shr ax, 10h, ax yazmacını 16 bit kaydırarak 0 yapar
shr eax, 20h, eax yazmacını 32 bit kaydırır ama değer değişmez
- Kaydırma miktarı
1FH ile maskelenir
Segment override
- Segmentler 32 bit ve 64 bit kodda hâlâ kullanılır; başlıca kullanım alanı thread-local storage'dır
- Windows'ta
FS veya GS yazmaçları TEB(Thread Execution Block)'e başvurmak için kullanılır
- 32 bit süreçlerde
FS, 64 bit süreçlerde ise GS kullanılır
- 64 bit modda segment yazmaçlarının değeri önemli değildir
Segment override: daha fazla trivia
- 32 bit modda segment yazmacının gerçek değeri segment descriptor'üne başvurur
- 64 bit modda base, MSR tarafından kontrol edilir
- WinDbg'de 64 bit bir sürecin segment değerleri doğrudan okunamaz
Sonuç
- Bu yazı, x86 trivia'larından oluşan rastgele bir liste sunuyor
- Emülatör yazmak, CPU'nun nasıl çalıştığını derinlemesine anlamaya yardımcı oluyor
- Agner Fog'un web sitesinde harika kaynaklar bulunabilir
GN⁺ özeti
- x86 ve amd64 emülatörleri yazarken öğrenilen çeşitli trivia ve tuhaf noktalar anlatılıyor
- Emülatör yazmak, CPU'nun çalışma biçimini derinlemesine anlamaya yardımcı oluyor
int 3 komutunun farklı kodlamaları, REX öneki, segment override gibi çeşitli trivia'lar ele alınıyor
- Daha fazla kaynak için Agner Fog'un web sitesine bakılabilir
1 yorum
Hacker News görüşü