Dieses Dokuwiki verwendet ein von Anymorphic Webdesign erstelltes Thema.
Prijevodi ove stranice:

Forenzika SQLite baza podataka

Sažetak

SQLite je lagani, ugrađeni sustav za upravljanje bazama podataka koji se široko koristi u mobilnim aplikacijama, web preglednicima i IoT uređajima. Zbog svoje rasprostranjenosti, SQLite baze podataka često predstavljaju vrijedan izvor digitalnih dokaza u forenzičkim istragama. Ovaj rad obrađuje temeljne koncepte forenzike SQLite baza podataka, način njihovog prikupljanja, strukturu datoteka i metode analize. Rad se detaljno bavi tehnikama oporavka obrisanih podataka iz WAL datoteka i freelist stranica, što omogućava rekonstrukciju izbrisanih informacija koje korisnici namjerno pokušavaju sakriti. U radu su prikazani praktični primjeri forenzičke analize popularnih mobilnih aplikacija poput WhatsApp-a, tehnike za ekstrakciju metapodataka te alati koji se koriste u profesionalnoj forenzičkoj praksi. Razmatrani su i izazovi s kojima se forenzičari susreću, poput enkripcije baza podataka i anti-forenzičkih tehnika.

Keywords: SQLite, digitalna forenzika, forenzika baza podataka, WAL datoteke, mobilna forenzika, podatak

Uvod

U današnjem digitalnom okruženju mobilni uređaji i aplikacije postali su glavni izvor komunikacije i pohrane osobnih podataka. Velika većina tih aplikacija koristi SQLite baze podataka za lokalnu pohranu informacija, što ih čini jednim od najvažnijih izvora digitalnih dokaza u forenzičkim istragama. SQLite je prisutan gotovo svugdje: u mobilnim operacijskim sustavima (Android i iOS), web preglednicima (Chrome, Firefox, Safari), aplikacijama za razmjenu poruka (WhatsApp, Viber, Telegram), društvenim mrežama i brojnim drugim aplikacijama.

Primjeri aplikacija koje koriste SQLite:

  1. WhatsApp – msgstore.db (poruke, kontakti, grupni razgovori)
  2. Google Chrome – History (povijest pretraživanja i preuzimanja)
  3. Android OS (contacts2.db (kontakti), telephony.db (SMS poruke))
  4. iOS (sms.db (SMS/iMessage), AddressBook.sqlitedb (kontakti))
  5. Viber – viber_messages (poruke i mediji)
  6. Facebook Messenger – threads_db2 (razgovori)

Upravo zbog ovako široke primjene, SQLite forenzika postala je nezaobilazna vještina u digitalnoj forenzici, osobito kod mobilnih istraga. Forenzičari mogu iz SQLite baza ekstraktirati poruke, lokacije, kontakte, povijest pretraživanja, vremenske oznake aktivnosti i mnoge druge vrijedne informacije. Cilj ovog rada je prikazati kako se SQLite baze prikupljaju, analiziraju i interpretiraju u forenzičkom kontekstu, s naglaskom na tehnike oporavka obrisanih podataka koji često predstavljaju najvažnije dokaze u istrazi.

Definicija SQLite forenzike

SQLite forenzika je poddisciplina digitalne i mobilne forenzike koja se bavi identifikacijom, prikupljanjem, analizom i prezentacijom SQLite baza podataka kao digitalnih dokaza. Elementi koji se analiziraju u SQLite forenzici uključuju strukturu baze podataka, aktivne zapise, metapodatke, obrisane zapise, WAL datoteke i slobodni prostor unutar baze. Cilj SQLite forenzike je osigurati dokaze koji se mogu koristiti u sudskim, administrativnim i građanskim postupcima u slučajevima računalnog kriminala, mobilne forenzike, kibernetičkih istraga i drugih pravnih postupaka. Za razliku od tradicionalne forenzike baza podataka, koja se često fokusira na velike klijent-poslužitelj sustave (Oracle, MySQL, PostgreSQL), SQLite forenzika specifična je po sljedećim obilježjima:

  • cijela baza podataka pohranjena je u jednoj datoteci
  • ne postoji centralni poslužitelj niti centralizirani sustav logiranja
  • podaci su lokalno pohranjeni na uređaju
  • enkripcija često nije prisutna, osim ako aplikacija ne implementira dodatna sigurnosna rješenja
  • obrisani podaci mogu ostati u slobodnom prostoru baze dulje vrijeme

Povijesni razvoj i značaj

SQLite je stvoren 2000. godine od strane D. Richarda Hippa kao lagano rješenje za pohranu podataka bez potrebe za poslužiteljem. Naziv „Lite” u SQLiteu ne odnosi se na funkcionalnost (koja je vrlo moćna), već na jednostavnost implementacije i mali memorijski otisak.

U početku je SQLite bio zamišljen kao jednostavna ugrađena baza podataka za aplikacije koje nisu trebale klijent-poslužitelj arhitekturu. Kako su mobilni uređaji postali sve rašireniji, SQLite je postao standardni način lokalne pohrane podataka na mobilnim platformama. U Androidu je SQLite prisutan od samih početaka platforme, a u iOS-u se također široko koristi u aplikacijama već dugi niz godina.

Forenzički značaj

Forenzička analiza SQLite baza postaje kritično važna zbog:

  • Široke primjene u mobilnim aplikacijama – mnoge aplikacije koriste SQLite za lokalnu pohranu podataka
  • Bogatstva podataka – poruke, lokacije, kontakti i povijest aktivnosti često se nalaze u SQLite bazama
  • Mogućnosti oporavka – obrisani podaci mogu ostati dostupni u slobodnom prostoru baze ili u WAL datotekama
  • Prihvatljivosti dokaza – SQLite podaci mogu biti prihvatljivi kao dokaz na sudu ako su prikupljeni i analizirani prema forenzičkim standardima
  • Podrške cyber istragama – SQLite baze mogu sadržavati informacije relevantne za analizu malwarea, botneta i drugih kibernetičkih aktivnosti

Prema smjernicama NIST-a za mobilnu forenziku, analiza lokalnih podataka na mobilnim uređajima, uključujući SQLite baze, predstavlja važan korak u digitalnoj forenzici.

Osnovne značajke SQLite baza podataka

SQLite je relacijski sustav za upravljanje bazama podataka koji ne koristi klijent–poslužitelj arhitekturu. Za razliku od tradicionalnih baza podataka poput MySQL-a ili PostgreSQL-a, SQLite pohranjuje cijelu bazu u jednu datoteku na disku i ne zahtijeva zaseban poslužiteljski proces.

Glavne karakteristike SQLitea uključuju serverless arhitekturu, pristup bez potrebe za konfiguracijom (zero-configuration), usklađenost s ACID načelima te podršku za većinu SQL-92 standarda. SQLite je cross-platform rješenje koje se ponaša identično na svim većim operacijskim sustavima.

Iz forenzičke perspektive, SQLite nudi jednostavniju analizu jer se svi podatci nalaze u jednoj datoteci koju je lako kopirati i analizirati. Međutim, određeni izazovi uključuju čest nedostatak enkripcije na razini baze podataka, nepostojanje centraliziranih log-datoteka te mogućnost trajnog brisanja podataka korištenjem naredbe VACUUM.

Struktura SQLite baze podataka

SQLite baza podataka organizirana je u stranice (pages) fiksne veličine, najčešće 4096 bajtova, iako veličina može varirati ovisno o konfiguraciji baze. Razumijevanje unutarnje strukture SQLite baze ključno je za naprednu forenzičku analizu i oporavak obrisanih podataka.

Database Header (prvih 100 bajtova)

Svaka SQLite baza započinje s 100-bajtnim zaglavljem (header) koje sadrži ključne informacije o strukturi baze:

  • Offset 0–15: “SQLite format 3\000” (magic string)
  • Offset 16–17: Veličina stranice (1024, 2048, 4096, 8192…)
  • Offset 18: Verzija formata za pisanje
  • Offset 19: Verzija formata za čitanje
  • Offset 40–43: Ukupan broj stranica u bazi
  • Offset 44–47: Prva freelist stranica (FORENZIČKI VAŽNO)
  • Offset 48–51: Ukupan broj freelist stranica

Forenzičar može ručno provjeriti je li datoteka valjana SQLite baza pregledom prvih 16 bajtova u hex editoru, gdje se mora pojaviti ASCII niz “SQLite format 3” s null-terminatorom (00).

Vrste stranica (Page types)

SQLite koristi nekoliko tipova stranica unutar baze podataka:

  1. Page 1 – sadrži database header i B-tree korijen tablice sqlite_master
  2. Internal B-tree pages – sadrže pokazivače na druge B-tree stranice
  3. Leaf B-tree pages – sadrže stvarne zapise tablica ili indeksa
  4. Freelist pages – stranice koje su označene kao obrisane(FORENZIČKI IZUZETNO VAŽNE)
  5. Overflow pages – koriste se za pohranu velikih vrijednosti koje ne stanu u jednu stranicu

Sistemska tablica sqlite_master

Svaka SQLite baza sadrži posebnu sistemsku tablicu sqlite_master koja pohranjuje kompletnu shemu baze podataka, uključujući definicije tablica, indeksa, viewova i triggera. Ova tablica je ključna za forenzičku analizu jer omogućuje razumijevanje strukture baze bez potrebe za vanjskom dokumentacijom. Pregledom tablice sqlite_master forenzičari mogu dobiti nazive tablica (npr. messages, contacts), definirane indekse (npr. idx_timestamp) te potpune SQL definicije svake strukture u bazi.

Zbog toga je analiza tablice sqlite_master gotovo uvijek prvi korak u forenzičkoj obradi SQLite baze.

Dodatne SQLite datoteke

Osim glavne .db datoteke, SQLite može koristiti i dodatne pomoćne datoteke:

  1. .journal datoteka
    • Rollback journal koji omogućuje atomske transakcije
    • Sadrži stare verzije stranica prije izmjena
    • Forenzički značaj: može sadržavati prethodno obrisane ili izmijenjene podatke
  2. .wal datoteka (Write-Ahead Log)
    • Moderniji mehanizam zapisivanja promjena
    • Sadrži nove izmjene koje još nisu zapisane u glavnu bazu
    • Forenzički značaj: IZUZETNO VAŽNA – često sadrži najnovije podatke, uključujući obrisane zapise
  3. shm datoteka (Shared Memory)
    • Pomoćna datoteka za indeksiranje WAL zapisa
    • Ograničen forenzički značaj, ali korisna za rekonstrukciju WAL stanja

Prikupljanje SQLite baza podataka u forenzičke svrhe

Prikupljanje SQLite baza mora se provoditi na forenzički ispravan način kako bi dokazi bili prihvatljivi na sudu. Osnovni principi uključuju očuvanje integriteta podataka, dokumentiranje lanca čuvanja i rad isključivo na kopiji podataka.

Lokacije SQLite baza podataka

Android:

  • /data/data/<package_name>/databases/
  • /data/data/com.whatsapp/databases/msgstore.db
  • /data/data/com.android.providers.contacts/databases/contacts2.db
  • /data/data/com.android.chrome/databases/webview.db

iOS:

  • /private/var/mobile/Containers/Data/Application/<app_GUID>/
  • /var/mobile/Library/SMS/sms.db
  • /var/mobile/Library/AddressBook/AddressBook.sqlitedb

Desktop sustavi:

  • Windows: C:\Users\<username>\AppData\Local\<app_name>\
  • macOS: /Users/<username>/Library/Application Support/<app_name>/
  • Linux: /home/<username>/.config/<app_name>/

Postupak prikupljanja

  1. Izrada forenzičke kopije
    • Prije analize izračunavaju se hash vrijednosti (MD5 i SHA-256). Analiza se provodi isključivo na kopiji, dok original ostaje netaknut.
  2. Prikupljanje povezanih datoteka
    • Ne smije se kopirati samo .db datoteka. Potrebno je prikupiti i:
      • .db-wal (Write-Ahead Log – često sadrži obrisane podatke)
      • .db-shm
      • .db-journal
  3. Osiguranje integriteta
    • Kopirane datoteke postavljaju se u read-only način rada, a lanac čuvanja se dokumentira.

Izazovi pri prikupljanju

Mobilni uređaji:

  • potreba za root/jailbreak ovlastima
  • logički backup (ADB, iTunes)
  • fizička ekstrakcija (JTAG, chip-off)

Enkripcija:

  • Android FDE/FBE
  • iOS Data Protection
  • Rješenje: prikupljanje dok je uređaj uključen i otključan

Live vs. Dead acquisition:

  • Live: veći pristup podacima, ali rizik izmjena
  • Dead: sigurnije, ali ograničeno kod enkripcije

Obrisani podaci i WAL datoteke

Brisanje zapisa u SQLite bazi ne znači automatski da su podaci trajno izbrisani. U praksi se obrisani podaci često mogu pronaći u WAL datotekama ili u freelist stranicama.

WAL (Write-Ahead Log)

U WAL modu, promjene se ne upisuju odmah u glavnu bazu. Umjesto toga, prvo se zapisuju u .wal datoteku. Tek kasnije se ti zapisi integriraju u glavnu bazu kroz proces nazvan checkpoint.

Kako WAL radi:

  1. Write – promjena se zapisuju u .wal
  2. Read – SQLite koristi najnoviju verziju podataka (iz WAL-a ili glavne baze)
  3. Checkpoint – sadržaj WAL-a se zapisuje u glavnu bazu
  4. Truncate – nakon checkpointa, WAL se resetira

Zašto je to važno u forenzici:

  • Obrisani zapisi mogu ostati u WAL datoteci i nakon brisanja u glavnoj bazi.
  • WAL se ne checkpointa odmah, pa može sadržavati podatke stare i više dana.
  • Checkpoint se događa pri zatvaranju aplikacije, kada WAL naraste ili ručno PRAGMA wal_checkpoint.

Freelist stranice (obrisani zapisi)

Kada se zapis obriše, SQLite ne briše odmah podatke s diska. Stranice koje više nisu u upotrebi dodaju se na freelist i mogu se ponovno koristiti kasnije. Do trenutka prepisivanja, podaci na tim stranicama mogu se forenzički oporaviti. Zašto je to važno:

  • Broj stranica u freelistu pokazuje količinu potencijalno obrisanih podataka.
  • Primjer: 47 stranica × 4096 B ≈ 188 KB podataka koji mogu biti prisutni i oporavljivi.

Ekstrakcija podataka iz freelista i WAL-a

U praksi se često izvlače čitljivi tekstualni nizovi (npr. minimalno 10 znakova) iz baze, uključujući WAL i freelist prostor. Zatim se filtriraju prema obrascima (telefoni, emailovi, imena itd.). Ova metoda često otkriva obrisane podatke koji još nisu prebrisani.

Vrijeme je ključ

Što je dulje prošlo od brisanja, veća je vjerojatnost da su podaci prebrisani novim zapisima. Zato je brzo prikupljanje dokaza i ograničavanje korištenja uređaja u forenzici presudno.

Oporavak izbrisanih podataka

Oporavak izbrisanih podataka najzahtjevniji je, ali i najvažniji dio SQLite forenzike. U većini istraga upravo izbrisane poruke predstavljaju ključne dokaze jer ih korisnici namjerno uklanjaju kako bi prikrili aktivnosti.

Tehnike oporavka

  1. Analiza WAL datoteke
    • Ako WAL datoteka postoji i još nije checkpointana, obrisani podaci mogu se u njoj i dalje nalaziti. Postupak uključuje izradu forenzičke kopije WAL datoteke, izradu dump-a baze prije i nakon checkpoint operacije te usporedbu rezultata. Razlike između ta dva stanja ukazuju na zapise koji su postojali samo u WAL-u, uključujući obrisane poruke.
  2. Ekstrakcija stringova
    • Ekstrakcija čitljivih stringova iz baze jednostavna je i brza metoda oporavka. Izvlače se tekstualni fragmenti iz cijele baze, uključujući freelist stranice. Nedostatak ove metode je gubitak strukture – dobiveni podatci nemaju kontekst i zahtijevaju ručnu analizu.
  3. Heksadecimalna analiza
    • Napredna tehnika koja uključuje analizu sirovih bajtova baze podataka. Forenzičari pretražuju karakteristične SQLite strukture (npr. leaf B-tree stranice koje započinju s bajtom 0x0D) kako bi identificirali obrisane zapise koji još nisu prebrisani.
  4. Specijalizirani forenzički alati - više o njima u poglavlju ispod

Primjer uspješnog oporavka

Scenarij: Osumnjičeni je obrisao WhatsApp poruke neposredno prije uhićenja.

Postupak: Utvrđeno je postojanje WAL datoteke veličine 2,3 MB, što upućuje na ne checkpointane promjene. Broj poruka u bazi iznosio je 1 523. Nakon izvršenja checkpoint operacije broj poruka porastao je na 1 543, što ukazuje na 20 zapisa koji su se nalazili isključivo u WAL datoteci. SQL upitima identificirani su zapisi koji su dodani tijekom checkpointa, čime su rekonstruirane obrisane poruke.

Rezultat: Uspješno je oporavljeno 20 WhatsApp poruka koje su bile obrisane, ali nisu bile trajno uklonjene jer WAL datoteka nije bila checkpointana prije forenzičke analize.

Alati za forenzičku analizu SQLite baza podataka

  • sqlite3 – službeni command-line alat za rad sa SQLite bazama; omogućuje izvođenje SQL upita, pregled strukture baze i osnovnu analizu podataka
  • DB Browser for SQLite – grafički alat s vizualnim prikazom tablica, SQL editorom i pregledom sheme baze
  • Autopsy / Sleuth Kit – open-source forenzička platforma s podrškom za automatsku detekciju SQLite baza, vremensku analizu i pretragu ključnih riječi
  • SQLite Forensic Explorer – specijalizirani alat za forenzičku analizu SQLite baza, uključujući oporavak obrisanih zapisa i WAL analizu
  • Oxygen Forensic – profesionalni alat za mobilnu forenziku s automatskom analizom aplikacijskih SQLite baza
  • Magnet AXIOM – sveobuhvatna forenzička platforma za analizu mobilnih uređaja i aplikacija koje koriste SQLite baze

Primjeri: Primjena SQLite forenzike

Primjer 1: Analiza WhatsApp komunikacije u kaznenom slučaju

Scenarij: Postoji sumnja da je osumnjičeni koristio aplikaciju WhatsApp za dogovaranje kriminalnih aktivnosti. Prikupljena je forenzička kopija mobilnog uređaja.

Postupak analize:

WhatsApp baza podataka msgstore.db locirana je u standardnoj Android lokaciji aplikacije /data/data/com.whatsapp/databases/. Nakon provjere integriteta datoteke pristupilo se analizi strukture baze, koja sadrži ključne tablice: messages (poruke), chat (razgovori), message_media (multimedijski sadržaj) i jid (identifikatori kontakata).

Analiza je započela identifikacijom najaktivnijih kontakata grupiranjem poruka prema identifikatorima kontakata, čime je izdvojeno deset najfrekventnijih komunikacijskih partnera.

Zatim je provedena ekstrakcija poruka za odabrane kontakte u kritičnom vremenskom razdoblju (10.–20. siječnja 2024.). Vremenske oznake konvertirane su iz Unix timestamp formata u čitljiv datum i vrijeme.

Dodatno je izvršena pretraga ključnih riječi unutar poruka, s fokusom na financijske pojmove (npr. novac, transfer, račun) radi identifikacije potencijalno inkriminirajuće komunikacije.

Rezultat: Identificirano je 47 poruka u kritičnom vremenskom razdoblju s izravnim referencama na financijske transakcije. Dodatno, analizom WAL datoteke uspješno je oporavljeno 12 obrisanih poruka koje nisu bile prisutne u glavnoj bazi.

Primjer 2: Oporavak obrisanih SMS poruka na Android uređaju

Scenarij: Osumnjičeni je obrisao SMS poruke neposredno prije uhićenja.

Postupak analize:

SMS poruke na Android uređajima pohranjuju se u sistemskoj SQLite bazi mmssms.db, smještenoj u direktoriju /data/data/com.android.providers.telephony/databases/. Baza sadrži tablicu sms s metapodacima i sadržajem tekstualnih poruka.

Tijekom analize utvrđena je prisutnost WAL datoteke uz glavnu bazu, što je ukazivalo na postojanje nesinkroniziranih zapisa.

Analiza je započela brojanjem SMS poruka u trenutnom stanju baze, pri čemu je identificirano 523 zapisa. Nakon izvođenja checkpoint operacije, kojom su podaci iz WAL-a integrirani u glavnu bazu, broj poruka povećao se na 538, što predstavlja razliku od 15 zapisa.

Ekstrahirane poruke sadržavale su telefonske brojeve pošiljatelja i primatelja, vremenske oznake, sadržaj poruke te smjer komunikacije (poslano ili primljeno). SQL upiti korišteni su za filtriranje zapisa dodanih nakon checkpointa.

Rezultat: Uspješno je oporavljeno 15 SMS poruka koje je korisnik obrisao, ali su ostale pohranjene u WAL datoteci zbog odgođene sinkronizacije.

Izazovi i ograničenja SQLite forenzike

SQLite forenzika suočava se s nizom tehničkih i proceduralnih izazova koji mogu značajno otežati ili u potpunosti onemogućiti analizu.

1. Enkripcija baza podataka

Problem:

Mnoge aplikacije koriste enkripciju SQLite baza kako bi zaštitile korisničke podatke. Najčešće implementacije uključuju:

  • SQLCipher – open-source enkripcija temeljena na AES-256 algoritmu
  • SQLite Encryption Extension (SEE) – službena komercijalna ekstenzija
  • Prilagođene (custom) metode enkripcije

Pokušaj otvaranja enkriptirane baze standardnim SQLite alatima rezultira greškom koja sugerira da datoteka nije valjana SQLite baza. Moguća rješenja:

  • pokušaj probijanja lozinke (ako je slaba)
  • memory forensics – ekstrakcija ključa iz radne memorije
  • izdvajanje ključa iz sigurnosnih kopija ili konfiguracijskih datoteka
  • reverse engineering aplikacije radi pronalaska ključeva ili algoritama

2. Anti-forenzičke tehnike

Problem:

Korisnici ili aplikacije mogu primijeniti tehnike kojima se namjerno otežava forenzička analiza.

  • Secure delete - Kada je omogućeno, SQLite odmah prepisuje obrisane zapise nulama umjesto da ih ostavi u freelistu, čime se onemogućuje oporavak obrisanih podataka.
  • VACUUM operacija - VACUUM reorganizira bazu i trajno uklanja sav slobodni (freelist) prostor. Nakon izvođenja ove operacije, oporavak obrisanih zapisa postaje iznimno težak ili nemoguć.

Protumjere:

  • brzo i pravovremeno prikupljanje dokaza
  • live forensics dok je uređaj uključen
  • izrada memory dumpova

3. Sinkronizacija s cloud servisima

Problem:

Moderne aplikacije često sinkroniziraju podatke s cloud servisima, zbog čega lokalna SQLite baza može sadržavati samo dio relevantnih podataka.

Rješenja:

  • forenzičko prikupljanje cloud podataka (uz odgovarajuću pravnu osnovu)
  • analiza API komunikacije aplikacije
  • mrežna (network) forenzika

Zaključak

SQLite baze podataka predstavljaju ključan izvor digitalnih dokaza u modernoj forenzici, osobito u analizi mobilnih uređaja i aplikacija. Zbog široke primjene i relativno jednostavne strukture, SQLite baze često sadrže vrijedne informacije o komunikaciji, aktivnostima i lokaciji korisnika, što ih čini nezaobilaznim elementom forenzičkih istraga.

Jedna od značajnih prednosti SQLite forenzike je mogućnost oporavka podataka koji su korisnici obrisali. Obrisani zapisi mogu ostati dostupni u WAL datotekama, freelist prostorima ili journal datotekama, ovisno o načinu rada baze i stanju zapisivanja. Upravo zato je važno provesti prikupljanje i analizu na ispravan način, kako bi se očuvala integritet i dobili relevantni dokazi. Istovremeno, SQLite forenzika se suočava s izazovima kao što su enkripcija baza, anti-forenzičke tehnike (npr. secure delete i VACUUM) te sinkronizacija s cloud servisima, što može ograničiti pristup podacima ili onemogućiti oporavak.

Zbog toga je za uspješnu analizu potrebno kombinirati tehničko znanje o strukturi SQLite baza s odgovarajućim alatima i forenzičkim postupcima.

U konačnici, razumijevanje unutarnje strukture SQLite baze, rada WAL mehanizma i mogućnosti oporavka obrisanih podataka čini SQLite forenziku neizostavnom vještinom u digitalnoj forenzici, a primjena ispravnih metoda prikupljanja i analize ključna je za valjanost dokaza.

Literatura

racfor_wiki/seminari2025/nb53918.txt · Zadnja izmjena: 2026/01/20 23:30 od Nikola Botić
Dieses Dokuwiki verwendet ein von Anymorphic Webdesign erstelltes Thema.
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0