poniedziałek, 13 czerwca 2016

SimpleHTTPServer

Mając do dyspozycji język Python możemy szybko uruchomić serwer www udostępniający pliki w sieci LAN. W systemie Linux, pythona mamy już zainstalowanego. Pod Windows musimy go doinstalować; tak samo na Androida mamy np. QPython . Dzięki temu udogodnieniu możemy wymieniać pliki pomiędzy różnymi urządzeniami (systemami operacyjnymi) np. możemy szybko przesłać zdjęcie z telefonu na komputer bez używania kabla USB lub czytnika kart pamięci.

Aby uruchomić serwer www udostępniający pliki wydajemy następujące polecenie:

Linux, Windows (Python 2.x):

python -m SimpleHTTPServer 5888

Linux, Windows (Python 3.x):

python -m http.server 5888 

Android (QPython 3.x, tylko interpreter poleceń):

>>> import os
>>> os.system("python -m http.server 5888")

Po wydaniu powyższych poleceń udostępniana jest zawartość katalogu, w którym polecenie python -m ... zostało wykonane. Aby zobaczyć pliki z tego katalogu na kliencie trzeba uruchomić dowolną przeglądarkę www i w pasku adresu wpisać:

http://adres_ip_hosta:5888

np.

http://192.168.0.15:5888

5888 - numer portu, na którym została uruchomiona usługa www. Uruchomienie serwera www na porcie 80 (zakres 0-1023; porty systemowe Uniksa) wymaga uprawnień root-a.

wtorek, 17 maja 2016

Test programów antywirusowych

W serwisie www.virustotal.com można przesłać dowolny plik w celu przeskanowania go online przez ponad 50 programów (silników) antywirusowych pod kątem złośliwego oprogramowania.

Wykorzystując ten serwis stworzyłem prosty test skuteczności różnych programów antywirusowych dla wirusa testowego EICAR, który został stworzony przez Europejski Instytut Badań Wirusów Komputerowych (ang. European Institute for Computer Antivirus Research, EICAR) - www.eicar.org . Testowy wirus nie czyni żadnych szkód, jest to po prostu ciąg znaków, który wykryty przez program antywirusowy spowoduje wyskoczenie okienka z komunikatem o znalezionym wirusie. Kod pliku EICAR wygląda tak:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Powyższy ciąg znaków można zapisać do pliku .com, .bin, .txt lub dowolnego innego i testować skuteczność ochrony antywirusowej. Jeżeli ochrona działa w czasie rzeczywistym, to takiego pliku nie będzie się dało nawet zapisać na dysku. Można taki plik skompresować np. do archiwum .zip i sprawdzić czy antywirus radzi sobie z archiwami.

Test wykrywalności pliku EICAR przez różne antywirusy (VirusTotal):


Ja do swoich testów użyłem 9 różnych wariantów wirusa testowego EICAR. Wyniki testów i zrzuty ekranu z serwisu VirusTotal znajdują się w tabeli poniżej:

RODZAJ PLIKU TESTOWEGO EICAR PROCENT ANTYWIRUSÓW, KTÓRE WYKRYŁY ZŁOŚLIWY KOD WYNIKI (ZRZUTY EKRANU Z VIRUSTOTAL)
Czysty kod EICAR (oryginalny plik wirusa testowego EICAR) 96.4 % 01_plain.jpg
Plik testowego wirusa zakodowany Base64 27.3 % 02_base64.jpg
Plik testowego wirusa spakowany Zipem 87.5 % 03_zip.jpg
Plik podwójnie spakowany Zipem 82.1 % 04_zip-zip.jpg
Plik pięciokrotnie spakowany Zipem 75.0 % 05_zip-zip-zip-zip-zip.jpg
Plik spakowany programem 7zip 71.4 % 06_7zip.jpg
Dodany jeden bajt na początku pliku 37.5 % 07_a.jpg
Dodane 32 bajty na początku i na końcu pliku 14.3 % 08_b.jpg
Kod Eicar zaszyty w pliku LibreOffice Writer .odt 3.6 % 09_libre_office.jpg

Jak widać dwa antywirusy w ogóle nie wykrywają pliku testowego EICAR. Natomiast tylko dwa antywirusy znajdują ciąg EICAR zapisany w pliku .odt (LibreOffice / OpenOffice).

Test, który przeprowadziłem mówi nam jakie możliwości ma silnik antywirusowy tzn. czy wykrywa wirusa zakodowanego algorytmem Base64 lub wielokrotnie spakowanego itp. Jeżeli chodzi o ilość wykrywanych wirusów, robaków, trojanów i innych złośliwych tworów, to skuteczność zależy od baz sygnatur wirusów zaimplementowanych w oprogramowaniu antywirusowym.

niedziela, 17 kwietnia 2016

Jednolinijkowe generatory melodii

Na blogu countercomplex znalazłem ciekawy artykuł jak generować 8-bitowe oldskulowe (podobne do tych z gier z lat 80-tych) melodie za pomocą jednej linijki kodu w języku C. Poniżej dwa przykładowe programy:

main(t){for(t=0;;t++)putchar((t*5&t>>7)|(t*3&t>>10));}

main(t){for(t=0;;t++)putchar((t>>6|t|t>>(t>>16))*10+((t>>11)&7));}

Powyższe programy kompilujemy następująco:

gcc sound.c -o sound

Aby odtworzyć dźwięk z naszego generatora o nazwie sound, należy przekierować jego standardowe wyjście na standardowe wejście odtwarzacza audio np. aplay (Linux) za pomocą potoku |:

./sound | aplay

W komentarzach do artykułu na blogu countercomplex jest dużo innych przykładów - można poeksperymentować modyfikując funkcję putchar().

Źródła
http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html 
http://countercomplex.blogspot.com/2011/10/some-deep-analysis-of-one-line-music.html 
 

środa, 9 marca 2016

Kody ASCII

Ostatnio potrzebowałem skorzystać z kodów ASCII w konsoli systemu Windows. Oczywiście można znaleźć gotowe tablice z kodami ASCII w internecie, ale rozszerzone kody ASCII są zależne od systemu operacyjnego oraz strony kodowej. Tak więc stworzyłem prosty programik ascii-codes, który wyświetla symbole (znaki) dla kodów ASCII od 0 do 255.


ASCII (ang. American Standard Code for Information Interchange) – 7-bitowy kod przyporządkowujący liczby z zakresu 0−127: literom alfabetu angielskiego, cyfrom, znakom przestankowym i innym symbolom oraz poleceniom sterującym. Na przykład litera „a” jest kodowana jako liczba 97, a znak spacji jest kodowany jako 32. Znaki ASCII dzielimy na:
- sterujące (kody 0 - 31 oraz 127),
- drukowalne (kody 32 - 126).
Ponieważ kod ASCII jest 7-bitowy, a większość komputerów operuje na 8-bitowych bajtach, dodatkowy bit można wykorzystać na powiększenie zbioru kodowanych znaków do 256 symboli, a więc mamy:
- znaki ASCII rozszerzone (kody 128 - 255) - uzależnione od strony kodowej.

Stronę kodową konsoli Windows sprawdzamy poleceniem:

mode con cp

a ustawiamy poleceniem:

mode con cp=[strona kodowa]

np.

mode con cp=1250

Kod programu ascii-codes.c:
/*
 *  -----------------------------------------
 *  ASCII Codes 1.0
 *  -----------------------------------------
 *  Author: Adam Blaszczyk
 *          http://wyciekpamieci.blogspot.com
 *  Date:   2016-03-08
 *  -----------------------------------------
 *  
 *  Compilation (Linux, Windows):
 *         gcc ascii-codes.c -o ascii-codes -Wall
 *
 *  Usage:
 *         ascii-codes
 *         - ASCII and Extended ASCII *printable* characters between 32 and 255
 *         ascii-codes min
 *         - ASCII and Extended ASCII characters between [min] and 255
 *         ascii-codes min max
 *         - ASCII and Extended ASCII characters between [min] and [max]
 *
 */

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
  
  int ch;
  int min = 32;
  int max = 255;

  if(argc == 2)
    min = atoi(argv[1]);
  if(argc == 3) {
    min = atoi(argv[1]);
    max = atoi(argv[2]);
  }

  printf("\n");
  printf("  ASCII CODES\n");
  printf("  ==============================================\n");
  printf("     0 -  31; 127 --> ASCII control characters\n");
  printf("    32 - 126      --> ASCII printable characters\n");
  printf("   128 - 255      --> Extended ASCII characters\n");

  printf("\n");
  printf("  +-------+------+-----------+\n");
  printf("  |  DEC  |  HEX | Character |\n");
  printf("  +-------+------+-----------+\n");
  
  for(ch = min; ch <= max; ch++) {
    printf("  |  %03d  |  %02X  |     %c     |\n", ch, ch, ch);
  }
  
  printf("\nPress [ENTER] to exit...");
  getchar();

  return 0;
}
https://github.com/adamblaszczyk/ascii-codes 

Program da się skompilować pod Windows i Linux za pomocą gcc:

gcc ascii-codes.c -o ascii-codes -Wall

Przykładowe użycie programu:

ascii-codes
Wyświetla drukowalne znaki ASCII o kodach od 32 do 255,

ascii-codes 1
Wyświetla znaki ASCII o kodach od 1 do 255,

ascii-codes 174 181
Wyświetla znaki ASCII o kodach od 174 do 181.
 

piątek, 30 października 2015

valgrind - szukanie wycieków pamięci

Chciałbym zaprezentować pożyteczny program konsolowy valgrind, który bada wycieki pamięci w programach.

Wyciek pamięci (ang. memory leak) – niezamierzone użycie pamięci przez program komputerowy, gdy nie zwalnia on zaalokowanej wcześniej pamięci, która nie jest już mu potrzebna.

Wycieki pamięci są efektem bardzo niepożądanym. Program bowiem zajmuje coraz więcej pamięci, ale nie jest w stanie jej wykorzystać ani zwolnić. Szczególnie w aplikacjach, które działają przez długi czas (w większości serwerowych), efekt wycieku pamięci stopniowo narasta. Sam wyciek prowadzi do spadku wydajności systemu, w skrajnym przypadku zawieszenia się programu lub innych programów, którym system nie może przydzielić wystarczającej ilości pamięci, a nawet zablokowania całego systemu operacyjnego. Kod programu, który powoduje wycieki pamięci, jest kodem błędnym.

Użycie programu valgrind jest bardzo proste:

valgrind nazwa_programu

np.:

valgrind putty
valgrind ./myprog

Wynikiem powyższych poleceń jest uruchomienie danego programu, a po jego zakończeniu wyświetlenie ilości bajtów, które wyciekły.

Program valgrind przydaje się, gdy na komputerze uruchamiamy program, który po pewnym czasie zaczyna "mulić". Można wtedy sprawdzić, czy nie ma dużych wycieków pamięci.

W językach programowania takich jak Java czy C# problem wycieków pamięci został częściowo zniwelowany poprzez zastosowanie odśmiecania pamięci (ang. Garbage Collector). W językach C i C++ programista musi zwalniać pamięć. Poniżej przykład programu w C, który nie zwalnia zaalokowanej wcześniej pamięci na zmienną typu int (4 bajty):

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int *x = malloc(sizeof(int));
  *x = 16;
  printf("%d\n",*x);
  return 0;
}

Powyższy kod kompilujemy następująco:

gcc memleak.c -o memleak

Sprawdzamy wycieki pamięci:

valgrind ./memleak

Dostajemy informację, że wyciekły 4 bajty.

Poprawnie napisany program powinien zawierać funkcję free(), która zwalnia zarezerwowaną wcześniej pamięć:
 
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int *x = malloc(sizeof(int));
  *x = 16;
  printf("%d\n",*x);
  free(x);
  return 0;
}

środa, 10 czerwca 2015

Podstawy systemu JunOS

W dzisiejszym poście omówię podstawy konfiguracji urządzeń sieciowych firmy Juniper Networks przy pomocy CLI systemu operacyjnego JunOS. System ten oparty jest na jądrze FreeBSD i zawiera obsługę większości używanych współcześnie protokołów routingu.

Nasz przykładowy router R1 posiada dwa interfejsy sieciowe em0 oraz em1.


Legenda do rysunku:
R1 - router Juniper
SW1 - switch 1
SW2 - switch 2
C1 - host 1
C2 - host 2
C3 - host 3
C4 - host 4
 
W systemie JunOS nie da się ustawić adresu IP bezpośrednio na fizycznym interfejsie sieciowym, tylko na logicznym zwanym unitem. Każdy unit posiada swój identyfikator w postaci liczby całkowitej. W naszym przypadku jest to 0, czyli mamy unit 0 na em0 (em0.0) oraz unit 0 na em1 (em1.0). Identyfikator unitu jest dowolną liczbą całkowitą.

W naszym przypadku będziemy mieć następującą adresację interfejsów:
em0.0 : 192.168.0.1 z maską 255.255.255.0
em1.0 : 10.10.10.1 z maską 255.255.255.0

System JunOS może pracować w dwóch trybach:
- Operational Mode - do odczytywania informacji i monitorowania urządzenia;
- Configuration Mode - do zmiany konfiguracji urządzenia.
Tryby te można rozróżnić po znaku zachęty:
> Operational Mode
# Configuration Mode

Domyślnie pracujemy w Operational Mode. Aby przejść do Configuration Mode trzeba wydać polecenie:

root> configure

Powrót do Operational Mode:

root# exit

Aby odczytać konfigurację wydajemy polecenie:

root> show configuration

Aby uzyskać pomoc wydajemy polecenie:

root> ?

Co robi dana komenda dowiemy się tak:

root> show?

Listę opcji (dopełnień) danej komendy uzyskamu tak:

root> show ?

Przejdźmy teraz do konfiguracji interfejsów sieciowych. Chcemy wyświetlić bieżącą informację o interfejsach:

root> show interfaces terse


Teraz chcemy ustawić adresację na em0.0:

root> configure

root# set interfaces em0 unit 0 family inet address 192.168.0.1/24

root# commit

Komendy są prawidłowe, ale i tak dostaniemy błąd Missing mandatory statement: 'root-authentication'. Chodzi o to, że domyślnie konto root-a nie ma założonego hasła. Trzeba je założyć:

root# set system root-authentication plain-text-password

root# commit

Polecenie commit zatwierdzi zmianę hasła dla root-a, ale również poprzednią komendę set interfaces, która wygenerowała błąd.

Możemy teraz ustawić IP na em1.0:

root# set interfaces em1 unit 0 family inet address 10.10.10.1/24

root# commit

Przechodzimy do Operational Mode i wyświetlamy interfejsy:

root# exit

root> show interfaces terse

 
Jak widać udało się ustawić adresację na interfejsach sieciowych.

wtorek, 14 kwietnia 2015

ODBC w Linuksie

ODBC (ang. Open DataBase Connectivity - otwarte łącze baz danych) - interfejs pozwalający programom łączyć się z systemami zarządzającymi bazami danych. Jest to API niezależne od języka programowania, systemu operacyjnego i bazy danych. W skład ODBC wchodzą wywołania wbudowane w aplikacje oraz sterowniki ODBC. Pierwsza implementacja ODBC pojawiła się w systemie Windows, lecz obecnie możliwe jest korzystanie z niego na platformach Unix, Linux oraz Macintosh.

W systemie Windows zarządzanie sterownikami ODBC oraz źródłami danych jest bardzo proste i od razu dostępne w systemie - wystarczy wejść w Panel sterowania -> Narzędzia administracyjne -> Źródła danych (ODBC).

Pod linuksem sytuacja jest trochę bardziej skomplikowana:

1. Trzeba zainstalować pakiet unixodbc:

sudo apt-get install unixodbc

Jest to główna biblioteka ODBC dla systemu Linux. Pakiet unixodbc zawiera także narzędzie wiersza poleceń isql, umożliwiające interaktywne wprowadzanie poleceń SQL.

2. Powinniśmy też zainstalować pakiet unixodbc-bin dostarczający graficznych narzędzi do zarządzania sterownikami i źródłami danych:

sudo apt-get install unixodbc-bin

Pakiet ten oferuje dwa pożyteczne graficzne narzędzia:

ODBCManageDataSourcesQ4 - zarządzanie źródłami danych i sterownikami ODBC 



ODBCCreateDataSourceQ4 - kreator źródeł danych




3. Teraz można już instalować sterowniki ODBC do różnych baz danych. Część można znaleźć w Menedżerze Pakietów np. synaptic a część na stronie:


4. Przykład - sterownik SQLite ODBC

sudo apt-get install libsqliteodbc

Efekt jest następujący:


Wystarczy teraz skonfigurować źródło danych (Data Source Names w ODBCManageDataSourcesQ4 lub za pomocą kreatora ODBCCreateDataSourceQ4) i można się do niego podpiąć różnymi programami, które korzystają z ODBC np. LibreOffice Base.

Do testów na wyciągnięcie ręki mamy na przykład dane przechowywane przez Firefoksa w katalogu domowym użytkownika /home/user/.mozilla/firefox. Są to pliki .sqlite np. places.sqlite - baza, która  w swoich tabelach trzyma zakładki i historię przeglądania.