visual c++ derleyici değiştirme + ram'e erişme sorunu

Başlatan Gökhan BEKEN, 17 Haziran 2013, 15:37:36

Gökhan BEKEN

Arkadaşlar sırf ide sinin güzelliğinden dolayı visual c++ kullanıyorum,
Ancak visual c++ kullanınca sadece ide değil compileride değiştirmiş oluyorum. Asıl sorunum bu.
Bu sorun yüzünden bir sürü komutu olduğu gibi kullanamıyorum.
Örneğin daha önce dev c++ idesinde çalıştırdığım scanf fonksiyonunu visual c++ da kullanamıyorum. printf ve scanf yerine  cout ve cin fonksiyonlarını kullanıyorum.
ekran temizleme komutunu kullanamıyorum clrscr(), bunun yerine system("cls") yazmak zorundayım, böyle yapınca da windowsun kölesi gibi hissediyorum kendimi.
string fonksiyonlarını çalıştıramıyorum çaresinide bulamadım.
Bunları es geçtik diyelim ancak pointer ile c nin gücünü göremiyorum.
Normalde bir pointer değişkenini artırdığımızda, istersek asıl tuttuğu değişkenin adresinden çıkıyor ve ramde cirit atabiliyoruz özgürce.
Ancak visual c++ sadece pointer tanımlarken verdiğimiz değişkenin adresini tutabiliyor, bunun dışına çıkan program yazdığımızda derliyor ancak çalışırken hata veriyor break ve continue diye soruyor illa break yapmamı istiyor. Resmen sınırlanmış hissediyorum kendimi.
Öncelikle, visual c++ da derleyiciyi klasik c++ derleyicisi ile değiştirebilir miyim bunu öğrenmek istiyorum.
Bunun dışında derleyiciyi değiştirmesek bile yaşadığım ram de dolaşma sorununa çare var mıdır?

bu program ram ile yaşadığım sorunu simgeliyor:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
      char dizi [2];
      int i;
      for(i=0;i<=9000;i++){
         printf("%c",dizi[i]);
     }
system("PAUSE");
return 0;
}

Özel mesaj okumuyorum, lütfen göndermeyin.

Icarus

String kaynakları problemlerinizin temeli visual studio'nun default string'lerinin unicode tanımlanmasından ileri geliyor.
Proje Ayarlarınızdan string'leri 8-bit yapın.

Ayrıca hiçbir protected mode işletim sisteminde "ramde cirit atma" söz konusu değildir. Hatta RAM'e direkt erişim için bile kernel moda'a geçmeniz gerekir. (WinXP'nin PhysicamMemory isimli bir device'ı vardır ama adres translation yapamadığınız için yine bir işe yaramaz)

Verdiğiniz kod çalışmaması son derece doğal. Artı Visual C++'ı "DEBUG" flagları ile derlerseniz bu tip erişim hataları, overflowları ve daha nice hatayı otomatik olarak durdurup size anında debug imkanı sağlar. Visual C++'ın runtime env'sinin hafıza koruma fonksiyonlarını kapatıp "RELEASE" olarak derlerseniz bu diagloglar çıkmaz onun yerine windows programı sonlandırır.

ibo1973

scanf benzeri komutları kulanamama sebebiniz proje oluşturken default olarak ( security devlopment life... ) tickin işaretli olmasından kaynaklı olarak güvenlik açığı olan komutları çalıştırmanıza izin vermiyor aşağıda error yazısındada  o komut yerine genelde başka komut tavsiye ediyor örneğin scanf yerine scanf_s tavsiye ediyor.

Gökhan BEKEN

Verdiğiniz bilgiler için teşekkürler, başka bilgiler varsa bekliyoruz.
Özel mesaj okumuyorum, lütfen göndermeyin.

Gökhan BEKEN

Alıntı yapılan: ibo1973 - 17 Haziran 2013, 19:12:55
scanf benzeri komutları kulanamama sebebiniz proje oluşturken default olarak ( security devlopment life... ) tickin işaretli olmasından kaynaklı olarak güvenlik açığı olan komutları çalıştırmanıza izin vermiyor aşağıda error yazısındada  o komut yerine genelde başka komut tavsiye ediyor örneğin scanf yerine scanf_s tavsiye ediyor.
"scanf_s" komutunu denedim , stringten başka değer almıyor. Zaten sonundaki "_s" kısmı string olduğunu simgeliyor zannımca.
Bu arada dediğinizi yaptıktan sonra yani, "security development lifecycle (sdl) checks" tickini kaldırdım string ve scanf sorunum düzeldi. Teşekkür ederim.
Acaba neden güvenlik açığı olarak görüyor bu komutları? Ayrıca Türkçe sitelerde hiç bahsedildiğini duymadım, bu millet string kullanmıyor mu?

----

@Icarus hocam, yukarıdaki yazdığım komutta döngü 900 değilde 700 kere dönderince sorun olmuyor. Bunu yeni farkettim, tabi bu visual c++ için geçerli. Normal mingw de böyle bir sorun yok normal çalışıyor. Bence ramde cirit atmak için kernel moda geçmeye gerek yok çünkü ramdeki değerleri okuyup gösteren hacker programları olduğunu biliyorum, bunlar erişiyorsa biz de erişiriz.
Özel mesaj okumuyorum, lütfen göndermeyin.

CoşkuN

Alıntı yapılan: meftun - 18 Haziran 2013, 11:25:30
"scanf_s" komutunu denedim , stringten başka değer almıyor. Zaten sonundaki "_s" kısmı string olduğunu simgeliyor zannımca.
Bu arada dediğinizi yaptıktan sonra yani, "security development lifecycle (sdl) checks" tickini kaldırdım string ve scanf sorunum düzeldi. Teşekkür ederim.
Acaba neden güvenlik açığı olarak görüyor bu komutları? Ayrıca Türkçe sitelerde hiç bahsedildiğini duymadım, bu millet string kullanmıyor mu?

----

@Icarus hocam, yukarıdaki yazdığım komutta döngü 900 değilde 700 kere dönderince sorun olmuyor. Bunu yeni farkettim, tabi bu visual c++ için geçerli. Normal mingw de böyle bir sorun yok normal çalışıyor. Bence ramde cirit atmak için kernel moda geçmeye gerek yok çünkü ramdeki değerleri okuyup gösteren hacker programları olduğunu biliyorum, bunlar erişiyorsa biz de erişiriz.

String fonksiyonları bellekle ilgili güvenlik açıklarına neden olabilirler (taşma gibi). Bu nedenle bu fonksiyonların dizi boyutunu da parametre olarak alan verisyonlarının sonunda _s takısı var, bu "s" "safe" yani güvenli kelimesinden geliyor.

Gökhan BEKEN

Bu arada bişey farkettim, güvensiz moda geçince, scanf komutu kullanabildim ama cout komutunu tanımaz oldu.
Özel mesaj okumuyorum, lütfen göndermeyin.

Icarus

Alıntı yapılan: meftun - 18 Haziran 2013, 11:25:30
@Icarus hocam, yukarıdaki yazdığım komutta döngü 900 değilde 700 kere dönderince sorun olmuyor. Bunu yeni farkettim, tabi bu visual c++ için geçerli. Normal mingw de böyle bir sorun yok normal çalışıyor. Bence ramde cirit atmak için kernel moda geçmeye gerek yok çünkü ramdeki değerleri okuyup gösteren hacker programları olduğunu biliyorum, bunlar erişiyorsa biz de erişiriz.
Yok yine erişemiyorsunuz, ama henüz olayı fark etmediniz. Keşke sorunuzun basit bir cevabı olsaydı.
Intel'in yazılım geliştirme el kitapları
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
Ve Tanenbaum'un klasik eseri.
http://www.amazon.com/Modern-Operating-Systems-3rd-Edition/dp/0136006639

Özetle konunun 2 sorunu var
1.Protected Mode: Siz sadece 100MB ram'i olan bir pc'de bir programı çalıştırdığınızda virtual memory'ı yapısından dolayı program kendini 4GB'lık hafızada ve sadece kendi varmış gibi görüyor. Gerçek ram adreslerine asla erişemiyor ve hatta 2GB'lık sınırın ötesine kernel çağrıları yapıyor. Protected Mode nedir ? Nasıl çalışır ? Intel'in manuallerine bakın.

2. Portable Executeable Mimarisinden Kaynaklı: Siz C'de şöyle kod yazarsanız
int Hello(int a)
{
int b;
...
}
...
Hello(1);
Geri_Donus_Noktası:

Hello'u çağırdığınzıda parametre değişkeniniz 1, geri dönüş adresiniz "Geri_Donus_Noktası", Stack'a yazılır. Hello aynı zamanda ufak local değişkenleri içinde stack'i kullanır.
Siz kodunuzdaki b'nin adresinden itibaren okumaya başlarsanız stack'i okursunuz. Kod hafızasını değil, yada değişkenlerin tutulduğu hafızayı değil
Ama ben böyle yapsaydım
char *p = VirtualAlloc(NULL,  0x1000, MEM_COMMIT);

Gerçekten p 'için page table'da minimum page size'lık bir ram bölgesi tanımlanmış olurdu fakat tabii yine ram'in kaçıncı byte'i bilemezdim.

Peki neden mingw şöyle oluyorda, vc++'da böyle oluyor ?
Stack büyüklüğünü PE Header'lardan değiştirebilirsiniz veya .code, .data. .data? sectionlarını birleştirebilirsiniz vb... vb..
Daha fazla bilgi için
http://www.delphibasics.info/home/delphibasicsarticles/anin-depthlookintothewin32portableexecutablefileformat-part1