2012-09-04 27 views
5

Bu makaleyi okuyun: http://static.patater.com/gbaguy/day3pc.htmCS segment kaydı değiştirilirse ne olur?

Bu cümle

YAPMAYIN HİÇ DEĞİŞİKLİĞİ CS içerir !!

CS segment kayıtlarını değiştirdiyseniz tam olarak ne olurdu? Neden bu kadar tehlikeli? Kod segmenti

+2

'CS' = kod parçası. Değişen bir sapkın "jmp" ile (bir anlamda) eşdeğer olduğunu varsayalım. – valdo

+5

Bu belge oldukça güvenilir görünmüyor: "CS'YI DEĞİŞTİRMEYİN!", Ancak CS'yi şöyle okuyabilirsiniz: "mov ds, cs", ​​"CS" değerini "D" ye getirin. Eh, x86'da mov ds, cs ya da başka bir “mov segreg, segreg” gibi bir talimat yoktur. 'Cs 'değerini okumak için' mov reg, cs; mov ds, reg' ('' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''; pop ds'. Dahası, eğer * hiç * değiştirmemeye karar verirseniz, tüm kesintili çağrılar söz konusu değildir (örn. BIOS, DOS ve Linux servisleri). http://web.itu.edu.tr/kesgin/mul06/intel/instr/mov.html – nrz

+1

@nrz: "Uzak" çağrılarıyla erişilebilen "Linux hizmetleri" diye bir şey yoktur (bunlar arasında kesintiler/syscalllar farklı şekilde çalışır; ', _caller_, 'cs' hedefinin ne olacağını kontrol edemez, IDT girişlerini/syscall msrs kurarken işletim sistemi tarafından karar verilir. Ack, 'cs' _can_ ile değiştirilebilir, sadece hedef kod segmenti bulunmadığı ve "eip" hedefine ulaşılacağı şekilde ayarlanmadığı sürece, böyle bir çağrı bir # # GP' hatasına neden olur ve Uygulama iptal olacak. –

cevap

7

cs'dur. cs:ip, yani csip (talimat işaretçisi) ile birlikte bir sonraki talimatın yerini gösterir. Bu nedenle, cs veya ip numaralı herhangi bir değişiklik veya her ikisinde de bir sonraki talimatın getirileceği ve çalıştırılacağı adresi değiştirir.

Genellikle, retf, int3, int veya iret bir jmp (uzun atlama) ile cs, call (uzun arama) değiştirin. 8088 ve 8086 pop cs da kullanılabilir (opcode 0x0F). pop cs, 186 + 'da çalışmayacaktır, burada opcode 0x0F, çok baytlı talimatlar için ayrılmıştır. Uzun atlama veya uzun aramada doğal olarak tehlikeli hiçbir şey yoktur. Sadece zıpladığınız veya çağıracağınız yeri bilmeniz ve korunan modda bunu yapmak için yeterli ayrıcalıklara sahip olmanız gerekir. 16-bit gerçek modda (örn. DOS), örneğin istediğiniz her şeyi atlayabilir ve arayabilirsiniz. jmp 0xF000:0xFFF0, cs - 0xF000 ve ip - 0xFFF0 adreslerini ayarlar; bu, BIOS kodunun başlangıç ​​adresidir ve bu nedenle bilgisayarı yeniden başlatır. Farklı bellek adresleri farklı kodlara sahiptir ve bu nedenle farklı sonuçlara neden olur, teoride mümkün olan her şey olabilir (sabit sürücü, geçerli kayıt ve/veya yığın değerleri ile biçimlendirmek için kullanılan BIOS koduna atlarsanız, sabit sürücü biçimlendirilir 'talep edildiği gibi'). Pratikte, jmp 'ler ve call' un çoğu adreste olması, büyük olasılıkla geçersiz opcode veya başka bir istisna (sıfıra bölme, taşma bölme, vb.) Ile sonuçlanır.

+0

Sadece 'cs' değiştirme genellikle yanlıştır. Normalde 'cs' ve' xip' birlikte değiştirilir ya da sadece 'xip' değişir. –

+3

@AlexeyFrunze Eh, sadece "cs" değiştirmeden/ipi değiştirmeden "cs" değiştirmenin tek yolu "cs", sadece 8088 ve 8086'da kullanılabilir. t değiştirmeden/ayarlamaya gerek kalmadan cs'yi değiştirip ip ipini/eip/rip olarak değiştirir. 'pop cs' muhtemelen 8088/8086 (veya 8088/8086 emülatörü) için hedeflenen gizleme kodunda kullanılabilir. – nrz

0

Korumalı modda ve uzun modda (yani 16 bit modda değil), CS dahil olmak üzere segment yazmaçları artık yalnızca 4 bitlik bir adres değildir. Bir taban + limitiyle (normal taban = 0 limit = 4GiB, yani bir düz bellek modeli), fakat diğer özelliklerle birlikte, segment tanımlayıcıları tablosuna indekslenirler.

Kod segmenti tanımlayıcı, CPU modunu belirler (örn. 32 bit uyumlu mod vs. 64 bit uzun mod). 64-bit bir çekirdekte, 64-bit bir kullanıcı-alanı işlemi, bir 32-bit kod için far jmp yapabilir. Bu uygulamada kullanışlı değildir ve işletim sistemi bir içerik geçişinden sonra işleminize geri döndüğünde bile bozulabilir.

TODO: Birinin nasıl yapılacağını gösterdiği bağlantıyı bulmak. Doğru segment sayılarını bile nasıl bulacağımıza dair ayrıntılı bir yanıtla ilgili yeni bir soru bile olduğunu düşünüyorum.

İlgili konular