poniedziałek, 7 grudnia 2015

Własny serwer VoIP

 Wstęp

Ostatnio jak przeglądałem, różne oferty pracy, zaobserwowałem takie pojęcia jak SIP, RTP, PBX czy też VoIP i dlatego powstał ten oto post. Opisywać poszczególne pojęcia będę w trakcie tworzenia serwera umożliwiającego komunikacje głosową przez sieć komputerową. 

Co to jest VoIP i narzędzia

Najprostszym sposobem by było odesłać was do Wikipedii, ale to zbyt proste. VoIP (Voice over IP) zwana jest także jako telefonia IP i polega ona na przetworzeniu sygnału audio do formatu cyfrowego i wysłaniu go przez siec komputerową. 
Wiedząc mniej więcej jak działa ta technologia, teraz potrzebny jest serwer VoIP i komunikator, który umożliwia nam przesyłanie sygnału audio. Ja do tego wykorzystam serwer PBXa o nazwie Asterix. PBX (Private Branch eXchange) jest to nic innego jak centrala telefoniczna. Twinkle posłuży mi jako komunikator audio.

Instalacja i konfiguracja Asterixa

Instalacja serwera Asterix nie jest trudna na systemach typu Linux, bo większość z nich posiada ten serwer w repozytorium. Instalacja jest pokazana niżej.

Po zainstalowaniu, musimy teraz sprawdzić czy Asterisk działa wykonujemy polecenie:
Powinno działać, w razie niepowodzenia, możemy spróbować odpalić ten serwis manualnie i wtedy pokaże on nam dlaczego nie może się uruchomić. Zakładając, że wszystko działa poprawnie przechodzimy do następnej czynności, czyli podłanczamy się do działającego serwera komendą:
Jak jesteśmy połączeni z serwerem Asterisk to teraz czas sprawdzić akie kodeki obsługuje nasz serwer.
Teraz trochę omówienia tego zestawienia. Serwer Asterisk, potrafi łączyć ze sobą kodeki, przez to pokazane są one w tej tabeli. Dodatkowo to nie są wszystkie kodeki, niektóre takie jak G.723 lub G.729 wymagają doinstalowaniu do serwera, jeszcze trzeba wybrać odpowiednią biharkę by mogła być obsłużona przez procesor. Kolejne zapytanie pokaże, co potrafi obsłużyć nasz serwis.
Jak widać, trochę tego jest, ale aktualnie nie wszystkie kodeki mamy wgrane do systemu. Teraz przejdziemy do konfigurowania naszego serwera - dokładniej trzeba konfigurować użytkowników i połączenie konferencyjne. Na początku trzeba zdefiniować użytkowników w pliku: sip.conf i dopisujemy na koniec pliku poniższą formułkę.
Teraz czas na plik extensions.conf w nim dopisujemy:
Resetujemy ustawienia naszego serwera komendą reload , jak jesteśmy połączeni do asteriska i czas na testowanie, czy nasz serwer PBXa działa poprawnie. Jak zadziała to przejdziemy do konfiguracji numeru do przeprowadzania konferencji. W celach testowych na innym komputerze zainstaluje sobie softphona o nazwie Ekiga - jest to darmowy program, dla systemów Windows i Linux.

czwartek, 30 lipca 2015

Sprawdzanie wybranych silników do gier 2D


Oxygine

Hejka dziś walczę z silnikiem do gier Oxygine, który jest napisany w C++. Początkowo chciałem go zainstalować pod Windowsem, ale nie mogę mieć Visual Studio, bo usunąłem internet explorera i koniec końców instaluje go po Linuxem.
Instalacja nie jest, aż taka przyjemna jak myślałem, bo na początku trafiłem na problem, że instrukcja posiada błędnie opisane kroki - na szczęście nazwy plików są te same.
Po dwudziestu minutach, walczenia z biblioteką libtool stwierdzam, że nie chce mi się instalować i może jest to dobry framework, ale ze względu na utrudnienia w instalacji i braku na razie czasu na dogłębną analizę, porzucam to narzędzie.


Torque-2d

Ten silnik do pisania gier także nie był dedykowany dla mnie, bo wymagał on na systemie Windows 7, bym skorzystał z Visual Studio - niestety nie jestem entuzjastą tego IDE, więc zostawiłem go i sprawdziłem kolejny silnik.


Slick2D

Silnik przeznaczony dla języka Java, jednak on wymaga JVM 32 bitowej i po załadowaniu go do netbeansa nie mogłem uruchomić przykładowej planszy wygenerowanej przez ten silnik. Dodatkową informacją może być to, że korzysta ona z OpenGLa. 

LibGDX także mi nie podszedł do gustu i stwierdzałem, że lepiej znaleźć jeden silnik do gier, który będzie mi się podobał i w nim trochę porobić niż od razu starać się sprawdzić kilka. 
Podsumowując jak znajdę coś co mi się będzie podobało, to opublikuje o tym post. 

poniedziałek, 8 czerwca 2015

Testowanie silników do gier w C++ i Javie

Ostatnio wpadłem na pomysł zrobienia prostej gry komputerowej, lecz aby to zrobić trzeba albo zrobić własny silnik gry, albo skorzystać z gotowego. Ja wybrałem tą drugą opcje i w następnych postach będę opisywał poszczególne silniki do gier, oraz będę próbował coś prostego w nich zrobić.
Wybrałem wa najbardziej mi bliskie języki programowania, mimo że znajomość w nich mam nadal małą. 
Tak więc poniżej podam listę silników jakie chce zbadać:
  • Oxygine - silnik napisany w języku C++
  • torque-2d - silnik napisany w języku C++
  • Slick2D  - silnik napisany w Javie
  • libgdx - silnik napisany w Javie 

poniedziałek, 26 stycznia 2015

Penetrujemy aplikacje napisane w języku C - narzedzie GDB cz.3

To już ostatni wpis do wstępu z narzędziem GDB. Wydaje mi się, że jest to wiedza po której można ta aplikacje dalej poznawać, bo jest ona naprawde duża.
Wracając do tematu, chciałbym się skupić na tym czy jesteśmy w stanie określić co znajduje się w adresie rip i takim oto sposobem omówię kilka instrukcji, by sprawdzić jak wygląda nasz kod maszynowy, który wcześniej był zapisany w aplikacji C.
 (gdb) x/10i $rip  
 =&gt; 0x400564 <main>:     movl  $0x0,-0x4(%rbp)  
   0x40056b <main>:     jmp  0x40057b <main>  
   0x40056d <main>:     mov  $0x400634,%edi  
   0x400572 <main>:     callq 0x400440 <puts plt="">  
   0x400577 <main>:     addl  $0x1,-0x4(%rbp)  
   0x40057b <main>:     cmpl  $0x9,-0x4(%rbp)  
   0x40057f <main>:     jle  0x40056d <main>  
   0x400581 <main>:     mov  $0x0,%eax  
   0x400586 <main>:     leaveq   
   0x400587 <main>:     retq    
 (gdb)   

Kod robi podwójny skok pamięci do instrukcji
 cmpl  $0x9,-0x4(%rbp)  

Jest to instrukcja porównawcza, która sprawdza czy warunek jest spełniony, jeśli wartości są mniejsze lub równe to jest ponowy skok do pamięci 0x40056d, a w przeciwnym wypadku idzie do kolejnej instrukcji. Nasŧepnie możemy wykonywać kolejne instrukcje i zauważyć, że w pewnym momęcie zobaczymy instrukcje puts.
 (gdb) nexti   
 0x000000000040056b     5          for(i = 0; i < 10; i++) {   
 (gdb) x/i %rip  
 A syntax error in expression, near `%rip'.  
 (gdb) x/i $rip  
 => 0x40056b <main+15>:     jmp  0x40057b <main+31>  
 (gdb) nexti   
 0x000000000040057b     5          for(i = 0; i < 10; i++) {   
 (gdb) x/i $rip  
 => 0x40057b <main+31>:     cmpl  $0x9,-0x4(%rbp)  
 (gdb) nexti   
 0x000000000040057f     5          for(i = 0; i < 10; i++) {   
 (gdb) x/i $rip  
 => 0x40057f <main+35>:     jle  0x40056d <main+17>  
 (gdb) nexti   
 6               puts("Hello, world!\n");   
 (gdb)   

Teraz sprawdzę na jaki adres pamięci wskazuje teraz program:
 (gdb) i r rip  
 rip      0x40056d     0x40056d <main+17>  
 (gdb) x/2i $rip  
 => 0x40056d <main+17>:     mov  $0x400634,%edi  
   0x400572 <main+22>:     callq 0x400440 <puts@plt>  
 (gdb)   

Ciekawe co kryje edi i mogę to spokojnie także podglądnąć:
 (gdb) i r edi  
 edi      0x1     1  
 (gdb) x/6cb $0x400634  
 Value can't be converted to integer.  
 (gdb) x/6cb 0x400634  
 0x400634:     72 'H'     101 'e'     108 'l'     108 'l'     111 'o'     44 ','  
 (gdb)   
Znalazłem Hello world, aby wygadało lepiej można wydrukować to tak:
 (gdb) x/12cb 0x400634  
 0x400634:     72 'H'     101 'e'     108 'l'     108 'l'     111 'o'     44 ','     32 ' '     119 'w'  
 0x40063c:     111 'o'     114 'r'     108 'l'     100 'd'  
GDB to wspaniałe narzędzie, gdzie ja nie pokazałem jego wszystkich możliwości i aby się lepiej go nauczyć, trzeba popatrzeć jak każda instrukcja wygląda po skompilowaniu na kod maszynowy - czyli życzę miłej zabawy, w analizowaniu programów napisanych w C. Nasŧepny post będzie omawiał wsŧep do projektu jaki z kumplami zaczynamy, a po jego zakończeniu powrócimy do C i może postaramy się zrobić jakiś nabzdurzyć pamięci.

niedziela, 4 stycznia 2015

Penetrujemy aplikacje napisane w języku C - narzedzie GDB cz.2

Ostatnio nie skończyłem omawiać tego narzędzia - to znów będę męczył coś na jego temat. Ostatnio bawiłem się wyświetlaniem rejestru RIP w różnych systemach liczbowych, a dziś będziemy analizować jego zawartość. Poniżej pokazuje instrukcje, która określa liczbę badanych jednostek w docelowym adresie.
 (gdb) x/12x $rip 

 0x400564 <main+8>:     0x00fc45c7     0xeb000000     0x0634bf0e     0xc9e80040 

 0x400574 <main+24>:     0x83fffffe     0x8301fc45     0x7e09fc7d     0x0000b8ec 

 0x400584 <main+40>:     0xc3c90000     0x00841f0f     0x00000000     0x246c8948 


Dodatkowo możemy zmienić rozmiar jednostki, bo aktualnie jest ustawiona na 4bajty i możemy je formatować na pojedynczy bajt, pół słowo(2bajty), słowo o rozmiarze 4 bajtów i słowo podwójne.
 (gdb) x/12x $rip 

 0x400564 <main+8>:     0x00fc45c7     0xeb000000     0x0634bf0e     0xc9e80040 

 0x400574 <main+24>:     0x83fffffe     0x8301fc45     0x7e09fc7d     0x0000b8ec 

 0x400584 <main+40>:     0xc3c90000     0x00841f0f     0x00000000     0x246c8948 

 (gdb) x/8xb $rip 

 0x400564 <main+8>:     0xc7     0x45     0xfc     0x00     0x00     0x00     0x00     0xeb 

 (gdb) x/8xh $rip 

 0x400564 <main+8>:     0x45c7     0x00fc     0x0000     0xeb00     0xbf0e     0x0634     0x0040     0xc9e8 

 (gdb) x/8xw $rip 

 0x400564 <main+8>:     0x00fc45c7     0xeb000000     0x0634bf0e     0xc9e80040 

 0x400574 <main+24>:     0x83fffffe     0x8301fc45     0x7e09fc7d     0x0000b8ec 

 (gdb) x/8xg $rip 

 0x400564 <main+8>:     0xeb00000000fc45c7     0xc9e800400634bf0e 

 0x400574 <main+24>:     0x8301fc4583fffffe     0x0000b8ec7e09fc7d 

 0x400584 <main+40>:     0x00841f0fc3c90000     0x246c894800000000 

 0x400594 <__libc_csu_init+4>:     0x8d48e02464894cd8     0x258d4c002008672d 

Powyżej można zauważyć pewne udziwnienia w danych. Przy zmianie adnotacji ze słowa na pół słowa czy też na pojedynczy bajt, każda adnotacja jakby pokazywała coś innego. Pierwszy wydruk pokazuje jednak, że pierwsze dwa bajty to 0xc7 i 0x45, ale gdy badamy po pół słowie, w tym samym miejscu pamięci, pokazywana jest wartość 0x45c7. Spokojnie jest to tylko odwrócona kolejność bajtów i ten sam efekt jest przy całym słowie. Jest to logiczne z punktu widzenia procesora, bo wartości są przechwytywane w kolejności little endian.
To tyle na ten post, w następnym postaram się troszkę posprawdzać co kryje aplikacja po skompilowaniu i czy rzeczywiście jest to co w niej zawieraliśmy.

niedziela, 28 grudnia 2014

Detektywistyczne anime Detektyw Conan

Rzadkością jest znalezienie dobrego anime, długiego jak rzeka, gdzie nawet fillery mogą wciągać. Taką pozycją to właśnie Detektyw Conan.

Historia moja z tym tytułem jest dość długa. Początkowo te anime widziałem na niemieckim programie, chyba RTL2 (już ponad 20 lat emitują różne anime na swoim kanale), później nastąpiła cisza, ale kreska i postacie zapamiętałem. Przypomnienie było, za czasów studiów, bo Conan pojawił się na AXN Sci-fi - już niestety nie ma nawet i kanału. Po wielu latach odświeżyłem i nadal oglądam ta serie dzięki stronie: www.meitantei-sekai.pl

Ogólnym tematem anime jest znajdowanie sprawcy zabójstwa,  dodatkowo patrząc na główna linie fabularną, nasz główny bohater szuka sposobu i ludzi którzy go odmienili. Dokładniej stał się młodszy. Mógłbym się rozpisywać na ten temat więcej, ale nie robię recenzji anime tylko chce zachęcić was do niego.

Podsumowując anime Detektyw Conan jest ukryta perełką, którą ciężko znaleźć, ale jak już się znajdzie to zabawa jest przednia.

niedziela, 30 listopada 2014

Penetrujemy aplikacje napisane w języku C - narzedzie GDB

Tak jak pisałem ostatnio, dziś będę używał narzędzia GDB. Służy ono do analizowania kodu programów napisanych w C lub C++. Niestety jeżeli chodzi o składnie desasemblera to znam tylko Intela i nim będę się posługiwał i tym programie, co powoduje to że muszę je skonfigurować i to wygląda następująco:

 gdb -q  
 (gdb) set disassembly-flavor intel   
 (gdb) quit  
po skonfigurowaniu, mogę teraz przejść do pracy, tylko jeszcze będę musiał prze-kompilować program przy użyciu gcc z parametrem -g, który jest odpowiedzialny za wprowadzenie dodatkowych informacji jak będę debugował.
 gdb -q ./a.out  
 Reading symbols from /home/domek/c/a.out...done.  
 (gdb) list  
 1     #include <stdio.h>  
 2       
 3     int main() {  
 4          int i;  
 5          for(i = 0; i < 10; i++) {   
 6               puts("Hello, world!\n");   
 7          }  
 8          return 0; // Informuje OS o zakonczeniu programu  
 9     }  
 (gdb) di  
 directory  disable   disassemble disconnect  display     
 (gdb) dis  
 disable   disassemble disconnect  display     
 (gdb) disassemble main  
 Dump of assembler code for function main:  
   0x000000000040055c <+0>:     push  %rbp  
   0x000000000040055d <+1>:     mov  %rsp,%rbp  
   0x0000000000400560 <+4>:     sub  $0x10,%rsp  
   0x0000000000400564 <+8>:     movl  $0x0,-0x4(%rbp)  
   0x000000000040056b <+15>:     jmp  0x40057b <main+31>  
   0x000000000040056d <+17>:     mov  $0x400634,%edi  
   0x0000000000400572 <+22>:     callq 0x400440 <puts@plt>  
   0x0000000000400577 <+27>:     addl  $0x1,-0x4(%rbp)  
   0x000000000040057b <+31>:     cmpl  $0x9,-0x4(%rbp)  
   0x000000000040057f <+35>:     jle  0x40056d <main+17>  
   0x0000000000400581 <+37>:     mov  $0x0,%eax  
   0x0000000000400586 <+42>:     leaveq   
   0x0000000000400587 <+43>:     retq    
 End of assembler dump.   
 (gdb) run  
 Starting program: /home/domek/c/a.out   
 Missing separate debuginfo for /lib64/ld-linux-x86-64.so.2  
 Try: zypper install -C "debuginfo(build-id)=ecb8ef1a6904a2a3ec60a527f415f520c8636158"  
 Missing separate debuginfo for /lib64/libc.so.6  
 Try: zypper install -C "debuginfo(build-id)=bd1473e8e6a4c10a14731b5be4b35b4e87db2af7"  
 Breakpoint 1, main () at zad1.c:5  
 5          for(i = 0; i < 10; i++) {   
 (gdb)   
Widzę, że mam problemy przy uruchomieniu tego programu w debuggerze, ale spokojnie Suse podpowiedział mi co muszę zainstalować i powtórzę tą operacje. Zainstalowałem brakującą bibliotekę i oto wynik:
 (gdb) break mian   
 Function "mian" not defined.  
 Make breakpoint pending on future shared library load? (y or [n]) y  
 Breakpoint 1 (mian) pending.  
 (gdb) run  
 Starting program: /home/domek/c/a.out   
 Hello, world!  
 Hello, world!  
 Hello, world!  
 Hello, world!  
 Hello, world!  
 Hello, world!  
 Hello, world!  
 Hello, world!  
 Hello, world!  
 Hello, world!  
 [Inferior 1 (process 15408) exited normally]  
 (gdb) info registers eip  
 The program has no registers now.  
 (gdb)   
Jak już mam wszystko to mogę omówić co tu robiłem, na początku sprawdziłem jak wygląda kod, później zobaczyłem maina w wersji assemblera i jak można zaobserwować, tutaj podawane są na początku zakresy pamięci, nie jak było to w przypadku objdumpa. Chciałem uzyskać informacje o instrukcji RIP, który wskazuje on na adres pamięci instrukcji deasemmblacji funkcji main i udało mi się uzyskać :
 break main  
 Breakpoint 1 at 0x400564: file zad1.c, line 5.  
Debbuger GDB ma możłiwośc bezpośredniego badania pamięci i jest to polecenie x.Sprawdzanie pamięci jest bardzo ważne dla każdej osoby, która chce poznać dokładnie program, bo możemy zmienić składnie z systemu szesnastkowego na inny. Proponuje każdemu posprawdzanie tego jak to działa bo u mnie wygląda to tak:
 (gdb) x/x $rip  
 0x400564 <main+8>:     0x00fc45c7  
 (gdb) x/u $rip  
 0x400564 <main+8>:     16532935  
 (gdb) x/t $rip  
 0x400564 <main+8>     00000000111111000100010111000111  
Dziś narazie wystarczy i mam nadzieje, wy czytający ten post, dowiedzieliście się czegoś więcej i spokojnie jeszcze do tego postu wrócę by opisać co możemy dalej z tym robić :)