SOCKET PROGRAMLAMAYA GİRİŞ

Slms,

    Ben Turkish Scene’nin yeni yazarlarındanım. Önce bu yazının ve süregelecek yazılarımın amacını anlatayım: Bu sayıyla birlikte 6 aylık bir yazı dizisine başlıyacağız. Bu yazı dizisinin amacı “C” programlama dili bilen (orta derecede de olsa) kişilere winsockun nasıl kullanılabileceğini göstermek olacak. Yazı dizisi sonunda dizimizi baştan itibaren izleyen herkesin yeni exploitlere (sistem açıkları)
göre Nuke yazabilecek seviyeye gelmiş olacağını tahmin ediyorum.
Yazı dizimizin detaylı içeriği şu olacak:

Ay Konu Yazılacak programlar
Mart ( Bu ay :) Winsock ve BC++ Builder üzerine Winsock hakkında bilgi veren prg.
Nisan Soketler ve İstemci yazımı Portscanner ve OOB-Nuke
Mayıs IP,TCP Headerları ve IP-Spoofed bilgi yollama !Spoofed! OOB-Nuke
Haziran Sistem Açıkları Land atack
Temmuz Sistem Açıkları Suffer atack
Ağustos Sistem Açıkları ve Son söz Smurf atack

Not: Umarım “Smurf,Suffer,Land,OOB Nuke” ne demektir biliyorsunuzdur. Bilmiyenler için bunlar piyasada bulunan windozcu IRC manyaklarının korkulu rüyaları olan Nukeler!

    İlk yazımız daha çok bir hazırlanma yazısı olacak. Lütfen yazının tamamını dikkatle okuyun. Burada anlattıklarım BC++ Builder ( ki yazı dizimizi takip edebilmek için buna, en azından sürüm 1.0 ihitiyaç duyacaksınız ) ve winsock üzerine genel söylemler olacak. Eğer Nuke yazma konusunda ilerlemek istiyorsanız temellerinizi iyi atmanızı öneririm.

Şimdi neden BC++ Builder diye soranlara şöyle bir cevabın olacak:

  1. Windoz altında iki pencere 3 edit box açmak için neden kıçımı yırtim ki? Bunu visual olmayan bir dille yapmak bence çok gereksiz. Hele ki böyle bir alternatifi varken!!!
  2. Neden delphi değil diyenlere ise kısa bir cevap: bu insanın kulağını ters eliyle göstermesi gibi bir şey!

!!! ÖNEMLİ ÖN BİLGİ !!!:

    Internet bir bağlantıyı en kısa ve öz ve temel olarak (hani madde-atomun ilişkisi gibi ;) tanımlamak için Kaynak IP,Kaynak Port,Hedef IP,Hedef Port olarak tanımlayabilirsiniz! Sanırım bu tanımlamada herkes kaynak IP ve hedef IP’nin ne olduğunu biliyor. Peki Kaynak ve hedef port nedir??? Bunu da biliyorsanız işimiz kolay. Bilmeyenler içinse kısa açıklama: Tcp/Ip protokolünde (internet protokol ailesi) bir bilgisayarla diğer bilgisayarın veri alışverişini düzenlemek için veri yolu kanallara (65536 tane-2 bayt ) ayrılmıştır. Bunlara port denir. Sakın yanlış anlaşılmasın bu portlar fiziksel değildir! Sadece bağlantıların sınıflandırılması için kullanılan sayılardır! Bu tanımlamalar biraz kaba olsada sanırım açıklayıcı oldu. Olayı daha rahat anlamanız için bir iki örnek vereyim.

    Örneğin “Bo” programıyla birinin bilgisayarına hop diye girmezsiniz. Bilgisayarına gireceğiniz hedef kişide “Boserver” programının çalışması gerekir. “Boserver” programı çalışınca configüre edildiği (normalde 31337 ) portu açar. Ve o porttan gelecek bilgileri dinlemeye başlar!!! “Bogui” ile bu portu açık bilgisayarları ararsınız. Bu yüzden “bugui” kullanıp hedef bilgisayar taraması yaptığınızda bazen hiç bilgisayar bulamamanızın nedeni aradığınız IP aralığında nete bağlı hiçbir bilgisayar olmaması değil bu bilgisayarlarda “boserver”ın çalışmamasıdır.

    Bir diğer örnek ise bilgisayarınıza bir web server kurduğunuzda, o web server 80. Portu açar ve browserlardan gelecek çağrılara browserın anlayacağı şekilde yanıt verir ( zor bir olay değil ;). Umarım port konusu anlaşılmıştır.

    Şimdi de açık olan portlarımızı görelim: bunun için Msdos penceri açıp “netstat –a” yazmanız yeterli. LISTENING yazanlar dışarıdan sizin bilgisayarınıza bağlantı yapılabilecek portlar.

Örnek çıktı:

TCP  Wargalleon:1027 WARGALLEON:0 LISTENING
TCP Wargalleon:ftp WARGALLEON:0 LISTENING
TCP Wargalleon:telnet WARGALLEON:0 LISTENING
TCP Wargalleon:808 WARGALLEON:0 LISTENING

Bu çıktıya göre ftp(21),telnet(23),808,1027 portlarınız açık (wingate yüklemek zorunda kaldım! ;). Sanırım bukadar teorik bilgi yeter. Gelelim BC++ Builder’a.

    BC++ Builder gerçekten çok güçlü ve bir o kadar da kolay kullanımlı bir geliştirme aracı. Yazımın uzamaması için BC++ Builder’ın arabiriminin anlatılması kısmını olabildiğince hızlı geçeceğim. BC++ Builder açılınca yeni projeye açın (File|New Application). Karşımızdaki boş formun üzerine "Standart" birleşenlerden ()5 adet label () nesnesi ve karşılarına 5 adet Edit () nesnesi koyup aşşağıda görüldüğü şekilde “Caption” ve “Text” ayarlarını yapın. Bunu yapmak için ilgili iconlara basıp forma tıklamanız (ıyk) gereklidir. Sonrada iki tane button () alıp bunları forma yerleştirin. Bir tanesinin captionı “Bilgi Al” diğeri ise “Çıkış” veya benzeri bir şeyler olsun. Bir nesnenin caption,text vs özelliklerini değiştirebilmek yapmanız gereken şey nesneyi şeçtikten sonra F11 tuşuna basıp “object inspector” penceresini açmak ve bu pencerede istenilen özelliği bulup değiştirmektir. Normalde zaten bu pencere açıktır. Bazı özelliklerin her nesnede olduğunu bazılarının ise olmadığını göreceksiniz. Bunun sebebi her nesnenin kendisine ait özeliklerinin olmasıdır. Örneğin bir button nesnesinin “text” özelliği yoktur ama bunun yerine “caption” özelliği vardır.Son olarakta "Win95" bileşenlerinden bir adet  status bar alalım. Bunu formun en altına (otomatik olarak) yerleştirelim.

Şimdi gelelelim asıl yapmak istediğimize, bu ay winsocku hazırlayacağız (sanırım ingilizcesi "initialization" dı ). Eğer dos programcıları varsa BGIyı hatırlarlar. Bu da onun gibi, winsock ile ilgili soket açma, bağlanma gibi fonksiyonları kullanmadan önce winsocku hazır hale getirmeliyiz. Bunu yaparken birde winsock bilgilerini alacağız. Buda giriş dersimizin örnek programını oluşturacak. Yaptığımız "Bilgi Al" buttonuna çift tıklayıp (ıyk) yeni bir pencere açılmasını sağlayalım. Bu pencere buttona bastığımızda çalışacak fonksiyonun içidir. Tata!!! Hemen şunları yazalım:

WSADATA wsaInfo;                                                         // Winsock bilgileri burda tutulacak.
WORD GerekliVersiyon = MAKEWORD(1,1);            // Winsock için gerekli versiyon
char tmp1[10],tmp2[10];                                           // Lazım olur diye küçük bir buffer
      // Buraya kadar ilerde kullanacağımız değişkenleri tanıttık.
    if (WSAStartup( GerekliVersiyon, &wsaInfo ) != 0 )
    {
     // Winsock hazırlanamazsa hata mesajı yaz...
        StatusBar1->Panels->Items[0]->Text = "Winsock hazırlanamadı.";
    };
    // Buraya kadar WSAStartup ile Gerekli versiyonu (1,1) kontrol ettik, winsock ile ilgili bilgileri aldık
    // ve winsocku hazır hale getirdik! Hepsi bir komut! ---> WSAStatup!  :-)
    // Burası tamamen bana ait! Yaptığım wVersion ve wHighVersionu
    // anlamlı hale getirip Edit1'e yazmak.

    itoa( wsaInfo.wVersion-255, tmp1 , 10 );
    itoa( wsaInfo.wHighVersion-512, tmp2 , 10 );
    strcat( tmp1 , "," );
    strcat( tmp1, tmp2 );
    Edit1->Text = tmp1 ;
    // Bunlar basit header okuma...

    Edit2->Text = wsaInfo.szDescription;           // En önemli kısım üretim saatine kadar yazılmış.
    Edit3->Text = wsaInfo.szSystemStatus;     // Hangi sistem? W98'de W95 diyor :o(
    Edit4->Text = wsaInfo.iMaxSockets;            // Maximum Soket sayısı
    Edit5->Text = wsaInfo.iMaxUdpDg;             // Maximum UDP datagram boyutu
    WSACleanup();                                                  // Tamam işimiz bitti.

    Önemli bir şey yapmamız gerekiyor. Kullandığımız kütüphaneyi C++ derleyicisine söylemek. Bunu için  bütün bu satırları yazdığımız pencerede bir iki kez "pageup" tuşuna basıp

     //---------------------------------------------------------------------------
    #include <vcl\vcl.h>
    #pragma hdrstop

satırlarını (ilk satırlar) bulmak. Buraya

    #include <winsock.h>

satırını ekleyeceğiz. Böylece winsock başlık dosyasında tanımlalan komutları kullandığımızı belirtmiş oluyoruz. Son olarak form penceresine geri dönelim ve "Çıkış" buttonuna çift tıklayıp karşımıza çıkan fonksiyon penceresine

    Close();

yazalım. Böylece programımız bitti. Programı istediğiniz bir dizine istediğiniz isimle kaydedip (File|Save) çalıştırabilirsiniz (F9). Unutmayın C++ mükemmel bir dildir ve dikkat ister! Yazarken küçük büyük harf ayrımına dikkat edin. "//" işaretli kısımlar (sizinde anlıyacağınız gibi) açıklama kısımlarıdır yazmak zorunda değilsiniz.

Ders sonu hatırlatmalar:
1) Bu derste net programcılığı ile ilgili temel bilgiler öğrendiniz (umuyorum). Winsock programlamaya giriş yaptık. Winsock hakkında bilgi veren program yazdık.
2) C++ ve dersle ilgili sormak istediğiniz herşey için misoskian@bigfoot.com adresine email atabilirsiniz. Eğer gerçekten yoğun ilgi gelirse BC++ Builder'da programla derslerine başlayabiliriz.
Kaynak Proje     : wsbilgi.zip
Örnek program : wsbilgi.exe

Hazırlayan;
Misoskian : misoskian@bigfoot.com