wtorek, 21 lipca 2009

Polacy w ePolsce

Polityka nie jest tematem, który powinien gościć na tym blogu. Trudno jednak odmówić miejsca temu tematowi, jeśli w grę wchodzi MMO.

Natrafiłem na tę grę dzięki znajomemu i pierwotnie jak to ja podszedłem do niej sceptycznie. Ot znowu jakieś klikanie w przeglądarce, które pozornie przyniesie mi nieco korzyści w postaci rozrywki i budowania lichej więzi ze współplemieńcami jakiejś egzotycznej krainy targanej wiatrami odległej historii. Tym jednak razem czuję powoli, że nie miałem racji.

eRepublik jest grą tworzącą nieco inny rodzaj społeczności i więzi. Do świata gry politycznej, strategicznej, społecznej przeniesione są relacje społeczne świata rzeczywistego oparte na nacjach, narodowościach. Tutaj jednak znacznie łatwiej opowiedzieć się za którąś ze stron, a ponadto łatwo jest wziąć sprawy we własne ręce. Dostajemy w nie przecież narzędzia by czynić świat lepszym. Do dyspozycji mamy prasę, organizacje, partie polityczne i oczywiście wybory na wyższe i niższe stołki.

W świecie eRepublik (zwanym także eRep lub ER) dzięki wielu ułatwieniom wybory mogą odbywać się co miesiąc. O stałych datach obywatele przez 24h mogą iść do urny i oddać głos na swego kandydata. Nie każdy może stawiać krzyżyki, konieczne jest uzyskanie odpowiedniego poziomu, co odpowiada wiekowi w realu. Jednym się to podoba, innym nie, ale zyskujemy na każdym aktywnym graczu.

Pokrótki opis przeze mnie umieszczony nie koniecznie zachęci do eRepublik czytających. Pragnę tutaj wspomnieć o czymś, czego nie odczułem wcześniej w żadnej klikanej grze w przeglądarce. Mam tu na myśli żywą społeczność tworzącą więzi i stanowiącą aktywny organizm. Nie tylko istnieją relacje wewnątrz, ale także między narodowściami skutkujące paktami, sojuszami, a także oczywiście wojnami. W początkowej fazie gry, a w takiej właśnie jestem, nie ma wiele do roboty, więc można oddać się badaniu tekstów pisanych przez eObywateli w ramach eGazet, ale także na forach. Jest niesłychanie przyjemnym patrzeć jak to wszystko żyje. Polecam każdemu, komu nudzi się w realu tak na przykład przez pół godziny dziennie.

Jeśli nie podoba Ci się co dzieje się w realu, w politycznym burdelu, możesz zawsze zaczynając od prostego robola dojść do prezydentury pełnej sukcesów. eObywatele ePolski aktywnie uczestniczą w życiu politycznym, nie raz są świadomi swojej działalności, ale co wydaje się na codzień nieprawdopodobne swojej tożsamości narodowej i są w stanie jej bronić. Zachęcam do zwiedzenia tego świata. Nie naganiam, nie ciągnę na siłę. Wydaje mi się jednak, że większość inteligentnych znajdzie coś dla siebie w tym świecie.

EDIT:
Do tekstu dodane zostały reflinki. W ten sposób każdy nowozarejestrowany przez ten post, otrzyma należytą pomoc na starcie z mojej strony.

środa, 15 lipca 2009

Sieć na nasłuchu

Sieci komputerowe wymagają nadzoru. To nie podlega dyskusji. Nie chodzi jednak wyłącznie o nadzór techniczny. Niestety użytkownicy pozostawieni sami sobie są przyczyną wielu zagrożeń dla infrastruktury sieci, ale i bezpieczeństwa jej składowych. Jednym z głównych zagrożeń jest dostęp do nieautoryzowanych zasobów sieci www. W sieciach korporacyjnych dostęp do takich danych należy blokować, ale co robić w sieci domowej?

Jeśli w sieci istnieje brama domyślna zbudowana z jakiegoś PC, co jest bardzo dobrym rozwiązaniem, to możliwe jest kontrolowanie ruchu wychodzącego z sieci do i ze świata zewnętrznego. Przyjrzyjmy się na początek możliwościom nasłuchu, a nie samej kontroli ruchu.

Początkowo można polegać na różnych narzędziach dostępnych w sieci. Często jednak niestety są to kombajny wymagające sporej mocy obliczeniowej, albo wiedzy administratora. Prędzej czy później okazuje się, że do prowadzenia logów potrzebne są prostsze narzędzia.

Początkowo przydatny jest Wireshark (wspominany już wcześniej). Niestety to właśnie taki niewygodny kombajn. Nie tylko, że wymaga nieco wiedzy, to zbierane logi potrafią zajmować setki megabajtów, pomimo że zawierają całą masę zbędnych nam śmieci. Potem można zacząć szukać jakiś kompaktowych rozwiązań. Przyznam szczerze, że ja osobiście nic nie znalazłem.

Do stworzenia kodu, który zaprezentuję nakłonił mnie znajomy, albo może raczej zainspirował. Zaczęło się od zwykłego pytania "czy i jak można sprawdzać odwiedzane przez domowników strony www?". Sięgnąłem do swojej aktualnej wiedzy i stworzyłem DNSLogger. Wstępnie jest to aplikacja we wczesnej fazie alpha, która jeszcze nie powinna być szeroko stosowana. Z założenia działa, ale nie przeprowadziłem wystarczających testów.

Aplikacja składa się obecnie z dwóch klas. Jedna to już dość standardowy main, a druga to handler do przechwytywania pakietów. Nie znam się za bardzo na ukrywaniu programów w systemie. W C/C++ byłoby to stosunkowo proste, aczkolwiek w języku Java... Pojęcia nie mam gdzie nawet szukać. Pomysł jest jednak proszy. Wystarczy odwołać się do wiedzy o Swing i okienkach z niego. W ten sposób można dodać dość łatwo ukrytą aplikację i to głównie się dzieje w klasie Main.

klasa Main:
import java.io.IOException;

import javax.swing.JFrame;

import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.NetworkInterfaceAddress;
import jpcap.PacketReceiver;
import handler.dnsPacketReceiver;

public class Main
{

  static JpcapCaptor cap;
  static PacketReceiver rec;

  /**
   * @param args
   */
  public static void main(String[] args)
  {

    JFrame hid=new JFrame(\"SSERVICE\");
    hid.setVisible(false);
    hid.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    hid.setFocusable(false);
    hid.setEnabled(false);
    NetworkInterface[] devices = JpcapCaptor.getDeviceList();
    int index=0;
    if(args.length<1)

    {
      System.out.println(\"usage: java Main <eth nr>\");
      
      for (int i = 0; i < devices.length; i++) {

        System.out.println(i+\" :\"+devices[i].name + \"(\" + devices[i].description+\")\");
        System.out.println(\"    data link:\"+devices[i].datalink_name + \"(\"

            + devices[i].datalink_description+\")\");
        System.out.print(\"    MAC address:\");
        for (byte b : devices[i].mac_address)
          System.out.print(Integer.toHexString(b&0xff) + \":\");

        System.out.println();
        for (NetworkInterfaceAddress a : devices[i].addresses)
          System.out.println(\"    address:\"+a.address + \" \" + a.subnet + \" \"

              + a.broadcast);
      }
    }
    else
    {
      try {
        index=Integer.parseInt(args[0]);
        cap = JpcapCaptor.openDevice(devices[index], 2000, false, 20);
        rec=new dnsPacketReceiver();

      }
      catch (NumberFormatException e) {
        e.printStackTrace();
      }
      catch (IOException e){
        e.printStackTrace();
      }
      cap.loopPacket(-1, rec);
    }
  }

}

Klasa dnsPacketReceiver jest znacznie bardziej istotna. Jej zadaniem jest przechwycenie wszystkich pakietów protokołu UDP i z tych kierowanych na port 53 zapisanie do plików logów treści zapytania. Logi są podzielone na foldery wg IP i na pliki wg dat. W każdym pliku jednemu zapytaniu odpowiada wiersz z zapisanym czasem wysłania zapytania. Problemem może być tutaj tworzenie nowego pliku wg nowej daty. Jest to fragment jak dotąd nieprzetestowany.

klasa dnsPacketReceiver:
package handler;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import jpcap.PacketReceiver;
import jpcap.packet.Packet;
import jpcap.packet.UDPPacket;

public class dnsPacketReceiver implements PacketReceiver 

{
  private String fname;
  private Date date;
  private Date sdate;
  private BufferedWriter wr;
  private SimpleDateFormat df;
  

  public dnsPacketReceiver()
  {
    date=new Date();
    sdate=new Date();
    df=new SimpleDateFormat(\"yyyy-MM-dd\");
    fname=df.format(date)+\".txt\";
  }
  
  public void receivePacket(Packet p)

  {
    String line=\"\";
    int dprt = 0;
    SimpleDateFormat ft=new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");
    date=new Date();

    if(p instanceof UDPPacket)
    {
      UDPPacket t=(UDPPacket) p;
      dprt=t.dst_port;
      if(dprt==53)
      {
        line+=ft.format(date)+\" \";
        line+=t.src_port+\" \"+t.dst_port+\"\\t\";

        line+=t.src_ip.getHostAddress()+\"\\t\"+t.dst_ip.getHostAddress();
        String tmp=\"\";
        for(int i=13;t.data[i]!=0;i++)
        {
          if(t.data[i]<0x10)
          {
            tmp+=\".\";
          }

          else
          {
            char c=(char) t.data[i];
            tmp+=c;
          }
        }
        line+=\"\\t\"+tmp;
        //System.out.println(line);
        //sprawdz czy istnieje folder log

        try
        {
        File tmp_f=new File(\"./log/\");
        if(!tmp_f.exists())
          tmp_f.mkdir();
        //sprawdz czy istnieje folder dla IP
        tmp_f=new File(\"./log/\"+t.src_ip.getHostAddress()+\"/\");

        if(!tmp_f.exists())
          tmp_f.mkdir();
        //sprawdz czy nie ma juz nowego dnia
        newName();
        //sprawdz czy istnieje plik z dana data

        File f=new File(\"./log/\"+t.src_ip.getHostAddress()+\"/\"+fname);
        if(!f.exists())
          f.createNewFile();
        //stworz writer
        wr=new BufferedWriter(new FileWriter(f,true));
        //zapisz do pliku

        wr.write(line+\"\\n\");
        //zamknij plik
        wr.close();
        }
        catch (IOException e)
        {
          e.printStackTrace();
        }
        
      }
      else
        return;

    }
    else
      return;
  }
  
  private void newName()
  {
    Date tmp;
    tmp=new Date();
    SimpleDateFormat f=new SimpleDateFormat(\"dd\");

    int d1=Integer.parseInt(f.format(sdate));
    int d2=Integer.parseInt(f.format(tmp));
    
    if(d2-d1!=0)
    {
      sdate=tmp;
      fname=df.format(sdate)+\".txt\";
    }
  }
}

Aplikacja wymaga przy starcie podania numeru karty, na której prowadzony jest nasłuch. W najbliższym czasie wprowadzę pewne poprawki i udogodnienia. Gdy bliżej poznam się z filtrami z wireshark pozwolę sobie na dodanie ich do opcji aplikacji. Opcje zapisywania logów też się oczywiście przydadzą, więc i nimi trzeba się zająć.

Będę wdzięczny za wszelkie sugestie do tego kodu. W przyszłości przychodzi mi też do głowy opcja sterowania programem zdalnie przez Java RMI przykładowo i opcje statystyki logów dostępne zdalnie. To wszystko jest jednak nieco poza zasiegiem na najbliższy czas. Mam nadzieję, że ten pomysł i jego wykonanie przypadnie komuś do gustu.

Przechwytywanie pakietów odbywa się w trybie promicuus. Oznacza to, że może zostać odkryta przez innych użytkowników sieci. Brama domyślna nie może jednak być podejrzana. Zaawansowane działania sieciowe to jej zadanie ;).

środa, 1 lipca 2009

S.E.S.J.A.

Witam serdecznie po drobnej przerwie. Pragnę przekazać słowa otuchy wszystkim studentom, którzy mają pecha męczyć się jeszcze ze swoimi profesorami na egzaminach i zaliczeniach.

Już teraz informuję, że w okresie wakacji na cały miesiąc znikam z kraju kwitnącej korupcji, tak więc blog nie znowu nie będzie za często aktualizowany.

Drodzy bracia studenci, pamiętajcie, że kampania wrześniowa nie jest przekleństwem, a potrafi być nawet miłym gestem ze strony profesora. Są tacy co robią poprawki już w lipcu. Na otuchę do tego posta załączony jest miły studencki rebus. Dorzucam też emotsową wersję rebusu. Swoją drogą prędzej czy później trzeba będzie wydać pakiet emotsów, tak aby każdy mógł go sobie dodać do Kadu, albo Pidgina. To jednak bardzo odległa przyszłość.

Podzielę się z wami jeszcze moimi przemyśleniami na temat matur i przyszłości osób otrzymujących te wyniki. W prawdzie to temat numer jeden na prawo i lewo rozsiany po serwisach, ale jest mi w pewien sposób bliski. Jako student uczelni technicznej i przyszły jej adept już teraz muszę orientować się na rynku pracy. Prędzej czy później straszyć zaczyna perspektywa nasycenia branży z powodu innych absolwentów, szczególnie tych młodszych. Po przejrzeniu wyników matur, a wcześniej zadań maturalnych nie jestem za specjalnie przejęty tą perspektywą. Nie tylko, że nie zagrażają mojej pozycji na rynku pracy, ale jeszcze sami będą w stanie dostarczyć mi nieco pracy. Nie mówię tutaj, że ludzie są "głupi", ale poziom nauczania obniżył się tak bardzo, że widać już chyba dno gdzieś w pobliżu.

Niektórzy prawdopodobnie wiedzą, że w wolnych chwilach zajmuję się pomocą programistyczną dla studentów. Skoro programowanie to moja pasja, a ktoś nie ma czasu, zdolności, talentu etc. do napisania jakiegoś kodu, to może dostać go ode mnie z opisem pozwalającym na zaliczenie. W końcu pieniądz jest miarą pracy i czasu. Możemy się wymienić czasem. Będzie trzeba po wakacjach ogłosić gdzieniegdzie tą informację, aby jeszcze dorobić nieco zanim zakończę edukację an WAT. Polecam takie podejście innym obecnym studentom. Skoro utrzymujemy się na studiach, to możemy pomóc kolejnym rocznikom, aby poziom nauczania nieco się podniósł. Taka praca u podstaw ;).

Obrazek pochodzi ze strony Quiat Tuberkulozy.