Metoda Simpsona – algorytm w C++

Postanowiłem trochę ruszyć się tutaj i po długiej nieobecności dodaje kolejny wpis:), a więc od razu przechodząc do sedna, udostępniam kod wykorzystujący metodę Simpsona mojego autorstwa. Jest o tyle fajny że wypisuje wszystkie czynności które wykonuje. Algorytm napisany jest w języku C++. Należy pamiętać o modyfikacji 18 linii kodu (wrzucamy tam swoją funkcję), poniższy przykład kodu w C++ jest zbudowany dla całki (n=4):

\int_{0.5}^{1.5} \tfrac{dx}{ \sqrt{5x-2}}

Spójrz na linie 18 kodu ;)

#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <cmath>

/*

http://www.darksmark.pl

  Metoda Simpsona - C++
*/

using namespace std;

// tutaj umieszczamy nasza funkcje z całki!
double f(double x)
 {
  return (1/sqrt(5*x-2));
 }

 double Xp, Xk;
 double dx;
 int N;
 double x;
 double st, s;

int main(int argc, char *argv[])
{
    cout << "Podaj poczatek przedzialu calkowania: ";
    cin >> Xp;
    cout << "Podaj koniec przedzialu calkowania: ";
    cin >> Xk;
    cout << "Podaj N: ";
    cin >> N;

    cout << endl << "------------------------------" << endl << endl;
    cout << "Xp=" << Xp << ", Xk=" << Xk << ", N=" << N << endl;
    cout << "s=0, st=0" << endl << endl;

    dx=(Xk-Xp)/N;

    cout << "dx=(Xk-Xp)/N" << endl;
    cout << "dx=("<< Xk << "-" << Xp << ")/" << N <<endl;
    dx=(Xk-Xp)/N;
    cout << "dx=" << dx <<endl<<endl;

    for (int i=1; i<=N; i++) {
        cout << endl << endl <<"\tIteracja nr: " << i << endl << endl;
        cout << "x=xp+i*dx"<< endl;
        cout << "x=" << Xp << "+" << i << "*" << dx << endl;
        x=Xp+i*dx;
        cout << "x=" << x <<endl<<endl;
        cout << "st=st+f(x-dx/2)" << endl;
        cout << "st=" << st << "+f(" << x << "-(" << dx << "/2)" << endl;
        st=st+f(x-(dx/2));
        cout << "st=" << st << endl << endl; 

        if (i<N) {
           cout << "  interacyjne i mniejsze od N to licze:" << endl;
           cout << "  s=s+f(x)" << endl;
           cout << "  s=" << s << "+f(" << x << ")";
           s=s+f(x);
           cout << "s=" << s << endl;
        }

    }

    cout << endl << endl << "--------Wynikowe liczenie:--------" << endl; 

    cout << "s=dx/6*(f(Xp)+f(Xk)+2*s+4*st)" << endl;
    cout << "s=" << dx << "/6*(f(" << Xp << ")+f(" << Xk << ")+2*" << s << "+4*" << st << endl;
    s=dx/6*(f(Xp)+f(Xk)+2*s+4*st);
    cout << "s=" << s << endl;
    cout << endl << "wynik: " << s;

    cout << endl;
    getchar();
    getchar();
    return EXIT_SUCCESS;
}

 

Poniżej widzimy przebieg  działania programu: 

 

Podaj poczatek przedzialu calkowania: 0.5
Podaj koniec przedzialu calkowania: 1.5
Podaj N: 4
------------------------------

Xp=0.5, Xk=1.5, N=4
s=0, st=0

dx=(Xk-Xp)/N
dx=(1.5-0.5)/4
dx=0.25

	Iteracja nr: 1

x=xp+i*dx
x=0.5+1*0.25
x=0.75

st=st+f(x-dx/2)
st=0+f(0.75-(0.25/2)
st=0.942809

  interacyjne i mniejsze od N to licze:
  s=s+f(x)
  s=0+f(0.75)s=0.755929

	Iteracja nr: 2

x=xp+i*dx
x=0.5+2*0.25
x=1

st=st+f(x-dx/2)
st=0.942809+f(1-(0.25/2)
st=1.59169

  interacyjne i mniejsze od N to licze:
  s=s+f(x)
  s=0.755929+f(1)s=1.33328

	Iteracja nr: 3

x=xp+i*dx
x=0.5+3*0.25
x=1.25

st=st+f(x-dx/2)
st=1.59169+f(1.25-(0.25/2)
st=2.11692

  interacyjne i mniejsze od N to licze:
  s=s+f(x)
  s=1.33328+f(1.25)s=1.81835

	Iteracja nr: 4

x=xp+i*dx
x=0.5+4*0.25
x=1.5

st=st+f(x-dx/2)
st=2.11692+f(1.5-(0.25/2)
st=2.56983

--------Wynikowe liczenie:--------
s=dx/6*(f(Xp)+f(Xk)+2*s+4*st)
s=0.25/6*(f(0.5)+f(1.5)+2*1.81835+4*2.56983
s=0.656527

wynik: 0.656527

 … Czytaj dalej…

„Najprostszy na świecie” – licznik pobrań w PHP… ;)

Przeglądając stare serwery ftp znalazłem bardzo prosty licznik pobrań działający na plikach tekstowych. Napisałem go (i działał do tej pory bez zarzutów) dokładnie 4 lata temu (cóż za zbieg okoliczności!). Może się komuś przyda ;) . Minusem tego skryptu php (a może dla niektórych plusem) jest że zlicza każde pobranie/uruchomienie skryptu… Aby zliczać zupełnie indywidualne pobrania należałoby najlepiej za pomocą baz danych identyfikować użytkowników po IP i wartości boolowskiej czy pobrał czy nie, jednak czy jest sens prowadzenia statystyk indywidualnych pobrań? ;)

Plik pobierz.php:

<?php
$plik = "down.txt";

if (!file_exists($plik))  {
$file=fopen($plik, "w");
fwrite($file, 0);
}

$file=fopen($plik, "r");
flock($file, 1);
$ile=fread($file, 10);
flock($file, 3);
$ile++;
fclose($file);
$file=fopen($plik, "w");
flock($file, 2);
fwrite($file, $ile);
flock($file, 3);
fclose($file);
header("Location: download/plik.exe"); 

?>

 

Skrypt sprawdza czy istnieje plik down.txt, jeżeli nie istnieje to go tworzy i zapisuje w nim 0. Następnie otwiera ten plik tylko do odczytu i wczytuje do zmiennej $ile zawartość, zwiększa ją o jeden postinkrementacją. Otwiera następnie plik tylko do zapisu i zapisuje zwiększoną wartość zmiennej $ile w tym pliku. Następnie za pomocą nagłówków przeglądarki przekierowuje do folderu download i oczywiście pliku plik.exe. Wystarczy teraz tylko umieścić w folderze download plik.exe i na swojej stronie stworzyć link za pomocą czystego html do skryptu licz.php. Aby sprawdzić ile razy pobraliśmy plik wystarczy otworzyć ręcznie down.txt, możemy oczywiście napisać sobie nawet na podstawie powyższego kodu skrypcik wyświetlający zawartość tego licznika php. ;)Czytaj dalej…

Java, jak obliczyć silnie? dwa rozwiązania ;)

Nie będę się rozwodził czym jest silnia, od razu przejdę do rozwiązania problemu.

Rozwiązanie z użyciem inkrementacji:

public static int silnia (int n) {
    int iloczyn = 1;
    for (int i=1; i< =n; i++) {
        iloczyn *= i;
    }
    return iloczyn;
}

 

Rozwiązanie rekurencyjne:

public static int silnia_rekurencyjna (int n) {
    if (n==0)
        return 1;
    else
        return (n*silnia_rekurencyjna(n-1));
}

Które rozwiązanie lepsze? Jak się okazuje rekurencyjne choć w naturalny sposób czytelniejsze dla programisty jest wolniejsze. Wiąże się to z przekazywaniem parametrów poprzez stos i pamiętaniem ich w tzn kontekście w pamięci. Upraszczając, żeby obliczyć silnie rekurencyjnie musimy przejść przez wszystkie wywołania dla różnych wartości by obliczyć końcowy iloczyn czyli silnie. Wystarczy spojrzeć na czasy i wywołania w NetBeans dla parametru n=25, pozostawie to bez komentarza dla obu funkcji:

 … Czytaj dalej…

Jak ukryć adres IP, czyli tor w akcji!

Często się zdarza że nie chcemy ujawniać swojej tożsamości w sieci, rozwiązań jest kilka, ale najpopularniejszym posunięciem w celu ukryci swojego adresu IP jest używanie serwera proxy. Możemy poszukać w swojej ulubionej wyszukiwarce bramki proxy, lecz nie zawsze jest to wygodne rozwiązanie. Lepszym sposobem na anonimowość moim zdaniem jest używanie sieci tor, która zapewnia dosyć duży stopień anonimowości. W systemie Windows wystarczy że ściągniemy TOR’a z https://www.torproject.org/, paczkę rozpakujemy na pulpicie i już możemy surfować sobie ze zmienionym adresem IP. Pierwsze co to uruchamiamy aplikacje za pomocą Start Tor Browser.exe i czekamy aż aplikacja vidalia.exe się uruchomi, jeśli przeglądarka Firefox sama się nie odpali to robimy to ręcznie (dołączony folder FirefoxPortable). Zestaw działa automatycznie, dodatkowo w przenośnej wersji Firefoxa mamy doinstalowane odpowiednie wtyczki do włączania i wyłączania tora z poziomu przeglądarki. Surfowanie przebiega nieco dłużej, ponieważ połączenie odbywa się przez serwery pośredniczące tora. Swój obecny adres IP możemy sprawdzić sobie na stronie http://www.mojeip.net/. Połączenia cebulkowe tora możemy skonfigurować również pod inne aplikacje (np: przeglądarki, komunikatory itd) ściągając do nich odpowiednie rozszerzenia lub konfigurując je ręcznie (ustawienia dostępne w konfiguracji vidalia). Aplikacja jest w pełni darmowa i dostępna również na inne platformy.… Czytaj dalej…

Proste ukrywanie kodu skryptu php…

Prostym sposobem lecz niestety łatwo odwracalnym na ukrycie kawałka kodu php, jest użycie funkcji eval();base64_decode();. Pierwsza funkcja przyjmuje jeden argument, który jest kodem php do wykonania, druga funkcja może przyjmować więcej argumentów niż jeden ale są opcjonalne i nie będziemy ich używać. My przekażemy do niej tylko ciąg zakodowany w base64 (do rozkodowania). Więc zaczynamy:

  1. Tworzymy sobie skrypt php (pomijamy znaczniki początku i końca programu typu <?php ?>.
  2. Kodujemy stworzony skrypt na stronie takiej jak ta do base64.
  3. Wstawiamy kod zakodowany w base64 do funkcji eval(); dekodując go z powrotem:
  4. <?php
    eval(base64_decode("ZWNobygicHJ6eWtsYWQhIik7cGhwaW5mbygpOw=="));
    ?> 
  5. Gotowe! Należy pamiętać że używanie zmiennych globalnych w funkcji eval(); nie filtrowanych, może być bardzo niebezpieczne i wykorzystane przez cyberprzestępce.
  6. Czytaj dalej…

Jak złamać hasło do routera?

Czasami zdarza się że zapomnimy hasło do routera, więc jak odzyskać? Pierwsze co to sprawdźmy domyślne dane dostępowe, poszukajmy ich na naklejce pod routerem lub w instrukcji dołączonej do niego, ewentualnie skorzystajmy z pomocnej strony z domyślnymi loginami i hasłami do routera lub zajrzymy tutaj. Jeżeli dalej nic możemy router zresetować czyli przywrócić do ustawień fabrycznych. Na urządzeniu znajduję się specjalny do tego przycisk (często konieczne jest użycie igły), przytrzymujemy go kilkanaście sekund. Po tej operacji domyślne dane dostępowe do routera powinny działać. Jeśli nie mamy dostępu fizycznego do routera możemy użyć programu THC-HYDRA. Ja pokaże jak się nim posługiwać pod systemem Linux (dokładnie to Ubuntu 11.04). Więc zaczynamy:

  1. Pobieramy źródła hydry http://www.thc.org/releases/hydra-7.1-src.tar.gz
  2. Rozpakowujemy pobrane archiwum
  3. Z poziomu terminalu za pomocą „cd” przechodzimy do folderu z hydrą
  4. Wpisujemy ./configure
  5. Wpisujemy make i czekamy aż program się skompiluje
  6. Wpisujemy sudo make install i podajemy hasło administratora systemu
  7. Usuwamy ściągnięty folder z hydrą ;)

Gotowe, program został zainstalowany. Upewniamy się czy aby na pewno tak jest wpisując w terminalu hydra. Teraz musimy odnaleźć sobie na liście domyślnych haseł domyślny login do naszego routera. Następnie poszukajmy jakiegoś dużego słownika w postaci pliku tekstowego. Przykładowy słownik znajdziemy w moim repozytorium, możemy oczywiście stworzyć własny słownik. Skuteczność tego ataku (dictionary attak) jest zależna od czasu i wielkości słownika (czy hasło znajduje się w nim). Przejdźmy do samego łamania, pierwsze co to musimy zdobyć adres IP routera, wpisujemy w terminalu ifconfig, widzimy tam za frazą inet addr:192.168.2.100 – to nasze wewnętrzne IP. Najczęściej router posiada adres różniący się tylko ostatnim oktetem (liczba za ostatnią kropką), występuje tam przeważnie 1,  u mnie router ma IP 192.168.2.1. Możemy oczywiście to sprawdzić za pomocą konsolowego programu nmap wydając polecenie w terminalu nmap -sP 192.168.2.*, parametr -sP jak czytamy w dokumentacji programu „-sP: Skanowanie Ping - tylko wykrywanie dostępności hostów”, pinguje wszystkie komputery z zakresu (gwiazdka na końcu zastępuje od 1 do 254) zwracając wyniki. Gdy posiadamy już adres IP routera przechodzimy do samego ataku słownikowego:

  1. Ściągamy jakiś słownik, ja skorzystam z przykładowego z imionami.
  2. Wpisujemy w konsoli hydra -l admin -P imiona.txt -vV 192.168.2.1 http-get /
  3. Czekamy ;)

Oczywiście w miejsce admin wpisujemy swój login a w miejsce imiona.txt nazwę słownika no i oczywiście adres IP swojego routera ;) . Jak to łatwo zapamiętać? Parametr -l to login,  -P to password -vV to verbose mode czyli tryb gadatliwy (wyświetla więcej informacji), możemy pominąć ten parametr (wypróbujcie jak  działa bez niego).

Filmik z całej tej operacji (hasło to „Patryk” i znajduje się w słowniku):


Więcej informacji o opcjonalnych parametrach programu uzystakamy wpisując w terminalu man hydra.

HYDRA(1)                                                              HYDRA(1)

NAME
       hydra  - a very fast network logon cracker which support many different
       services

SYNOPSIS
       hydra
        [[[-l LOGIN|-L FILE] [-p PASS|-P FILE|-x OPT]] | [-C FILE]] [-e ns]
        [-u] [-f] [-M FILE] [-o FILE] [-t TASKS] [-w TIME] [-W TIME]
        [-s PORT] [-S] [-4/6] [-vV]
        server service [OPTIONAL_SERVICE_PARAMETER]

DESCRIPTION
       Hydra is a parallized login cracker which supports  numerous  protocols
       to attack. New modules are easy to add, beside that, it is flexible and
       very fast.

       This tool gives researchers and security consultants the possiblity  to
       show  how easy it would be to gain unauthorized access from remote to a
       system.

       Currently this tool supports:
        AFP, Cisco AAA, Cisco auth, Cisco enable, CVS, Firebird, FTP,
        HTTP-FORM-GET, HTTP-FORM-POST, HTTP-GET, HTTP-HEAD, HTTP-PROXY,
        ICQ, IMAP, IRC, LDAP2, LDAP3, MS-SQL, MYSQL, NCP, NNTP, Oracle,
        Oracle-Listener, Oracle-SID, PC-Anywhere, PCNFS, POP3, POSTGRES,
        RDP, REXEC, RLOGIN, RSH, SAP/R3, SIP, SMB, SMTP, SMTP-Enum, SNMP,
        SOCKS5, SSH(v1 and v2), Subversion, Teamspeak (TS2), Telnet,
        VMware-Auth, VNC and XMPP.
        For most protols, SSL mode is available (e.g. https-get, ftps, etc.)
        If not all necessary libraries are found during compile time, your
        available services will be less. Type "hydra" to see  what  is  avail‐
       able.

Options
       target a  target to attack, can be an IPv4 address, IPv6 address or DNS
              name.

       service
              a service to attack, see the list of protocols available

       OPTIONAL SERVICE PARAMETER
              Some modules have optional or mandatory options. type "hydra  -U
              <servicename>"
               to get help on on the options of a service.

       -R     restore  a  previously aborted session. Requires a hydra.restore
              file was written. No other options are allowed when using -R

       -S     connect via SSL

       -s PORT
              if the service is on a different default port, define it here

       -l LOGIN
              or -L FILE login with LOGIN name, or load  several  logins  from
              FILE

       -p PASS
              or  -P  FILE  try  password PASS, or load several passwords from
              FILE

       -x min:max:charset
              generate passwords from min to max length. charset can contain 1
               for numbers, a for lowcase and A for upcase characters.
               Any other character is added is put to the list.
                 Example: 1:2:a1%.
                 The generated passwords will be of length 1 to 2 and contain
                 lowcase letters, numbers and/or percent signs and dots.

       -e ns  additional checks, "n" for null password, "s" try login as pass

       -C FILE
              colon separated "login:pass" format, instead of -L/-P options

       -u     by default Hydra checks all passwords for  one  login  and  then
              tries the next login. This option loops around the passwords, so
              the first password is tried on all logins, then the  next  pass‐
              word.

       -f     exit after the first found login/password pair (per host if -M)

       -M FILE
              server list for parallel attacks, one entry per line

       -o FILE
              write found login/password pairs to FILE instead of stdout

       -t TASKS
              run TASKS number of connects in parallel (default: 16)

       -w TIME
              defines the max wait time in seconds for responses (default: 32)

       -w TIME
              defines  a  wait  time  between each connection a task performs.
              This usually only makes sense if a low task number is used, .e.g
              -t 1

       -4 / -6
              prefer IPv4 (default) or IPv6 addresses

       -v / -V
              verbose mode / show login+pass combination for each attempt

       -h, --help
              Show summary of options.

       SEE ALSO
              xhydra(1), pw-inspector(1).
              The programs are documented fully by van Hauser <vh@thc.org>

AUTHOR
       hydra was written by van Hauser / THC <vh@thc.org> and co-maintained by
       David Maciejak <david.maciejak@gmail.com>.

       This manual page was written by Daniel Echeverry <epsilon77@gmail.com>,
       for the Debian project 

Czytaj dalej…

Chromium, profil, problem?

Właśnie dzisiaj w nocy po automatycznej aktualizacji kilku plików (Ubuntu 11.04), moje Chromium odmówiło posłuszeństwa. Przy uruchamianiu wyświetla komunikat „Nie można poprawnie otworzyć profilu. Niektóre funkcje mogą być niedostępne. Sprawdź, czy profil istnieje oraz czy masz uprawnienia do odczytu i zapisu jego zawartości.” Pierwsze co to wydałem polecenie ls -la .config/chromium/  i zobaczyłem że prawa dostępu do plików są raczej w porządku drwx——  5 smark smark    4096 2011-09-23 00:29 . Rozwiązałem problem tworząc całkiem nowy profil z ustawieniami przeglądarki. Udałem się do Miejsca -> Katalog domowy, z górnej belki wybrałem Widok -> Wyświetlanie ukrytych plików, przeszedłem do katalogu .config, zmieniłem nazwę folderu chromium na chromium_kopia i uruchomiłem ponownie moją przeglądarkę. W podanej lokalizacji utworzył się automatycznie nowy profil (katalog) o nazwie chromium. Teraz skopiowałem plik ze starymi zakładkami z katalogu chromium_kopia/Default/Bookmarks do nowo utworzonego chromium/Default i teraz znowu cieszę się moją ukochaną przeglądarką ;)Czytaj dalej…