wtorek, 6 czerwca 2017

Hyper-V - chwilowe wyłączenie hipernadzorcy

Hyper-V to oprogramowanie służące do wirtualizacji (hypervisor) działające na systemach serwerowych Microsoftu (od Windows Server 2008) oraz także na desktopach (od Windows 8 Pro).

Hyper-V jest uruchamiany podczas startu systemu Windows i czasami istnieje potrzeba chwilowego go wyłączenia (np. gdy mamy problemy z innym hypervisorem takim jak VirtualBox).

Funkcję Hyper-V wyłączamy narzędziem bcdedit (Boot Configuration Data) z linii poleceń cmd:

1. Uruchamiamy wiersz poleceń cmd z uprawnieniami administratora.
2. Wydajemy polecenie:

bcdedit /set hypervisorlaunchtype off

3. Restartujemy komputer.

Powrót do Hyper-V:

1. Uruchamiamy wiersz poleceń cmd z uprawnieniami administratora.
2. Wydajemy polecenie:

bcdedit /set hypervisorlaunchtype auto

3. Restartujemy komputer.

czwartek, 6 kwietnia 2017

ADB - Android Debug Bridge

Android Debug Bridge (ADB) to wszechstronne narzędzie, które pozwala kontrolować i zarządzać urządzeniem (lub emulatorem) z systemem operacyjnym Android. Za pomocą oprogramowania ADB można np. kopiować pliki z, oraz do pamięci urządzenia z Androidem, instalować oraz odinstalowywać aplikacje (pliki .apk), uzyskać dostęp do powłoki (shell) urządzenia, podejrzeć logi Androida itp. Narzędzie ADB dostępne jest dla Linux, Windows i Mac.


Instalacja ADB na komputerze

ADB jest dostępny w pakiecie SDK Platform Tools dla systemów Linux, Windows i Mac.
W systemie Linux można też go zainstalować za pomocą menadżera pakietów, np. w Linux Mint:

sudo apt-get install android-tools-adb

Można też zainstalować Android Studio - oficjalne IDE dla Androida. Program ADB znajduje się w podkatalogu platform-tools środowiska SDK. Dodatkowo w Android Studio mamy możliwość tworzenia aplikacji dla Androida w języku Java.


Włączenie debugowania na urządzeniu z Androidem

Aby program ADB w komputerze komunikował się z telefonem/tabletem z Androidem, należy włączyć Debugowanie USB:
Ustawienia > Opcje programistyczne > Debugowanie USB

Jeżeli Opcje programistyczne nie są widoczne, trzeba je uaktywnić uderzając 7 razy w Numer kompilacji:
Ustawienia > Informacje o telefonie > Numer kompilacji


Pożyteczne komendy

1) Numer wersji programu ADB

adb version

2) Wykaz wszystkich funkcji programu ADB

adb help

3) Wykaz podpiętych do komputera urządzeń z Androidem

adb devices

Jeśli lista urządzeń jest pusta, oznaczać to może, że nasze urządzenie z Androidem potrzebuje dodatkowych sterowników. Można spróbować ściągnąć sterowniki od googla: Google USB Driver - głównie dla Google Nexus. Można też próbować zainstalować oprogramowanie od producenta urządzenia, które zawiera sterownik np. dla telefonów Huawei jest to oprogramowanie HiSuite .

4) Przerwanie działania serwera ADB

adb kill-server

5) Instalacja pakietu APK (programu) na Androidzie

adb install myapp.apk

6) Deinstalacja pakietu

adb uninstall com.blogspot.wyciekpamieci.myapp

7) Kopiowanie plików z komputera do Androida

adb push C:\Users\adam\photos\photo1.jpg /sdcard/photos
- dla Windows

adb push /home/adam/photos/photo1.jpg /sdcard/photos
- dla Linux

8) Kopiowanie plików z Androida na komputer

adb pull /sdcard/photos/photo2.jpg C:\Users\adam\photos
- dla Windows

adb pull /sdcard/photos/photo2.jpg /home/adam/photos
- dla Linux

9) Logcat - logi Androida pomocne przy debugowaniu problemów

adb logcat
- zrzut logów na ekran konsoli (Ctrl-C przerywa zrzucanie logów)

adb logcat > log.txt
- zrzut logów do pliku (Ctrl-C przerywa zrzucanie logów)

10) Ponowne uruchomienie urzadzenia

adb reboot

11) Uruchomienie w Recovery

adb reboot recovery

12) Uruchomienie w Bootloaderze

adb reboot bootloader

13) Zdalna powłoka (shell) Androida

adb shell

Od teraz możemy wykonywać typowe polecenia uniksowe (ls, cd, cp, mv, rm, mkdir, pwd, touch, cat, ping, netstat, exit i wiele innych) na Androidzie. W wyniku wykonania komendy adb shell dostajemy się do pamięci urządzenia.
Znak zachęty # informuje nas o dostępie z prawami root. W przypadku pojawienia się znaku zachęty $ wpisujemy jeszcze komendę su by dostać prawa root (tylko dla zrootowanych urządzeń).
Komendy shella można wydawać bez bezpośredniego wchodzenia w powłokę, np.:

adb shell ls

adb shell cat /proc/meminfo

Pożyteczne komendy powłoki shell:

adb shell cat /proc/meminfo
- informacje na temat pamięci urządzenia z Androidem

adb shell cat /proc/cpuinfo
- informacje na temat procesora

adb shell cat /proc/version
- wersja jądra Linux na urządzeniu z Androidem

adb shell df
- sprawdzimy jakie mamy punkty montowania, jaką mają pojemność i ilość wolnej przestrzeni

adb shell getprop
- odczytamy wiele parametrów naszego systemu Android

adb shell getprop ro.build.version.release
- sprawdzimy jaką mamy wersję Androida

adb shell getprop ro.build.version.sdk
- sprawdzimy jaką mamy wersję SDK na urządzeniu

adb shell pm list packages
- lista zainstalowanych pakietów

adb shell pm path org.wikipedia
- ścieżka do pliku .apk dla danego pakietu

adb shell netcfg
- informacja o interfejsach sieciowych urządzenia

adb shell ping 8.8.8.8
- puszczenie pinga do danego hosta (tutaj do hosta o adresie 8.8.8.8) z urządzenia Android

adb shell top
- lista procesów aktualnie działających w systemie (Ctrl+C - wyjście)

wtorek, 14 lutego 2017

TCP/IP

Komunikacja w sieci oparta jest na warstwowych modelach protokołów i odniesienia. Najpopularniejsze modele warstwowe to:
- model odniesienia ISO/OSI,
- model protokołów TCP/IP.

Model ISO/OSI traktowany jest jako model odniesienia (wzorzec) dla większości rodzin protokołów komunikacyjnych. Podstawowym założeniem modelu jest podział systemów sieciowych na 7 warstw (ang. layers) współpracujących ze sobą w ściśle określony sposób.

Dla internetu sformułowano uproszczony model TCP/IP, który ma tylko 4 warstwy.



W modelu TCP/IP każda wiadomość wysłana przez aplikację przechodzi przez wszystkie warstwy TCP/IP, od najwyższej warstwy aplikacji do najniższej warstwy dostępu do sieci (każda warstwa dodaje swój własny nagłówek do danych aplikacji - zjawisko to nazywamy enkapsulacją). Następnie wiadomość jest transmitowana przez sieć do drugiego komputera. Na koniec przechodzi przez wszystkie warstwy w przeciwnym kierunku, aż do warstwy aplikacji i docelowego procesu. Usuwanie tych nagłówków po drugiej stronie komunikacji nazywamy dekapsulacją.

Na rysunku poniżej pokazano przykładową sesję TCP, która odbyła się w sieci lokalnej pomiędzy klientem 192.168.0.17 a serwerem 192.168.0.23. Klient 192.168.0.17 po połączeniu się do serwera 192.168.0.23 na porcie 6996 (za pomocą narzędzia Telnet) otrzymuje od niego komunikat "Hello". Następnie klient jako pierwszy zamyka połączenie (wychodzi z programu Telnet).
Kod źródłowy i binarny serwera:
https://github.com/adamblaszczyk/tcp-test-server




Mamy tu 7 ramek a właściwie 7 segmentów TCP. Pierwsze trzy to ustanowienie połączenia, czyli uzgadnianie trój-etapowe (three-way handshake):

1) Klient 192.168.0.17 wysyła segment SYN z losowym numerem sekwencyjnym Seq=1796127574
2) Serwer 192.168.0.23 wysyła segment SYN ACK ze swoim losowym numerem sekwencyjnym Seq=1444501807 oraz numerem potwierdzenia Ack=1796127575 (numer sekwencyjny klienta zwiększony o 1)
3) Klient wysyła segment ACK ze swoim numerem sekwencyjnym Seq=1796127575 oraz numerem potwierdzenia Ack=1444501808 (numer sekwencyjny serwera zwiększony o 1)

To kończy proces nawiązywania połączenia i pozwala na właściwą transmisję danych:
4) Wysłanie właściwych danych przez serwer - tekst "Hello" (5 bajtów) - ustawiona flaga ACK (Seq=1444501808; Ack=1796127575)
5)  Klient wysyła segment ACK potwierdzający odebranie danych (Seq=1796127575; Ack=1444501813 - numer sekwencyjny serwera zwiększony o ilość odebranych bajtów)

Zakończenie połączenia:
6) Klient wysyła segment FIN ACK kończący połączenie (Seq=1796127575; Ack=1444501813)
7) Serwer potwierdza segmentem ACK (Seq=1444501813; Ack=1796127576)
Następuje zamknięcie sesji TCP.

Nie jest to do końca wzorcowe zakończenie połączenia TCP. Może ono być zainicjowane przez dowolną stronę i powinno ono przebiegać tak:
1. Host A wysyła segment FIN ACK do hosta B
2. Host B potwierdza wysyłając segment ACK do hosta B
3. Host B wysyła segment FIN ACK do hosta A.
4. Host A potwierdza wysyłając segmnet ACK do hosta B.
Dopuszcza się również awaryjne przerwanie połączenia poprzez przesłanie pakietu z flagą RST. Pakiet taki nie wymaga potwierdzenia.

Całą naszą sesję TCP można zobaczyć na poniższym rysunku:



Możemy teraz zobrazować proces enkapsulacji na przykładzie ramki czwartej - tam gdzie serwer wysyła dane. Wszystkie dane w ramce zaprezentowane są w postaci liczb szesnastkowych.

Na początku mamy dane warstwy aplikacji:
48 65 6c 6c 6f - tekst "Hello"

Następnie dodawany jest nagłówek TCP warstwy transportowej:
1b 54 9d f5 56 19 59 30 6b 0e bb 57 50 18 ff ff 7b 83 00 00
1b 54 - port nadawcy = 6996
9d f5 - port odbiorcy = 40437
56 19 59 30 - numer sekwencyjny Seq = ‭1444501808
6b 0e bb 57 - numer potwierdzenia Ack = ‭1796127575‬
5 - długość nagłówka 5x4 bajty = 20 bajtów
0 18 - flagi (PSH, ACK) 000 000011000 
ff ff - szerokość okna = 65535
7b 83 - suma kontrolna
00 00 - wskaźnik priorytetu
Powstaje segment TCP.

Potem dodawany jest nagłówek IPv4 warstwy internetowej:
45 00 00 2d 02 d1 40 00 80 06 76 81 c0 a8 00 17 c0 a8 00 11
4 - wersja protokołu IP = IPv4
5 - długość nagłówka 5x4 bajty = 20 bajtów
00 - Differentiated Services Field
00 2d - długość całkowita pakietu = 45
02 d1 - identyfikator
40 00 - flagi (don't fragment) + przemieszczenie fragmentacji
80 - Time To Live = 128
06 - protokół = 6 = TCP
76 81 - suma kontrolna nagłówka
c0 a8 00 17 - źródłowy adres IP = 192.168.0.23
c0 a8 00 11 - docelowy adres IP = 192.168.0.17

Powstaje pakiet IP.

Następnie dodawany jest nagłówek Ethernet warstwy dostępu do sieci:
00 21 63 23 55 d1 00 21 00 ae 81 e6 08 00
00 21 63 23 55 d1 - docelowy adres MAC
00 21 00 ae 81 e6 - źródłowy adres MAC
08 00 - typ = IPv4

Powstaje ramka ethernetowa.

Dodatkowe pojęcia

Numer portu warstwy transportowej - odpowiada za dostarczenie danych do właściwej aplikacji. Każda aplikacja w systemie operacyjnym posiada swój identyfikator jednoznacznie ją określający. Identyfikatorem tym jest numer portu aplikacji. Serwer WWW domyślnie pracuje na porcie 80/TCP, serwer pocztowy POP3 na porcie 110/TCP a serwer DNS na porcie 53/UDP.

Nie można uruchomić dwóch różnych serwerów (procesów) nasłuchujących na tym samym porcie. Funkcja bind() zwróci wtedy błąd 10048:
Windows Sockets Error Codes

Gniazdo sieciowe (ang. socket) to kombinacja adresu IP, numeru portu i użytego protokołu warstwy transportowej (np. TCP, UDP). Unikalna kombinacja tych trzech parametrów pozwala na zidentyfikowanie właściwego procesu, do którego wiadomość powinna być dostarczona.

Proces powiązywania aplikacji i gniazda jest nazywany przypisaniem (ang. binding).

Omawiany na powyższym przykładzie ruch w sieci został przechwycony za pomocą sniffera Wireshark , który jest darmowym i wolnym oprogramowaniem dla systemów z rodziny Linux, macOS i Windows.

niedziela, 16 października 2016

Haiku - menedżery pakietów

System operacyjny Haiku został wyposażony w dwa menedżery pakietów:

- graficzny HaikuDepot


- konsolowy pkgman



Graficznego HaikuDepot nie trzeba omawiać, bo jest bardzo prosty w obsłudze. Z grubsza omówię menedżera pkgman, podając konkretne przykłady.

1) Instalacja pakietów (programów)

pkgman install xrick
- zainstaluje grę xrick, klona Rick Dangerous

2) Aktualizacja pakietów (programów)

pkgman update xrick

3) Deinstalacja pakietów (programów)

pkgman uninstall xrick

4) Szukanie pakietów (programów)

pkgman search rick

5) Wylistowanie dostępnych repozytoriów pakietów

pkgman list-repos

6) Dodanie repozytoriów do systemu

pkgman add-repo clasquin-johnson.co.za/michel/repo
pkgman add-repo http://software.besly.de/repo
pkgman add-repo coquillemartialarts.com/fatelk/repo

lub

pkgman add clasquin-johnson.co.za/michel/repo
pkgman add http://software.besly.de/repo
pkgman add coquillemartialarts.com/fatelk/repo

7) Usunięcie repozytoriów z systemu

pkgman drop-repo "clasqm's repo"
pkgman drop-repo "BeSly Software Solutions"
pkgman drop-repo FatElk 

lub

pkgman drop "clasqm's repo"
pkgman drop "BeSly Software Solutions"
pkgman drop FatElk

8) Aktualizacja systemu

pkgman add http://packages.haiku-os.org/haiku/master/$(getarch)/current
pkgman add http://packages.haiku-os.org/haikuports/master/repo/$(getarch)/current
pkgman update
shutdown -r

Aby korzystać z wyżej opisanych menedżerów pakietów, trzeba mieć zainstalowany system z nightly images . Wersja R1/Alpha 4.1 nie ma tych menedżerów.

środa, 12 października 2016

System operacyjny Haiku

Haiku to otwartoźródłowy system operacyjny, skierowany do użytkowników komputerów osobistych, który został zainspirowany systemem BeOS.

System BeOS został opracowany przez firmę Be Inc. i zaprojektowany do zastosowań multimedialnych. BeOS jest zgodny z interfejsem POSIX i wykorzystuje system plików BFS (Be File System). Jest dostępny na architektury PowerPC i Intel x86. Pierwsze wydanie powstało w 1995 roku a ostatnie R5.0.3 w roku 2000. W 2001 roku prawa autorskie do BeOS-a zostały odsprzedane firmie Palm, znanemu producentowi komputerów kieszonkowych. W związku z brakiem zainteresowania ze strony Palma rozwojem tego systemu oraz nieupublicznieniem kodu źródłowego trwają obecnie prace nad stworzeniem otwartego odpowiednika tego systemu. Jednym z takich projektów jest system operacyjny Haiku.

Projekt powstał w 2001 roku pod nazwą OpenBeOS. W 2004 roku zmieniono nazwę na Haiku. Haiku jest otwartoźródłowym systemem operacyjnym, skierowanym do użytkowników komputerów osobistych. Celem projektu Haiku jest zgodność z BeOS-em R5 na poziomie źródłowym i binarnym, co ma pozwolić na kompilacje i uruchomianie aplikacji napisanych dla BeOS. System napisany jest w języku programowania C++ i dostarcza obiektowo zorientowane API (Interfejs Programowania Aplikacji). Haiku rozwijany jest od 2001 roku, lecz jest ciągle w wersji testowej Alpha (ostatnia wersja rozwojowa to Haiku R1/Alpha 4.1 z 2012 roku).

Specyfikacja Haiku R1/Alpha 4.1 :
Data wydania: 2012-11-14
Strona domowa: http://haiku-os.org
Architektura: x86_32
Jądro: hybrydowe
Licencja: MIT
Minimalne wymagania sprzętowe: Intel Pentium, 128 MB RAM
Zalecane wymagania sprzętowe: Intel Pentium III, 256 MB RAM

Obrazy instalacyjne ostatniej oficjalnej wersji rozwojowej systemu operacyjnego Haiku można pobrać ze strony: https://www.haiku-os.org/get-haiku

Jednak oficjalna wersja (aktualnie R1/Alpha 4.1) ma pewną wadę - brakuje graficznego menedżera pakietów HaikuDepot oraz tekstowego pkgman. Warto ściągnąć bardziej aktualne obrazy systemu tzw. nightly images
Uwaga - te wersje mogą być dosyć niestabilne.

Nie miałem pod ręką żadnej wolnej maszyny, nawet starej, więc zainstalowałem Haiku jako maszynę wirtualną pod VirtualBox-em, który jest dostępny dla systemów Linux, Windows, OS X oraz Oracle Solaris. Na początku zainstalowałem wersję R1/Alpha 4.1, ale brakowało mi menedżerów pakietów, więc zainstalowałem najnowszą wersję testową z nightly images.

Oto kilka zrzutów ekranu systemu operacyjnego Haiku:






Haiku jako konsolę tekstową wykorzystuje powłokę bash. Dużo komend tekstowych jest takich samych jak w linuksie, ale jądro systemu Haiku nie ma nic wspólnego z linuksem!

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.