Ludwig von Mises Institute

Twój adres IP to: 23.22.252.150
Przeglądarka: CCBot/2.0

OE PowerTool
Wersja stabilna: 4.4

31 stycznia 2013
Dziś trochę o podstawach pracy z procesami pod Windows.

Programy, które uruchamiamy, są widziane przez system operacyjny jako tzw. procesy. Każdy proces posiada swój plik wykonywalny, czyli plik z którego został uruchomiony. Pliki te mają rozszerzenie .exe. Przykładowo Notatnik uruchamiany jest z pliku notepad.exe. Gdy włączamy program, system operacyjny ładuje do pamięci dany plik .exe i analizuje jego zawartość. Wczytuje z niego właściwy kod programu, informacje o używanych bibliotekach (pliki .dll), które też ładuje, oraz inne dane związane z wykonywaniem danego programu. Po uruchomieniu proces otrzymuje swój identyfikator - PID. Po tych identyfikatorach można rozróżniać uruchomione procesy, szczególnie jeśli jakiś program został uruchomiony kilkukrotnie i działa kilka jego kopii. Każdy proces ma też przydzieloną pamięć, w której trzymane są dane wykorzystywane przez program. Każdemu procesowi przydzielany jest również czas procesora. Ponieważ w danej chwili uruchomionych jest wiele procesów, procesor musi się szybko między nimi przełączać, poświęcając ułamek czasu na wykonywanie kodu każdego z nich. Jak duży jest ten ułamek, decyduje system operacyjny na podstawie czynności wykonywanej w danej chwili przez proces (oczekiwanie na dane użytkownika, przeprowadzanie obliczeń itd). Użytkownik może wpływać na przydział czasu ustawiając priorytety dla procesów.

Procesy pod Windows mogą wyświetlać okna, z większością programów pracujemy właśnie w ten sposób. Programy działające jako usługi nie wyświetlają z reguły żadnych okien. Są też programy konsolowe, przeznaczone do uruchamiania z wiersza polecenia (cmd.exe). Działają one w trybie tekstowym i korzystają z konsoli (wiersza polecenia) do komunikacji z użytkownikiem. Należy uruchamiać je właśnie z konsoli, a nie przez dwukrotne kliknięcie na pliku .exe albo przez okienko Uruchamianie, które wywołuje się przez Start -> Uruchom. Przykładem takiego programu jest ipconfig, który służy m.in. do wyświetlania konfiguracji interfejsów sieciowych. Gdy zostanie uruchomiony bez żadnych parametrów, wyświetla konfigurację i kończy pracę. Dlatego nie ma sensu uruchamiać go inaczej jak z wiersza polecenia, np. przez Start -> Uruchom, bo wtedy program tylko mignie na chwilę.

Z uruchamianiem procesów mamy do czynienia bardzo często, dzieje się to za każdym razem gdy uruchamiamy jakiś program, np. ze skrótu albo klikając plik exe. Do uruchomienia procesu (programu) możemy też wykorzystać wiersz polecenia (konsolę) i okienko Uruchamianie. Przy uruchamianiu procesu można określić jego priorytet oraz parametr, który zostanie do niego przekazany. Ustawianie priorytetu dostępne jest tylko z konsoli. Można wykorzystać tutaj polecenie start:

start /LOW calc.exe

Spowoduje ono uruchomienie programu Kalkulator z priorytetem niskim. Parametr także można przekazywać z konsoli:

notepad.exe C:\plik.txt

Polecenie to spowoduje, że Notatnik zostanie uruchomiony z parametrem C:\plik.txt. Notatnik traktuje otrzymany parametr jako ścieżkę do pliku, który ma otworzyć. Jeśli więc ten plik istnieje, to zostanie otworzony przez Notatnik. Działają tak praktycznie wszystkie programy, które otwierają jakieś pliki. Gdy klikamy na jakiś plik, z którym skojarzony jest jakiś program, to ścieżka do tego pliku zostanie przekazana do uruchamianego procesu. Parametr można przekazywać też przez skrót. Jeśli zrobimy skrót do pliku exe, to możemy potem otworzyć jego właściwości i w polu Element docelowy dopisać dowolny parametr. Pewną formą przekazania parametru jest też przeciągnięcie ikonki dowolnego pliku na ikonkę pliku exe. Wtedy ten plik .exe zostanie uruchomiony a jako parametr otrzyma ścieżkę do przeciąganego pliku. Parametry można też wpisywać w okienku Uruchamianie.

Uwaga, krótkie przypomnienie zasad pracy z konsolą:
1. Ścieżki zawierające spacje muszą być w cudzysłowie, np.

"C:\Program Files\Internet Explorer\iexplore.exe" http://www.google.pl/

2. Jeśli chcemy uruchomić program, który nie leży w katalogu bieżącym, ani w żadnym z wymienionych w zmiennej PATH, musimy podać pełną ścieżkę do niego.
3. Przy pracy z programem start trzeba pamiętać, że tekst ujęty w cudzysłowy może zostać potraktowany jako parametr oznaczający tytuł okna. Dlatego trzeba użyć dodatkowego cudzysłowu, np.

start "" "C:\Program Files\Internet Explorer\iexplore.exe"

Oczywiście proces może być uruchomiony także przez inny proces. I de facto praktycznie zawsze tak jest, bo jeśli nawet uruchamiamy coś ręcznie, to i tak dany proces jest uruchamiany przez narzędzie, którego użyliśmy, zwykle będzie to powłoka systemowa (explorer.exe) w przypadku klikania albo konsola (cmd.exe).

Po omówieniu uruchamiania procesów, trzeba też wspomnieć o ich zakańczaniu. W przypadku programów okienkowych możemy zamknąć główne okno programu albo skorzystać z menu. Proces zostaje wtedy o tym powiadomiony i wykonuje procedurę kończącą jego działanie. W przypadku programów konsolowych można zazwyczaj wcisnąć Ctrl+C, a jeśli program posiada np. linię komend, wpisać odpowiednie polecenie. Co jednak zrobić, jeśli program nie daje się normalnie zamknąć? Wtedy pozostaje zabicie procesu. Zwykle wykonujemy je z Menedżera zadań, wybierając proces i klikając przycisk Zakończ proces. Sam menedżer zadań można włączyć na kilka sposobów. Można wcisnąć Ctrl+Alt+Del i wybrać uruchomienie menedżera zadań. Jest to sposób popularny, ale można go przyspieszyć, wciskając Ctrl+Shift+Esc, wtedy Menedżer zadań zostanie uruchomiony od razu. Można także kliknąć prawym przyciskiem myszy na pasku zadań i wybrać Uruchom Menedżera zadań. A jak zabić proces z konsoli? Służy do tego polecenie taskkill. Może ono zabijać procesy po identyfikatorze albo po nazwie pliku .exe. W tym pierwszy przypadku używamy przełącznika /PID, w drugim /IM, np.

taskkill /pid 1234
taskkill /im notepad.exe

Polecenie taskkill ma też możliwość filtrowania po parametrach takich jak np. nazwa okna, zużycie pamięci czy numer sesji.

Najpopularniejszą alternatywą dla systemowego Menedżera zadań jest program Process Explorer. Dostarcza on wielu szczegółowych informacji na temat działających procesów. Można np. sprawdzić, przez jaki proces został uruchomiony dany proces, i z jakim parametrem. Można wyświetlić też listę załadowanych bibliotek lub uchwytów do plików, kluczy rejestru czy zdarzeń. Uchwyty te można zamykać, co czasem może być pomocne, np. gdy jakiś program trzyma otwarty plik, który chcemy skasować. Jeśli znamy nazwę pliku, ale nie znamy procesu, który go trzyma, możemy wyszukać go klikając na ikonkę lornetki. Przełączanie między widokiem bibliotek a uchwytów wykonuje się przez menu View -> Lower Pane View. Ciekawą funkcją Process Explorera jest możliwość wstrzymywania wątków, dzięki której można zatrzymać działanie programu. We właściwościach danego procesu trzeba przejść do zakładki Threads. Po wybraniu wątku można go zatrzymać klikając na Suspend. Można też go zabić klikając na Kill. Jeśli program jest jednowątkowy, wstrzymanie wątku spowoduje zamrożenie całej aplikacji. W przypadku programu wielowątkowego, wyłączone zostaną funkcje realizowane przez ten wątek.

W przypadku konsoli listę procesów można wyświetlić poleceniem tasklist. Jeśli potrzebne byłoby bardziej zaawansowane narzędzie, np. pokazujące pełne ścieżki do plików exe, można wykorzystać WMI. Służy do tego polecenie wmic, za pomocą którego możemy wyświetlić właściwości obiektów klasy Win32_Process. Przykładowo:

wmic path win32_process get Processid,ParentProcessId,CommandLine

Polecenie to wyświetli listę identyfikatorów procesów, ich procesów-rodziców, oraz ścieżkę z parametrami. Jeśli dla niektórych procesów nie będą widoczne dane takie jak ścieżka, wówczas wiersz polecenia trzeba najpierw uruchomić z uprawnieniami administracyjnymi i dopiero potem wydać w nim komendę wmic. Jeśli wynik komendy będzie nieczytelny przez zawijające się długie linijki, wyjście komendy można przekierować do pliku:

wmic path win32_process get Processid,ParentProcessId,CommandLine > procesy.txt
start procesy.txt

Szczegółowe informacje na temat poleceń start, tasklist i taskkill można znaleźć w pomocy do Windows oraz uruchamiając je z parametrem /? (np. start /?).

31 grudnia 2012
O nowościach w Windows 8 napisano już dużo, szczególnie o wzbudzającym sporo emocji nowym kafelkowym interfejsie. Warto jednak przyjrzeć się zmianom, które nie są widoczne na pierwszy rzut oka.

Jak praktycznie każde jądro systemu operacyjnego, także jądro Windows korzysta z przerwania timera, które pozwala wykonywać różne okresowe zadania, np. przełączanie się pomiędzy procesami. To, że wiele programów działa naraz jest bowiem tylko złudzeniem. Aby zapewnić wielozadaniowość procesor musi się pomiędzy nimi przełączać z dosyć dużą szybkością. Oczywiście są komputery wieloprocesorowe albo mające procesor wielordzeniowy, co jest obecnie standardem. Pozwala to na równoległe działanie aplikacji, ale i tak nie ma w typowym komputerze tylu rdzeni (zwykle dwa lub cztery), co uruchomionych procesów (kilkadziesiąt). Potrzebne jest więc przełączanie między nimi. Do tego celu można wykorzystać przerwanie zgłaszane przez timer. W Windows 7 takie przerwanie wykonywane jest co 15,6 milisekundy (ok. 64 razy na sekundę). Współczesne procesory obsługują różne tryby uśpienia, które pozwalają zmniejszyć pobór energii. W momencie wystąpienia przerwania procesor jest budzony. Im więc częściej następuje przerwanie tym rzadziej procesor znajduje się w trybie oszczędzania energii. Dlatego wymyślono tzw. nietykające jądro (tickless kernell), w którym timer nie zgłasza przerwania w stałych odstępach czasu. Zamiast tego jądro sprawdza, kiedy ma zostać uruchomione najbliższe zdarzenie z tych, które oczekują w kolejce, i ustawia odpowiednio timer, np. na 300 milisekund. W Linuksie tickless kernel pojawił się w wersji 2.6.21, czyli w 2007 roku, teraz trafił do Windows 8. Dzięki temu użytkownicy laptopów działających pod Windows 8 powinni zaobserwować dłuższy czas działania na baterii. Inny pozytywny efekt to zmniejszenie obciążenia systemu, na którym działa jedna lub więcej maszyn wirtualnych. Jest to oczywiste - dłużej przebywając w uśpieniu mniej będą obciążać system hosta. Przy modyfikacji timerów w Windows 8 wykorzystano funkcję, która pojawiła się w Windows 7: timery łączone. Pozwalają one nie tylko ustawić czas ich zadziałania, ale także dopuszczalne opóźnienie. Oznacza to, że mogą być one uruchomione w trochę innym momencie niż by wynikało z czasu, na który zostały uruchomione. Dzięki temu Windows widząc, że kilka timerów zgłosi zdarzenie w niedalekich odstępach czasu, może je poprzestawiać na ten sam moment i obudzić procesor tylko raz a nie kilka razy.

W celu oszczędzania energii stworzono tryb Connected Standby, w którym system jest uśpiony, ale nadal obsługuje połączenia sieciowe. Może np. odbierać pocztę albo połączenia VoIP. Działanie tego trybu wymaga jednak odpowiedniego wsparcia ze strony sprzętu.

W Windows 8 wprowadzono też zmiany mające ograniczyć zapotrzebowanie na pamięć. Osiągnięto to m.in. poprzez deduplikację pamięci. Polega to na tym, że jądro cyklicznie przeszukuje pamięć pod kątem stron, w których znajdują się te same dane. Gdy wykryje strony pamięci z taką samą zawartością, oznacza jedną z nich jako współdzieloną a pozostałą (lub pozostałe) jako wolne. W ten sposób dane przechowywane są tylko raz i są współdzielone przez różne procesy, czy też w obrębie jednego procesu, zależnie przez co te strony były alokowane. Jest to więc sprytny sposób na oszczędność pamięci przez pozbycie się duplikatów. Pojawia się jednak pytanie - co się stanie, gdy jeden z procesów będzie chciał zapisać coś w danej stronie? System operacyjny nie może przecież dopuścić, żeby jeden proces nadpisywał pamięć innego procesu (pomijając oczywiste jawne współdzielenie jakiegoś obszaru przez aplikacje). Otóż w takich sytuacjach jądro szybko kopiuje daną stronę pamięci, dzięki czemu procesy sobie nie przeszkadzają. System więc stara się współdzielić stronę pamięci tak długo, dopóki nie następuje zapis, dopiero wtedy wykonuje kopię. Stąd technika ta nazywa jest copy-on-write. Zysk z deduplikacji oczywiście jest proporcjonalny do ilości duplikatów, a to zależy do tego, co jest uruchomione na danym komputerze. Sprawdzi się na pewno w przypadku uruchomienia kilku maszyn wirtualnych z podobnymi systemami operacyjnymi. Alokacje pamięci i zapełnanie jej takimi samymi danymi mogą wykonywać też niektóre aplikacje. Wszystko zależy od tego, do czego użytkownik używa swojego komputera. Deduplikacja pamięci nie jest unikalna dla Windows, w Linuksie pojawiła się w 2009 roku w jądrze 2.6.32 jako Kernel Samepage Merging.

Inna zmiana w zarządzaniu pamięcią to możliwość alokacji pamięci z niskim priorytetem. Jeśli aplikacja korzysta z jakichś danych rzadko, może je oznaczyć jako posiadające niski priorytet. Wówczas Windows w momencie, gdy zacznie brakować pamięci, może dane te przenieść do pliku stronicowania. Oczywiście Windows i tak to robi, ale nie mając żadnych informacji ze strony aplikacji, musi w pewnym stopniu zgadywać, które dane muszą być dostępne w pamięci operacyjnej, a które można tymczasowo przenieść na dysk. Wprowadzono także inną nowość związaną z rozróżnianiem danych. Na podstawie analizy działania systemu wyodrębniono dane często i rzadko używane a następnie dokonano ich konsolidacji, aby nie były ze sobą wymieszane. Dzięki temu dane rzadziej używane mogą być odłożone do pliku stronicowania bez obaw, że znajdzie się wśród często używana dana, która spowoduje natychmiastowe przywrócenie strony pamięci z pliku. Część stron może więc na dłuższy czas być na dysku i pozwolić na zmniejszenie zajętości pamięci.

Oszczędność pamięci zapewniono także przez zmiany na nieco wyższym poziomie. Dodano m.in. nowy sposób uruchamiania usług, na żądanie. Są one normalnie wyłączone, a włączają się gdy zajdzie określone zdarzenie, np. interfejs sieciowy pozyska adres IP. Następnie wyłączają się. Ponadto usunięto kilkanaście usług, a inne przestawiono z uruchamiania automatycznego na ręczne.

Dużo nowości w Windows 8 dotyczy bezpieczeństwa. Wprowadzono funkcję ForceASLR, która włącza mechanizm ASLR (Address Space Layout Randomization, wprowadza losowość adresów, pod które ładowane są biblioteki DLL) także dla programów, które nie zostały oznaczone jako z nim kompatybilne. Inne usprawnienie dotyczące ASLR to HEASLR, czyli High Entropy ASLR. Ze względu na to, że aplikacje lubią mieć duże ciągłe obszary przestrzeni adresowej, mechanizm ASLR nie może wylosować adresów z pełnej dwugigabajtowej przestrzeni dostępnej dla procesorów na maszynach 32-bitowych. W związku z tym losowanie odbywa się spośród kilkuset adresów, co nie zapewnia zbyt dużej entropii. Ten sam sposób losowania był jednak używany także w 64-bitowych Windows mimo dostępności znacznie większej przestrzeni adresowej. HEASLR rozwiązuje ten problem pozwalając korzystać z zalet tak dużej przestrzeni adresowej na 64-bitowej wersji Windows 8. Aplikacje jednak muszą być odpowiednio skompilowane, aby mechanizm HEASLR był dla nich włączony, Windows 8 nie włącza go dla nich domyślnie. Kolejny sposób na zwiększenie bezpieczeństwa w Windows 8 to obsługa mechanizmu SMEP (Supervisor Mode Execution Prevention) dostępnego w procesorach Ivy Bridge. Uniemożliwia on jądru wykonywanie kodu należącego do przestrzeni użytkownika. Zabezpiecza to przed exploitami wykorzystującymi luki w jądrze do podniesienia uprawnień.

Sporo dziur w Windows dotyczyło luk w graficznych funkcjach GDI, które znajdowały się w sterowniku win32k.sys. Ponieważ działał on w trybie jądra, pozwalał na podniesienie uprawnień aplikacji. W czasach Windows NT 4 ten komponent systemu był poza jądrem, jednak włączono go do niego ze względów wydajnościowych. Przełączanie się bowiem pomiędzy kodem jądra a użytkownika wiąże się ze sporym narzutem. W Windows 8 nie powrócono do architektury NT, ale najzwyczajniej w świecie wyłączono aplikacjom użytkownika dostęp do funkcji z win32k.sys.

Często atakowaną strukturą w systemach operacyjnych jest sterta. W Windows Vista i 7 wprowadzono wiele zabezpieczeń sterty, w Windows 8 pojawiły się kolejne. Zrezygnowano z pola FreeEntryOffset, które było wykorzystywane przez atakujących do nadpisania dowolnego miejsca w pamięci. Zamiast niego stosowana jest mapa bitowa używana przez część FrontEnd zarządcy sterty. Ponadto zwiększono losowość adresów obszarów alokowanych na stercie przy pomocy funkcji NtAllocateVirtualMemory. Wprowadzono ochronę wskaźnika na strukturę _HEAP - sprawdzane jest czy adres zwalnianego fragmentu (chunk) nie pokrywa się ze wskaźnikiem sterty. Dodano niedeterminizm w działaniu LFH (Low Fragmentation Heap, sterta o niskiej fragmentacji), dzięki niemu alokując kolejne fragmenty pamięci nie dostaje się kolejny adresów. Utrudnia to pisanie exploitów. Pojawiła się funkcja Fast Fail. Dotychczas przy wykryciu nadpisania wskaźników listy używanej przez stertę, proces mógł nie zostać zakończony. Fast Fail wprowadza natychmiastowe zakończenie aplikacji przy wykryciu nadpisania wskaźników przez. Ciekawą nową funkcją jest Guard Page. Jest to strona pamięci umieszczana między wolnymi blokami, która ma wyłączone prawo dostępu. Dzięki takim stronom rozdzielającym bloki blokowane jest nadpisane kolejnego bloku, jeśli w bloku sąsiednim exploit doprowadził do przepełnienia. Guard Pages nie są stosowane zawsze, są wstawiane gdy wykryte zostanie zachowanie wskazujące na heap spray albo inne działanie przygotowujące do przepełnienia, np. szybka alokacja wielu bloków o tym samym rozmiarze. Dodano także ochronę przed zwolnieniem dowolnego fragmentu pamięci przez nadpisanie pola SegmentOffset w nagłówku sterty. Z kolei z funkcji RtlpLowFragHeapAllocFromContext usunięto przechwytywanie błędów, które łapało błąd każdego typu i w pewnych warunkach mogło pozwalać na obejście ASLR.

Swoją stertę ma także jądro Windows, określana jest ona mianem kernel pool. Tutaj także zadbano o walidację wskaźników, które łączą wolne bloki w podwójną listę. Były one sprawdzane już w Windows 7 przy odłączaniu z listy (gdy następuje alokacja), jednak niewystarczająco. W Windows 8 poprawiono to i dodano sprawdzanie przy dołączaniu do listy (przy zwalnianiu bloku). Wprowadzono pool cookie służące do wykrywania nadpisania wskaźników dotyczących list lookaside, list zwolnień oczekujących i alokacji z wyrównaniem z pamięci cache. Cookie działa podobnie jak wprowadzone we wcześniejszych wersjach Windows cookie na stercie i stosie. Jest to losowa wartość sprawdzana w określonych sytuacjach, znajdująca się przed ważnymi strukturami w pamięci. Jeśli wystąpi przepełnienie bufora wykonywane w celu nadpisania tych struktur, nadpisane zostanie również cookie, co zostanie wykryte a działanie exploita zostanie przerwane. Dodano walidację pola PoolIndex, które jest używane do odszukania właściwego desktryptora puli. W Windows 7 i wcześniej indeks ten nie był sprawdzany i możliwe było doprowadzenie do odwołania do nieistniejącego deskryptora i spowodowanie odwołania do zerowej strony pamięci poprzez wskaźnik typu NUll pointer. Umieszczając wcześniej swój kod w tej stronie (która byłaby zmapowana jednocześnie w przestrzeni jądra i aplikacji) atakujący mógłby doprowadzić do wykonania swojego kodu w przestrzeni jądra i podnieść swoje uprawnienia w systemie. Dodano szyfrowanie wskaźników do procesów przy alokacjach powiązanych z procesami. Wyłączono możliwość wykonywania kodu dla puli niestronicowanej, co ma zapobiec wykonaniu shellcode'u wstrzykniętego do przestrzeni jądra.

Tym, co widać na pierwszy rzut oka w Windows 8 to szybszy start. Częściowo jest to zasługa ulepszonej obsługi standardu UEFI (dostępny w niektórych nowszych płytach głównych), ale też nowego typu hibernacji systemu. Polega on na tym, że sesja użytkownika, czyli aplikacje oraz usługi, są normalnie zamykane, jednak sesja jądra jest hibernowana, czyli pamięć z przestrzeni jądra systemu jest zapisywana na dysk. Dzięki temu przy starcie ładowanie jądra i sterowników trwa bardzo szybko. Oczywiście inicjalizacja sterowników jest wykonywana gdyż stanu urządzeń nie da się odtworzyć z pliku hibernacji. Dzięki tym optymalizacjom start Windows 8 może zamknąć się w czasie nawet kilku sekund.

30 grudnia 2012
We wrześniu 2011 miałem okazję spędzić 5 tygodni na tzw. mini-wolontariacie w Kenii. Wyjazd był organizowany przez dziewczynę z jezuickiego duszpasterstwa akademickiego DĄB, której marzeniem był wyjazd roczny do Kenii. Zebrała grupę osób, które chciały pojechać z nią, ale pozostać w Afryce tylko przez miesiąc. W ten sposób znalazłem się w okolicach równika.

Pierwsze wrażenie? Zimno. Z powodu przedłużającej się pory deszczowej temperatura oscylowała w okolicach 10 stopni. Dodatkowo z powodu zgubienia bagażu przez linię lotniczą, nie miałem przez kilka pierwszych dni nic cieplejszego do ubrania. Później pogoda poprawiła się, ale i tak było sporo deszczowych i chłodnych dni.

Naszym celem był ośrodek St. Martin w Nyahururu. Został on założony kilkanaście lat temu przez włoskiego księdza, ojca Gabriela. Skłoniła go do tego ilość problemów, z którymi musi się zmagać miejscowa ludność. Przede wszystkim są to ludzie niepełnosprawni i upośledzeni. Jego poprzednik sądził, że taki osób może być w okolicy kilkanaście. Okazało się jednak, że są ich setki. Ze względu na mentalność Kenijczyków osoby niepełnosprawne i upośledzone są traktowane jako przekleństwo i są ukrywane przed innymi mieszkańcami wioski. Nie dość, że cierpią, to jeszcze latami nie są przez swoje własne rodziny wypuszczane z domów, światło słoneczne widzą tylko, gdy prześwituje przez ściany chaty. Dodatkowo niepełnosprawność pojawiała się statystycznie zbyt często niż spotyka się to normalnie. Jest to wynikiem przemocy wobec kobiet ze strony ich mężów, nawet gdy kobiety te znajdują się w ciąży. Założony przez ojca Gabriela ośrodek ma na celu zmienić tę sytuację. Propaguje prawdę, że każdy człowiek jest darem, szczególnie niepełnosprawny.

Ośrodek St. Martin zajmuje się też uzależnieniami od alkoholu i narkotyków, dziećmi ulicy, oraz wspieraniem przedsiębiorczości. Hasłem ośrodka jest "Only through community", gdyż stawia na lokalne społeczności. St. Martin ma ponad tysiąc wolontariuszy. Nie są to jednak obcokrajowcy, ale mieszkańcy poszczególnych wiosek, który razem działają na rzecz rozwiązywania występujących u nich problemów. Zajmują się opieką nad osobami starszymi i niepełnosprawnymi, zbierają pieniądze na leczenie oraz edukację dla tych, których na to nie stać, a także otwieranie biznesów, np. hodowli kur. Celem St. Martin jest, aby ludzie potrafili sobie nawzajem pomagać. Nie zajmuje się przekazywaniem pieniędzy albo produktów z Zachodu. Taka pomoc byłaby szkodliwa, nie działa bowiem stymulująco, a wręcz przeciwnie, niszczy lokalną inicjatywę i sprawia, że działalność gospodarcza staje się nieopłacalna. Powoduje uzależnienie od bardziej rozwiniętych krajów i prowadzi do pewnej formy neokolonializmu.

Ojciec Gabriel uczył nas, że przyjeżdżając z Europy i spotykając się podopiecznymi ośrodka, np. dziećmi z wirusem HIV, nie możemy ich w żaden sposób traktować z wyższością. I nie chodzi nawet o to, że np. moglibyśmy czuć się lepszymi, ale samo ofiarowywanie pieniędzy albo jakiejś rzeczy może tworzyć pewną asymetrię. A tak naprawdę ci ludzie nie potrzebują od nas pomocy materialnej. Osierocone dziecko z HIV, które przeszło przez piekło na ziemi, nie potrzebuje nowej zabawki. Potrzebuje żeby z nim być, porzucać z nim piłką i obejrzeć razem króliki z hodowli oraz kameleony ukrywające się w krzakach.

Wspomniałem o piekle. Kenia i inne kraje afrykańskie zmagają się wieloma problemami, które sprawiają, że życie tam jest bardzo trudne. I nie są to problemy, które przyszły z zewnątrz. Jednym z nich jest system plemienny, który generuje nieufność i wrogość. Przykładowo osobie z jednego plemienia trudno jest dostać pracę na terenie, gdzie większość stanowią członkowie innego plemienia. Zdarza się też, że jedna wioska napada na drugą żeby ukraść bydło. Przeróżnych podziałów jest dużo i bardzo łatwo sprowokować ludzi do sięgnięcia po broń. W ten sposób kilka lat temu wybuchła w Kenii wojna domowa.

Kenia nie jest bezpieczna, bardzo łatwo zostać napadniętym. Poruszanie się po zmroku jest bardzo niewskazane. Częstym widokiem jest drut kolczasty, który jest praktycznie wszędzie, używa się go nawet do grodzenia trawników w parku. Charakterystyczne są też mury, które na szczycie mają wbetonowane wystające kawałki tłuczonego szkła. Pod koniec wyjazdu ciągłe poczucie zagrożenia stawało się już dla mnie nieznośne.

Zaatakowanym można zostać za wyglądanie na bogatego. Gdy jest się białym automatycznie traktowanym się jest jak chodzący bankomat. Nie każdy Kenijczyk ma takie nastawienie, ale jest ono dosyć często spotykane i utrudnia zawarcie jakiejś normalnej znajomości. Problemem wielu Kenijczyków jest to, że są biedni, ale nie wiedzą dlaczego. Są przyzwyczajeni, że biali mają pieniądze i że można je od nich wyprosić. Podejmowanie pracy nie cieszy się dużą popularnością, trudno też o rzetelnego pracownika. Ta mentalność prowadzi do zazdrości i zawiści, które mają efekty trudne dla nas do pojęcia, szczególnie w slumsach. Odwiedzenie tam kogoś może oznaczać dla niego problemy, spotka się bowiem z głosami w rodzaju: "Był u Ciebie biały, pewnie zostawił Ci pieniądze".

Innym problemem jest przemoc na tle seksualnym. Na porządku dziennym są gwałty i molestowanie dzieci. Molestowanie, wbrew powszechnemu przekonaniu, nie ma miejsca zwykle ze strony nieznajomych, ale zdarza się w rodzinie, ze strony wujka, cioci albo sąsiada. W przypadku gwałtów bywają z kolei przypadki, że brat oddaje siostrę kolegom za równowartość kilku złotych.

Do tego miejsca nie napisałem jeszcze nic o naszym pobycie w St. Martin. W krajach rozwiniętych można przyjechać np. do domu dziecka na wolontariat i skupić się na tym, co się tam dzieje. W Afryce natomiast bardzo ważne jest to całe tło, skomplikowana sytuacja charakteryzująca się silnymi kontrastami. Pracownicy i wolontariusze ośrodka St. Martin okazali się być wspaniałymi ludźmi, którzy bardzo się o nas troszczyli. Bez nich ten pobyt nie byłby taki sam. To od jednego z nich na samym początku dostałem kurtkę, dzięki której było mi w miarę ciepło do czasu odzyskania zagubionego bagażu. Z kolei nasz kierowca bardzo chciał nam pokazać słonie, które nieraz pojawiały się w okolicy, przez którą codziennie przejeżdżaliśmy w drodze z miejsca zakwaterowania do ośrodka. Wypytywał okolicznych mieszkańców o to gdzie i kiedy widzieli ostatnio słonie. I pewnego razu, wcześnie rano, przyjechał do nas z wiadomością, że słonie są niedaleko drogi. Szybko tam pojechaliśmy i mogliśmy zobaczyć je na własne oczy. Bardzo o nas dbała także gospodyni, dzięki której nigdy nie chodziliśmy głodni i która nawet czyściła nasze buty, gdy wracaliśmy z wyjazdów po kenijskich bezdrożach. Otrzymaliśmy wiele dobrego także od innych osób związanych z St. Martin. Bardzo się cieszę, że mogłem je poznać.

Jeszcze innym kontrastem jest wytrzymałość Afrykańczyków. Wielu z niech przeszło przez bardzo dramatyczne wydarzenia w swoim życiu, a mimo to próbują żyć dalej i cieszyć się życiem. Wielu z nas na ich miejscu już dawno znalazłoby się w pokoju bez klamek.

Jeszcze przed wyjazdem wiedzieliśmy, że w St. Martin nie będziemy wykonywać jakiegoś wielkiego dzieła. I faktycznie, naszym głównym zadaniem było nie przeszkadzać. Poza tym przed samym wyjazdem okazało się, że w St. Martin będziemy mogli być tylko przez dwa tygodnie. Czas spędziliśmy jednak intensywnie, uczestnicząc we wszystkich prowadzonych przez ośrodek programach. Obszar, na którym działa St. Martin jest bardzo duży, oznaczało to więc długie podróże po kenijskich bezdrożach. Charakterystyczna czerwona afrykańska gleba ma to do siebie, że po deszczu zamienia się w nieprzejezdne grzęzawisko, w którym nawet toyota z napędem 4x4 wymaga pomocy okolicznych mieszkańców, a nieraz także sprowadzania dodatkowych samochodów, aby wyciągnąć z błota zakopany pojazd. Natomiast gdy ziemia wyschnie, nie staje się piaszczysta, ale twarda i nierówna. Niezależnie więc od warunków pogodowych podróżowanie jest trudne. Dróg asfaltowych jest niewiele i są one w złym stanie.

W każdym razie pobyt w ośrodku St. Martin był wspaniałą okazją do zobaczenia życia Kenijczyków z bliska. Odwiedzając z wolontariuszami podopiecznych ośrodka docieraliśmy do najmniejszych wiosek i odwiedzaliśmy ich mieszkańców w ich domach. Mogliśmy też próbować z nimi rozmawiać, ale nie zawsze było to łatwe ze względu na barierę językową. Oni nie zawsze znali angielski, mimo że jest on w Kenii jednym z języków urzędowych, my z kolei nie znaliśmy ich języka plemiennego. Na szczęście wolontariusze chętnie nam wszystko tłumaczyli.

Ponieważ o tym, że w St. Martin będziemy mogli być tylko dwa tygodnie, dowiedzieliśmy się w ostatniej chwili przed wyjazdem, musieliśmy coś wymyślić na pozostałe trzy tygodnie. Znaleźliśmy Siostry Misjonarki Świętej Rodziny, które działają m.in. w Kenii w różnych miejscach. Odwiedziliśmy dwa z nich: dom w Nairobi, stolicy Kenii, oraz Kithatu, wiosce znajdującej się niedaleko góry Mt. Kenia, najwyższej w Kenii. W obu miejscach pomagaliśmy przy pracach remontowo-budowlanych oraz przy adopcji serca. Adopcja serca jest formą pomocy konkretnemu dziecku przez przekazywanie pieniędzy na jego edukację i utrzymanie. Aby taka pomoc miała sens, wymagana jest dokładna wiedza o sytuacji materialnej konkretnych rodzin a także rozliczanie ich z przekazanych funduszy. Dlatego osoby otrzymujące pomoc muszą przynosić rachunki ze sklepów, które jednak i tak są często sfałszowane. Z kolei osoby wysyłające pieniądze chciałyby otrzymywać jakieś informacje o wspieranych dzieciach. Dlatego nasza pomoc przy adopcji serca polegała m.in. na przeprowadzaniu wywiadów z dziećmi oraz przepisywaniu ocen z ich kart ocen ze szkoły. Potem na podstawie tych danych pisaliśmy listy do darczyńców. W Kithatu siostry prowadzą przedszkole, szkołę i przychodnię. Tutaj można było też bardziej bezpośrednio niż w stolicy obserwować codzienne życie.

Było to też dobre miejsce wypadowe na Mt. Kenia. Ponieważ nie mieliśmy doświadczenia ani sprzętu alpinistycznego, postanowiliśmy w grupie czterech osób wejść na trzeci co do wysokości szczyt góry - Point Lenana (4985 mnpm). Wyjechaliśmy przed świtem. W wiosce Chogoria czekał na nas przewodnik i kierowca z samochodem. Rano dotarliśmy do granicy parku narodowego, na terenie którego znajduje się Mt. Kenia. Przejechaliśmy jeszcze pewien odcinek i na wysokości 3300 mnpm zostawiliśmy samochód i udaliśmy się w dalszą drogę pieszo. Wieczorem dotarliśmy do chaty, w której mieliśmy przenocować. W naszym planie było dotarcie na szczyt przed wschodem słońca. W związku z tym pobudka była o 3 rano. Niestety na takiej wysokości warunki były bardzo trudne: mróz, silny wiatr, brak tlenu. Na szczyt weszliśmy już po wschodzie słońca i tylko we trójkę. Piękne widoki na prawie pięciu tysiącach metrów jednak wszystko zrekompensowały.

Powyższy opis to tylko bardzo skrótowe przedstawienie tego wszystkiego, co się wydarzyło podczas naszego wyjazdu, i z pewnością nie daje pełnego obrazu naszych przeżyć. Mam jednak nadzieję, że daje trochę informacji i może być pomocny dla osób planujących tego typu wyjazd. W każdym razie chcę pokazać, że potrzebne jest odpowiednie nastawienie, a może nawet jego brak, ze względu na to, że Afryka to miejsce, w którym planowanie nie ma często sensu. Na pewno nie można jechać tam z poczuciem misji ratowania kontynentu. W Afryce jest z pewnością wiele do zrobienia, ale też nie jest tak, że brakuje tam rąk do pracy. Jeśli już to brak chętnych i umiejących zająć się konkretnymi sprawami. Ośrodek St. Martin jest wspaniałym miejscem, ponieważ uczy lokalną społeczność rozwiązywać samodzielnie jej własne problemy i stosuje przy tym europejski model organizacji pracy. Wolontariuszami są sami Kenijczycy. Pobyt w St. Martin oraz u Sióstr utwierdził mnie w przekonaniu, że pomagać trzeba mądrze. Nie wszystko, co wydaje się pomocą jest nią w rzeczywistości.

Powszechny jest pogląd, że tzw. Zachód za mało interesuje się problemami Afryki. Jest dokładnie odwrotnie. Od momentu odzyskania niepodległości przez państwa afrykańskie dotarły tam setki miliardów dolarów pomocy, które jakoś szczęścia Afrykańczykom nie przyniosły, przeciwnie, doprowadziły do uzależnienia ich od zewnątrz. Obecność Zachodu to też np. rabunkowa eksploatacja złóż naturalnych. Jest ona oczywiście zła, ale nie miałaby miejsca gdyby nie pozwalali na nią skorumpowani afrykańscy politycy. Krytykuje się też firmy, które niby mało płacą swoim afrykańskim pracownikom i w ten sposób ich wyzyskują. Takie stwierdzenia łatwo przychodzą znając europejski standard życia. Jednak te płace wcale nie muszą być niskie na warunki afrykańskie, poza tym domaganie się zamknięcia takich fabryk po prostu doprowadzi do bezrobocia wśród ich pracowników. Ale to na marginesie. Chodzi o to, że problemem Afryki nie jest brak pieniędzy. Problemem są ciągle wybuchające konflikty zbrojne, AIDS oraz różne idiotyczne pomysły, w rodzaju rytualnego okaleczania dziewczynek. Te czynniki razem z dużym przyrostem naturalnym wywołują strach w różnych zachodnich rządach i organizacjach. Dlatego tak bardzo promują w Afryce antykoncepcję, nieraz przy tym szantażując afrykańskie rządy groźbą wstrzymania pomocy gospodarczej. Tak więc zaangażowanie Zachodu w Afryce jest duże, zarówno w działaniach negatywnych jak i w zamierzeniu przynajmniej pozytywnych.

Odmienną natomiast strategię przyjęli Chińczycy. Oni po prostu z Afrykańczykami handlują, nie traktując ich jak kogoś wymagającego specjalnej troski, tylko równorzędnego partnera. Kenijskie sklepy pełne są chińskich towarów. W Afryce Zachodniej aktywni są też Hindusi, którzy zakładają tam sklepy.

Do Afryki na pewno warto pojechać, przyjrzeć się z bliska jak wygląda tamtejsza sytuacja. Jeśli jedzie się z myślą o wolontariacie, trzeba pamiętać, że pomaganie musi być mądre. Trzeba się dokładnie zastanowić co się chce robić i po co. Wolontariat nie ma być wyręczaniem kogoś. Trzeba też mieć świadomość, że podczas tego typu wyjazdów dostaje się znacznie więcej niż jest się samemu w stanie dać.


22 listopada 2012
Udostępniłem tekst pod tytułem Podatności aplikacji desktopowych. Jest to dosyć rozbudowany przegląd dziur jakie można spotkać w oprogramowaniu. Opisuję w nim przepełnienia buforów na stosie oraz stercie, wykorzystanie Structured Exception Handling, path traversal, use after free, time of check to time of use, null pointer dereference oraz inne podatności. Przedstawione zostały także mechanizmy zabezpieczające, takie jak stack cookies oraz inne zabezpieczenia wprowadzane przez kompilator Visual Studio, Data Execution Prevention, Address Space Layout Randomization, zabezpieczenia sterty, SafeSEH i SEHOP. Wyjaśniona została także koncepcja return oriented programming (ret2libc), heap spraying oraz tematyka wykrywania dziur i pisania exploitów. Miłego czytania :)


10 września 2012
Pomyślałem, że fajnie byłoby spojrzeć na logi z ostatnio opisanego ataku od strony statystycznej: jakie konta były najczęściej atakowane i z jakich adresów przeprowadzano atak. Do tego celu wykorzystałem PowerShell. Powstały dwa skrypty, które realizują wspomniane zadania.

Get-WinEvent -filterhashtable @{logname='security';id=4625} |% {([regex]"Nazwa konta:\s*(.*)").matches($_.Message)[1].groups[1].value} | group-object | sort count -descending | select count,name |% {write-host $_.count $_.name}
      

Najpierw, za pomocą cmdletu Get-WinEvent, pobieramy zdarzenia z dziennika bezpieczeństwa o identyfikatorze 4625. Następnie parsowany jest komunikat, który znajduje się we właściwości Message danego zdarzenia. Z niego, za pomocą wyrażenia regularnego, wyciągana jest nazwa konta. Ponieważ w komunikacie jest jeszcze konto komputera, i jest ono pierwsze, wybieramy drugie dopasowanie, znajdujące się pod indeksem 1. Podobnie wybieramy drugi element z tablicy Groups, gdyż interesuje nas to, co wyrażenie regularne łapie w nawias. Pod indeksem 0 jest bowiem całe dopasowanie. W tym momencie dostajemy listę kont. Wiele z nich się oczywiście powtarza. W związku z tym za pomocą Group-Object są one grupowane. Potem lista ta jest sortowana malejąco, w ten sposób dostajemy listę od najczęściej atakowanych kont do najrzadziej atakowanych. Ponieważ w wyniku grupowania dostajemy jeszcze kolumnę Group, pozbywamy się jej za pomocą cmdletu select, który wybiera tylko kolumny Count i Name. Tutaj jednak pojawia się problem. Otóż Select-Object (tutaj stosowany jest alias select) wybierając obiekty, opakowuje je w nowy obiekt. Skutkuje to tym, że przy wyświetlaniu są dodawane kropki. Nie wygląda to zbyt dobrze, w związku z czym w ostatniej fazie wyciągamy te obiekty z powrotem i wyświetlamy za pomocą Write-Host. Atakowanych kont było sporo, najczęstsze z nich:

658 administrator
160 admin
112 user
56 kierownik
54 test
52 user1
28 user3
27 user2
27 test1
24 admin1
18 support
17 server
17 adm
16 root
15 a
15 backup
15 aSPNET
15 sql
15 123
15 user4
15 user5
15 1
15 sUPPORT_388945a0
15 sys
14 test3
14 admin2
14 test2
13 john
13 guest
13 david
12 actuser
12 owner
12 console

Drugi skrypt jest bardzo podobny, różni się praktycznie tylko użytym wyrażeniem regularnym:

get-winevent -filterhashtable @{logname='security';id=4625} |% {([regex]"Adres.*:\s(.*)").matches($_.message)[0].groups[1].value}| group-object | sort count -descending | select count,name |% {write-host $_.Count $_.Name}

Wyniki są następujące:

1274 95.110.197.241
630 78.186.57.132
545 87.106.253.42
415 180.126.130.120
48 188.130.251.42
10 188.27.148.23

Jak widać, host opisywany przed trzema dniami, był najaktywniejszy. Żeby jednak statystyki były bardziej miarodajne, trzeba by zbierać logi przez dłuższy okres czasu, np. miesiąca, żeby mieć dane od większej liczby atakujących. W każdym razie przedstawione skrypty są całkiem dobrymi narzędziami do analizy windowsowego dziennika zdarzeń. Przerabiając je można wyciągać też różne inne informacje, niekoniecznie związane z bezpieczeństwem. PowerShell ma bardzo duże możliwości i pozwala na wygodną analizę logów.

7 września 2012
Dziś moją uwagę przykuło zwiększone obciążenie procesora, które na pierwszy rzut okna nie było uzasadnione (nie była włączona żadna wymagająca aplikacja). Rzut oka na Menedżer zadań ujawnił, że winowajcą są procesy winlogon.exe oraz LogonUI.exe.

Menedżer zadań

Trochę to dziwne, bo normalnie nie mają one za wiele do roboty, działają tylko w momencie logowania. A skoro to nie ja się loguję to znaczy, że ktoś inny się loguje, konkretnie przez usługę pulpitu zdalnego. netstat potwierdził moje podejrzenia.

netstat

Pozostało włączyć inspekcję logowania i spojrzeć jak idzie atakującemu.

Zasady zabezpieczeń lokalnych

W tym celu trzeba zajrzeć do Podglądu zdarzeń, do dziennika Zabezpieczenia. Interesują nas zdarzenia logowania, o identyfikatorze 4625. Windows odnotował u mnie 494 próby zalogowania w ciągu 38 minut. Atak trwał trochę dłużej, pewnie ok. godziny, nie od razu go zauważyłem.

Zasady zabezpieczeń lokalnych

Wśród kont, na które atakujący próbował się zalogować, były polskie imiona męskie i żeńskie, a także polskie słowa, które bywają używane jako nazwy kont, a także takie, które z niczym nie można skojarzyć i prawdę mówiąc nie wiem, czego atakujący się spodziewał używając ich. Co ciekawe atak pochodził z włoskiego IP. W bazie SANS można zobaczyć, że podobne ataki były już wykonywane z tego IP. Zerknąłem jeszcze na otwarte porty na atakującym hoście:

Starting Nmap 5.00 ( http://nmap.org ) at 2012-09-07 19:17 CEST
Interesting ports on host241-197-110-95.serverdedicati.aruba.it (95.110.197.241):
Not shown: 989 filtered ports
PORT      STATE SERVICE       VERSION
21/tcp    open  ftp           WarFTPd 1.82.00-RC13
80/tcp    open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
443/tcp   open  ssl/http      Apache httpd
3306/tcp  open  mysql         MySQL 5.5.17
3389/tcp  open  microsoft-rdp Microsoft Terminal Service
5357/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
8443/tcp  open  ssl/http      Apache httpd 2.2.21 ((Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1)
49153/tcp open  msrpc         Microsoft Windows RPC
49155/tcp open  msrpc         Microsoft Windows RPC
49157/tcp open  msrpc         Microsoft Windows RPC
49160/tcp open  msrpc         Microsoft Windows RPC
Service Info: OS: Windows

Dodatkowo fingerprinting systemu operacyjnego dał dokładniejszą informację na temat wersji Windows:

Running: Microsoft Windows Vista
OS details: Microsoft Windows Vista Home Premium SP1

Mamy więc Vistę z włączonym zdalnym pulpitem, serwerem MySQL, serwerem FTP, Apache oraz jakąś usługą Microsoftu. Piszę jakąś, ponieważ nie udało mi się określić czy to SQL Server Reporting Services, Web Deployment Agent Service (MsDepSvc) czy może jednak coś związanego z SSDP/UPnP, jak podpowiada nmap. Na Apache chodzi VTE CRM. W każdym razie mamy do czynienia z dedykowanym serwerem wykupionym we włoskiej firmie hostingowej Aruba, na którym ktoś postawił sobie Vistę i testuje sobie różne rzeczy, a od czasu do czasu bawi się w ataki. Hm, ale czy to jest na pewno Vista? Instalacja Visty jako systemu serwerowego na dedykowanej maszynie jest trochę dziwna. Podłączmy się więc przez zdalny pulpit. Widzimy ekran logowania włoskiego Windows Server 2008.

Zdalny pulpit

nmap jednak tak bardzo się nie pomylił, zarówno Vista jak i 2008 bazują bowiem na tym samym jądrze i kodzie bazowym. 2008 to taka serwerowa Vista, podobnie jak 2008 R2 to serwerowa Siódemka. Oprócz wersji systemu widać także konta użytkowników.

Ataki typu brute force są na porządku dziennym i nie ma potrzeby się nimi specjalnie przejmować, o ile udostępniane przez nas usługi są chronione odpowiednio silnymi hasłami i nie posiadają niezałatanych dziur. Nie mam więc zamiaru jakoś specjalnie męczyć tego serwerka. Trzeba jednak docenić, że atakujący nie wykorzystał jakiegoś przypadkowego słownika, ale zauważając, że mój komputer jest w Polsce, próbował włamać się używając polskich słów. Być może te słowa, które dziwnie brzmiały jako nazwy kont, były efektem nieudolnego tłumaczenia z włoskiego :)

28 sierpnia 2012
Wrzuciłem zdjęcia z wyjazdu do Chorwacji na paralotnie.

10 sierpnia 2012
Kiedyś kolega poprosił mnie o program, który pod Windows rozciągałby bieżące okno w pionie. W ten sposób powstał taki oto programik:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
  RECT posd;
  SystemParametersInfo(SPI_GETWORKAREA, NULL, &posd, 0);
  while (1) {
    if ((GetAsyncKeyState(0x4D)<0) && (GetAsyncKeyState(VK_SHIFT)<0) && ((GetAsyncKeyState(VK_RWIN)<0) || (GetAsyncKeyState(VK_LWIN)<0))) {
      HWND h = GetForegroundWindow();
      RECT pos;
      GetWindowRect(h, &pos);
      SetWindowPos(h, NULL, pos.left, 0, pos.right-pos.left, posd.bottom, NULL);
    }
    Sleep(20);
  }
  return 0;
}   
      

Jak widać, kod jest bardzo prosty. Najpierw pobierane są rozmiary pulpitu. Potem czekamy aż użytkownik wciśnie kombinację Win+Shift+M. Wtedy pobierany jest uchwyt do aktywnego okna a następnie jego rozmiary. Umożliwia to jego odpowiednie rozciągnięcie. Odstęp od lewego brzegu pulpitu zostaje zachowany, a odstęp górny jest wyzerowany, żeby dociągnąć okno do górnego brzegu. Szerokość pozostaje bez zmian. Wykonywane jest odejmowanie, gdyż GetWindowRect zwraca wartości bezwzględne. Wysokość zostaje ustawiona na wysokość pulpitu (roboczą, czyli bez paska zadań).

1 sierpnia 2012
Miałem niedawno okazję odwiedzić Wenezuelę i Kolumbię. Tym samym ilość odwiedzonych krajów wzrosła do 19 a kontynentów do 6. Przygoda była super. Nie jest to jednak strona podróżnicza, więc nie będę się rozpisywać. Niech zdjęcia mówią za siebie.
Wenezuela
Kolumbia

19 maja 2012
Ostatnio na Usenecie (kto dziś jeszcze pamięta co to jest?) pojawiło się pytanie o to, jak pod Windows uruchomić proces, a po zadanym czasie zabić go i potem to wszystko powtarzać w pętli. Pytanie było pod kątem rozwiązania za pomocą skryptu BAT/CMD. Jak się okazuje, jest to niby proste, ale nie do końca. Uruchomić proces możemy poleceniem start. Potem już jest gorzej, bo trzeba odczekać odpowiednią ilość czasu, np. 15 sekund. Niestety nikt w Microsofcie nie pomyślał o czymś takim jak polecenie do opóźnienia. Niektórzy kombinują z poleceniem ping, które wysyła pakiety ICMP co sekundę i można podać ilość pakietów a tym samym ilość sekund. Jest to jednak partyzantka. Żeby było bardziej elegancko, można sobie ściągnąć np. windowsowy port linuksowego polecenia sleep. Ale OK, przejdźmy do zabicia procesu. Mamy do tego polecenie taskkill, któremu możemy podać proces np. przez nazwę pliku exe, tytuł okna albo PID. Fajnie, ale co w momencie, gdy jest kilka takich samych procesów? Uruchamiając proces poleceniem start nie dostajemy jego PIDa. Można próbować po tytule okna jeśli w ogóle proces wyświetla jakieś okno. Tutaj z kolei mogą być konieczne symbole wieloznaczne, ale niestety działają one kiepsko. Nie można podać jako filtr wyrażenia zaczynającego się od gwiazdki, sama gwiazdka też nie działa. Nie wiem skąd założenie, że coś musi być przed gwiazdką, czyli że początek nazwy okna musi być stały. Tak więc jest dosyć kiepsko. Może dałoby się za pomocą tasklist pobrać początkową listę procesów, odpalić nowy proces przez start i porównać z nową listą procesów? Tylko w skrypcie BAT/CMD będzie to pewnie bardzo żmudne. A może ktoś ma jakiś pomysł? Ja tradycyjnie przy problemach ze skryptach oldschoolowej windowsowej powłoki polecam PowerShell:

while($true) {
   $app = start-process -passthru notepad
   sleep 5
   kill $app.Id
   $app = start-process -passthru calc
   sleep 5
   kill $app.Id
}


Parametr -passthru jest konieczny, gdyż inaczej start-process nie zwraca obiektu.

29 stycznia 2012
Na grupie dyskusyjnej pojawił się problem generowania nazw plików. Jest sobie takie polecenie:

iconv.exe -t utf-8 "source.txt" > "target.txt"

Chodzi o to, że jeśli istnieje plik target.txt, to żeby był tworzony plik target(1).txt itd. A jeśli istnieje np. target(5).txt a nie istnieje target(4).txt to żeby i tak był tworzony target(6).txt. Skrypt w PowerShellu, który to zadanie realizuje, może wyglądać tak:

$filename = "target.txt"
if(Test-Path "target.txt") {
   $number = ls | foreach { if($_.Name -match "target\((\d+)\)\.txt") {$matches[1]} } | sort -InputObject {[decimal]$_} | select -last 1
   $number++
   $filename = "`"target`(" + $number + "`).txt`""
}
$command = "iconv.exe -t utf-8 source.txt > " + $filename
Invoke-Expression $command

1 stycznia 2011
Kilka ciekawych cytatów do zastanowienia. Pochodzą z najnowszej książki Szymona Hołowni "Bóg. Życie i twórczość".

(...) czystość serca - prawda życia, dostrzeganie i niezrywanie delikatnych nici relacji między światem zmysłowym i duchowym (kto nie rozumie zależności między swoją seksualnością i duchowością, nigdy nie pojmie relacji między ciałem a duszą, człowiekiem a Bogiem).

(...) jeśliby wydarzenie w Kanie czytać jako historię o ludzkim cierpieniu (choć brak wina dla wielu bywa też błogosławieństwem), Maryja daje ciekawą podpowiedź, jak należy postępować z Bogiem. Po takiej odpowiedzi swojego Syna idzie bowiem do organizatorów imprezy i zapowiada im, że On na pewno coś zaradzi. Wspomniany już i nieoceniony doktor Jan Kozłowski, gdy rozbieraliśmy ten fragment na czynniki pierwsze, zwrócił uwagę, że można by go na dobrą sprawę zamknąć w schemacie następującym: Maryja do Jezusa: "Idź po bułki". Jezus: "To nie moja sprawa". Maryja: "W takim razie kup pięć". Może tak właśnie trzeba modlić się do Boga w sytuacjach, gdy czegoś nam brakuje i wydaje się nam, że Bóg milczy?

Filozof Jazek Wojtysiak (w miesięczniku "Znak", nr 632) pisze: Wyobraźmy sobie - jak zrobił to Leibniz - że całości pośredniej wiedzy Boga odpowiadają różne możliwe światy. W jednych zawsze świeci słońce, ale ludzie są przez to leniwi i przestają się rozwijać. W innych zawsze jest zimno i tylko nieliczne jednostki potrafią zachować pogodę ducha. W jeszcze innych są sami święci, co trąci nudą - gdzie indziej zaś przeważają bandyci, co grozi unicestwieniem samego świata. Przykłady można by mnożyć. Dla teisty jedno jest pewne - Bóg na podstawi swej pośredniej wiedzy wybiera do realizacji ten świat, w którym (mimo wszystko) zrealizuje się wiele dobra. Dlaczego więc doświadczamy tyle zła? Być może świat o mniejszej ilości zła nie byłby (nie jest) dla wolnych istot możliwy. Może w świecie takim nie mogłoby w szerszej perspektywie zrealizować się jakieś istotne i wielkie dobro.

18 sierpnia 2009
Dziś kolejny raz spotkałem się z przypadkiem podawania na forum różnych bzdurnych porad mających na celu przyspieszenie działania Windows. Chodziło o wartość NonPagedPoolSize w rejestrze, której ustawienie na 95% wielkości RAMu ma spowodować, że system będzie wykorzystywał całą pamięć a dopiero potem zacznie korzystać z pliku wymiany. Oczywiście nie jest to prawda, ponieważ wpis ten dotyczy niestronicowanej pamięci jądra a nie pamięci alokowanej przez aplikacje przestrzeni użytkownika. Ale nikt się nie zastanowi, nie pomyśli, nie poczyta, tylko przekleja "poradę" z forum na forum.
Inna popularna bezsensowna porada, żeby wielkość pliku wymiany ustawić proporcjonalnie do wielkości RAMu, ze współczynnikiem zwykle w okolicach 1,5. Już sama logika mówi, że to bez sensu. Wynika z tego zalecenia bowiem, że czym mamy więcej RAMu tym większy musimy zrobić swap. A po to przecież kupujemy RAM żeby komp nie musiał uciekać się do pliku wymiany tylko zawsze miał pod ręką pamięć fizyczną. Zgodnie z definicją, plik wymiany służy jako brakująca pamięć. Jego wielkość powinna być więc różnicą pomiędzy zapotrzebowaniem zgłaszanym przez nasze aplikacje a posiadaną pamięcią fizyczną. Nie mam pojęcia czemu tak prosta zależność jakoś uchodzi uwadze wielu ludzi i powtarzają bezsensowne brednie. Są też mniej ekstremalne porady, wynikające ze słabego rozumienia tekstu albo jakichś nieszczęśliwych skojarzeń. Można więc wyczytać np. że wartość SfcScan w rejestrze jest odpowiedzialna za uruchamianie chkdsk.exe podczas startu systemu albo że należy wyłączyć QoS bo zjada 20% pasma.
Problem z głupimi poradami jest nie tylko taki, że mogą one spowodować spadek wydajności systemu lub niestabilność. Na podstawie tych porad są potem tworzone programy, które mają powodować przyspieszenie pracy systemu. Zaznaczam wyraźnie, że nie chodzi mi tu o programy takie jak TweakUI, które pozwalają łatwo ustawić niektóre rzeczy i dostosować do swoich potrzeb. Mam na myśli aplikacje, których autorzy obiecują wzrost wydajności o kilkaset procent i chcą za te programy kasę. Nieraz w swoich opisach mają takie brednie, że aż naprawdę trudno uwierzyć, że ktoś to kupuje. Kiedyś widzialem program, który miał rzekomo instalować w Windowsie nowe, szybsze jądro. Bez komentarza. Tak więc nie dość, że ludzie mają potem porozwalane systemy to na dodatek za to płacą. Są też porady mówiące wprost o potrzebie instalacji jakiegoś programu: do czyszczenia rejestru, defragmentacji rejestru, defragmentacji pamięci itp. Ludziom potem puchnie głowa i myślą, że bez 10 specjalnych programików i 100 wpisów w rejestrze komp nie będzie działać.