23 Kasım 2015 Pazartesi

tcpdump

Giriş
wireshark, tcpdump windowsta wincap, unix'te ise libpcap (packet capture) kütüphanalerini kullanıyorlar.

tcpdump komutu
tcpdump komutu yazısına taşıdım

iptables
iptables firewall olarak kullanılır. Durdurmak için şöyle yaparız
service iptables stop
Şöyle de yapabiliriz.
/etc/init.d/iptables stop
Tablolar nelerdir
iptables'da tablolar vardır. Her tabloya ait kavramsal bazı zincirler vardır. Tablolar şunlar
Filter Table,
NAT Table
Mangle Table,
Raw Table.

Zincirler nelerdir
Tablolarda şu zincirler vardır
Filter Table -> INPUT , OUTPUT, FORWARD
NAT Table -> PREROUTING, POSTROUTING, OUTPUT
Mangle Table -> PREROUTING, OUTPUT, FORWARD, INPUT, POSTROUTING
Raw Table -> PREROUTING, OUTPUT

Makinemize gelen bir paket şu zincirleri izler.
PREROUTING --> INPUT --> OUTPUT --> POSTROUTING

Eğer paket iletilecekse şu zinciri izler
PREROUTING --> FORWARD --> POSTROUTING

İşlem sırası
Şöyledir

                                   RAW
                                PREROUTING

                                    |

                                  MANGLE
                                PREROUTING

                                    |

                                   NAT
                                PREROUTING

                                    |

                                 ROUTING
                                 KARARI

                                    |
                -----------------------------------------
                |                                       |

              MANGLE                                  MANGLE
              INPUT                                   FORWARD

                |                                       |

              FILTER                                  FILTER
              INPUT                                   FORWARD

                |                                       |
                                                        |
              LOCAL                                     |
              İŞLEM                                     |
                                                        |
                |                                       |
                                                        |
             ROUTING                                    |
             KARARI                                     |
                                                        |
                |                                       |
                                                        |
               RAW                                      |
              OUTPUT                                    |
                                                        |
                |                                       |
                                                        |
              MANGLE                                    |
              OUTPUT                                    |
                                                        |
                |                                       |
                                                        |
               NAT                                      |
              OUTPUT                                    |
                                                        |
                |                                       |
                                                        |
              FILTER                                    |
              OUTPUT                                    |
                                                        |
                |                                       |
                |                                       |
                -----------------------------------------
                                    |

                                 MANGLE
                               POSTROUTING

                                    |

                                   NAT
                               POSTROUTING


Mangle Tablosu
mangle tablosu ile gönderilen paketlerdeki ip alanları değiştirilebilir.
iptables -t mangle -A OUTPUT -p icmp -j DSCP --set dscp 8
Nat Tablosu
Kendi makineme gelmeyen paketleri ethernet promiscous modda alabilirim. Ping komutuna cevap vermek için PREROUTING aşamasında NAT ile gelen paketlerin destination adresleri 192.168.122.1 yapılır.
iptables -t nat -A PREROUTING -i eth0 -j PNAT --to 192.168.122.1.
80. portu başka porta yönlendirmek için şöyle yaparız.
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
192.168.212.21'e gelen UDP paketini, 192.168.215.46'y yönlendiren bir başka örnek

iptables -t nat -A PREROUTING -d 192.168.212.21 -j DNAT
         --to-destination 192.168.215.46
Input Tablosu
İçeriden giden bağlantıya izin vermek için şöyle yaparız. Dışarıdaki sunucu benim bağlantımı kabul ettiği için bana Established TCP paketleri gönderecektir. Bu paketleri kabul ederek bağlantı kurulmasına izin veririm.
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
Gelen bazı TCP paketlerini drop etmek için şöyle yaparız.  Bazı paketlerin %1 oranında düşürerek kötü bir bağlantıyı taklit edebiliriz.
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
Gelen bağlantıya izin vermek için şöyle yaparız.
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

Seçenekler ve Anlamları
-A append
Belirtilen zincire ekleme yapar

-i interface
Kuralın geçerli olduğu arayüzü belirtir.

-j
Pakete ne yapılacağı belirtirir. Accept, Drop bazı seçenekler.

-m module
Hangi modülün kullanılacağını belirtirim. state ve statistic modülleri mevcut.

iptables kaydetme
Yapılan değişiklikler şöyle kaydedilir.
iptables-save > /etc/sysconfig/iptables
Şöyle de kaydedebiliriz.
/etc/init.d/iptables save


19 Kasım 2015 Perşembe

HQL (Hibernate Query Language)

Hibernate ile kullanılan sorgulama dili Hibernate Query Language (HQL). Ayrıca Criteria Query ya da Native SQL ile sorgulama yapmak ta mümkün.

HQL ve Birincil Önbellek

HQL ile sorgulama yapılırken hibernate birinci kademe önbelleği kullanır. Klasik SQL ile sorgu yapılırken birinci kademe önbellek kullanmamaktadır. Bu durumu anlatan şekil burada.


HQL ve Sorgulama Parametreleri

HQL ile sorgulama yaparken sorgunun içine "?" veya ":parametreismi" formatında değişken alanlar vererek, dışarıdan dinamik sorgu parametreleri kullanmak mümkün.

Sorgu içindeki alanların değerleri Query sınıfının setParameter(int position,Object val) veya setParameter(String name,Object val) metodu ile kullanarak atanabilir.

1. Pozisyon Kullanımı - Positional Parameter
Parametre değeri yerine soru işareti karakteri koyarız. Daha sonra setString, setParameter gibi metodlarla değeri atarız.

setParameter için şöyle örnek
Query query = session.createQuery("from ... where x > ?");
query.setParameter(0, value);
setString için şöyle örnek
Query hqlQuery = session.createQuery("from Orders as orders where orders.id = ?");
List results = hqlQuery.setString(0, "123-ADB-567-QTWYTFDL").list();

2. İsim Kullanımı - Named Parameter
Parametre değeri yerine : karakteri ile başlayan bir isim koyarız. Daha sonra setString, setParameter, setLong gibi metodlarla değeri atarız.

setParameter için örnek.
Query query = session.createQuery("from ... where x between :f1 and :f2 ");
query.setParameter("f1", fromDate );
query.setParameter("f2", toDate);
setLong için örnek
Query query = session.createQuery("from Emp as emp where emp.inc > :incentive");
List results = query.setLong("incentive", new Long(10000)).list();

3. İsim Listesi - Named Parameter List
setParameterList metodunu kullanırız. Mesela "in clause" kullanılmak istenirse, named parameter atamak gerekiyor. Örnek Spring hibernate template list as a parameter sorusunda görülebilir.
this.getHibernateTemplate() 
      findByNamedParam("select distinct ci.customer " + 
             "from CustomerInvoice ci " + 
              "where ci.id in (:ids) ", "ids", ids); 
Bir başka örnek ise aşağıda. Bu örnekte setParameterList() metoduna geçilen verinin int değil Integer olması gerektiğine dikkat etmek lazım.
Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    Query query = session.createQuery(DELETE_NEWS_BY_ID);
    query.setParameterList(ID, Arrays.asList(idList));
    query.executeUpdate();
    session.getTransaction().commit();
Örnekte bir string listesi için arama yapılıyor.
List items = new ArrayList(); 
items.add("book"); items.add("clock"); items.add("ink");
List results = session.createQuery("from Cart as cart where
 cart.item in (:itemList)").setParameterList("itemList", items).list();
4. Java Bean
Verilen nesnenin getter() metodları kullanılır. Örnekte getName() ve getAuthor metodlarının olduğu varsayılıyor.
Query hqlQuery = session.createQuery("from Books as books where book.name = :name
 and book.author = :author");
List results = hqlQuery.setProperties(javaBean).list();
5. Native SQL
Şöyle yaparız.
Query sqlQuery = session.createSQLQuery("Select * from Books where author = ?");
List results = sqlQuery.setString(0, "Charles Dickens").list();

HQL ve uniqueResult
Örneği buradan aldım. Tek bir sonuç gelecekse bu uniqueResult metodu kullanılabilir.
Query query = session.createQuery("from MasUser as m where m.userName = 'test' ");
MasUser masUser = (MasUser) query.uniqueResult();

18 Kasım 2015 Çarşamba

Dosyanın Büyüklüğünü Bulma

Dosyanın Büyüklüğünü Bulma
Dosyanın büyüklüğü bulunurken dosyayla ilişkili metadata sonuca dahil edilmez. Metadata diskte ayrı bir alanda saklanmaktadır.

Java
File file = new File (path);
file.length ();  
C#
new FileInfo  (path).Length;
C
struct stat file;
stat("path"&file);
printf("%d",stat.st_size);
Burada dikkat edilmesi gereken nokta st_size alanının signed int olarak tanımlı olması.
Eğer dosya açılmış ise lseek ile de dosyanın büyüklüğü bulunabilir. lseek (long seek) anlamına geliyor.
// Get size.
off_t size = lseek(fd, 0, SEEK_END);
// Seek back to the beginning.
lseek(fd, 0, SEEK_SET);

QT
QFile newFile("C:/Users/testfile");
newFile.size();

Win32
Win32 zengin bir API sunuyor
.
GetFileSizeEx
Örnek ver

GetFileAttributesEx
Örnek ver

GetFileInformationByHandle
Eğer dosya başka bir uygulama tarafından kullanılıyorsa bile boyunu alabilmemizi sağlar.
ULONGLONG filesize = 0; 
HANDLE h = CreateFile(filename, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 
    NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
if (h != INVALID_HANDLE_VALUE)
{ 
    BY_HANDLE_FILE_INFORMATION info;
    memset(&info, 0, sizeof(BY_HANDLE_FILE_INFORMATION));
    if (GetFileInformationByHandle(h, &info)) 
    { 
        ULARGE_INTEGER ul = { 0 };
        ul.LowPart = info.nFileSizeLow; 
        ul.HighPart = info.nFileSizeHigh;
        filesize = ul.QuadPart; 
    } 
    CloseHandle(h); 
} 
FindFirstFile
Şöyle yaparız.
WIN32_FIND_DATA ffd;
HANDLE hfind = FindFirstFile(filename, &ffd);
if (hfind != INVALID_HANDLE_VALUE)
{
    DWORD filesize = ffd.nFileSizeLow;

    //for files larger than 4GB:
    ULARGE_INTEGER ul;
    ul.LowPart = ffd.nFileSizeLow;
    ul.HighPart = ffd.nFileSizeHigh;
    ULONGLONG llfilesize = ul.QuadPart;

    FindClose(hfind);
}






17 Kasım 2015 Salı

Console Metodları

Windows
Grafik Arayüzü Kullanan Uygulamalar
Windows'ta TTY kavramı yok ancak ben yine de  farkı göstermek için yazmak istedim.
Windows'ta başlatılan grafik programı konsol (TTY sayılabilir) ile ilişkilendirilmiyor. cout , printf ile yazılan metinler Visual Studio'nun Output penceresinde görülebilir ancak normal çalışmada kaybolur.

Gösterilmek istenirse uygulama içinden bir konsol başlatmak gerekir. Windows kapsamlı bir Console Functions kütüphanesi sunuyor.

Win32
GetStdHandle
Konsol handle alınır.
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
ShowWindow
Konsol penceresi şöyle büyütülür.
#include<windows.h>

using namespace std;

int main()
{
    system("color 0B");
    ShowWindow(GetConsoleWindow(), SW_MAXIMIZE);
    ...
}
SetConsoleTextAttribute - Renkli Çıktı
Şöyle yapılabilir.
int setColor(const int foreground, const int background)
{
    int Color = foreground + (background * 16);
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, Color);

    return 0;
}
WriteConsole
Konsola metin yazar.

C#
Console Metodları yazısına taşıdım.

CreateEvent

Yaratma
Event şöyle yaratılır.
HANDLE hEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr); 
Bekleme
Event üzerinde şöyle bekleriz.
WaitForSingleObject(hEvent, INFINITE);
Tetikleme
Event şöyle tetiklenir.
SetEvent(hEvent);

Tam çalışan bir örnek
Örnekte thread event'i tetikleyinceye kadar bekleniyor.
class Service {
    HANDLE hThread;
    HANDLE hEvent;
    HWND   hWindow;
};

void Service::start() {
    // create event
    hEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr); 

    hThread = CreateThread(...); // creates window and goes on to message loop

    // wait for window
    WaitForSingleObject(hEvent, INFINITE);
    CloseHandle(hEvent);
}


void thread_function(...)
{
    // create window, etc

    // signal parent to continue
    SetEvent(hEvent);
}








Windows ve Linux Servisleri

Windows  Servisleri

Windows servisleri her zaman kafamı karıştırmıştır. Önemli bulduğum bazı notları aşağıya ekliyorum.

Servisleri Kontrol Etmek
sc komutu yazısına taşıdım.

Hesap İsimleri
Windows servisleri 3 tane hesap altında çalışabilir. LocalSystem en fazla hakka sahip olandır.

  • LocalService
  • NetworkService
  • LocalSystem


LocalSystem Hesabı
Bu hesap işletim sistemi kurulumuyla gelir. Servis Yöneticisi tarafından kullanılır. GUI'si olan bir hesap değildir. Buradaki örnekte DropBox'ın LocalSystem hesabı tarafından başlatılması gösteriliyor.

Başka Bir Hesapmış Gibi Çalıştırmak
Kısaca runas diye tabir edeceğim işlemi yapmak için bazı öneriler burada.

Bazı Servisler

RPC (Remote Procedure Call/Uzaktan Yordam Çağrısı)
RpcSs (Remote Procedure Call System Service). Bu servis bir çok servisin iletişim için ihtiyaç duyduğu temel bir dayanak noktası. Bu servise bağımlı olan servislerin listesini What is RPC başlıklı yazıda bulabilirsiniz.Aşağıdaki yazıyı da Service overview and network port requirements for the Windows Server system başlıklı yazıdan aldım.

Remote Procedure Call (RPC)

The Remote Procedure Call (RPC) system service is an interprocess communication (IPC) mechanism that enables data exchange and invocation of functionality that reside in a different process. The different process can be on the same computer, on the LAN, or in a remote location, and can be accessed over a WAN connection or over a VPN connection. The RPC service serves as the RPC endpoint mapper and Component Object Model (COM) Service Control Manager. Many services depend on the RPC service to start successfully.

System service name: RpcSs
Application protocolProtocolPorts
RPCTCP135
RPC over HTTPSTCP593
NetBIOS Datagram ServiceUDP138
NetBIOS Name ResolutionUDP137
NetBIOS Session ServiceTCP139
SMBTCP445
w32time
Sistem saatini sunucu ile senkronize eden servis.

Linux Servisleri

chkconfig
chkconfig komutu yazısına taşıdım.

service komutu
Servisi durdurma
service [service_name] stop
Yeniden başlatma
service [service_name] restart
Durumunu öğrenme
service <service-name> status
Aslında aynı işlemi direkt service'in kendisini de kullanarak yapabiliriz. service komutunun bir avantajı var mı bilmiyorum. Şöyle yapabiliriz.

/etc/init.d/mysql  stop
/etc/init.d/mysql  start

Hesap İsimleri
Linux servisleri de Window'takiler gibi farklı isimlere sahip olabilirler. /bin/false ile yaratılan servis hesapları interaktif değildirler. Yani bu hesaplar login olamazlar.