haker.info  — Etyczny hacking_
Spreading knowledge like a virus.

 Dekodowanie kodu Aztec 2D z dowodu rejestracyjnego

   Dawid Farbaniec    2290 s艂贸w

1. Kod Aztec 2D z dowodu rejestracyjnego

W dowodzie rejestracyjnym pojazdu mo偶na zauwa偶y膰 kod dwuwymiarowy. Jest to kod Aztec 2D i jak si臋 mo偶na domy艣li膰, w za艂o偶eniach mia艂 usprawni膰 odczyt danych z tego dokumentu.

Ma艂o by mnie to interesowa艂o, gdyby nie fakt, 偶e spos贸b kodowania w nim danych - do niedawna - znany by艂 tylko w膮skiej grupie ludzi. Taka si臋 wydaje powszechna rzecz ten kod i takie ograniczenia dost臋pu do informacji.

Kod Aztec 2D na dowodzie rejestracyjnym
Rysunek 1.1. Przyk艂adowy kod Aztec 2D na dowodzie rejestracyjnym

2. Metoda kodowania danych w dowodzie rej. pojazdu

Na rysunku 2.1. poni偶ej przedstawiono schemat poszczeg贸lnych krok贸w jakie nale偶y podj膮膰, aby m贸c odczyta膰 dane zeskanowane z kodu Aztec 2D dowodu rejestracyjnego pojazdu.

Dekodowanie kodu Aztec 2D z dowodu rejestracyjnego
Rysunek 2.1. Metoda dekodowania znaku Aztec 2D z dowodu rejestracyjnego

Postaram si臋 poni偶ej rozwin膮膰 troch臋 opis poszczeg贸lnych etap贸w:

  • Skanowanie: Aby zeskanowa膰 kod Aztec 2D z polskiego dowodu rejestracyjnego pojazdu mo偶na u偶y膰 gotowych skaner贸w kod贸w Aztec/2D. Po zeskanowaniu otrzymamy ci膮g znak贸w.
  • Dekodowanie Base64: otrzymany ci膮g znak贸w jest kodowany poprzez algorytm Base64. Dodatkowo mo偶na si臋 spotka膰 z dodanym jednym dodatkowym znakiem na ko艅cu. Nale偶y to wzi膮膰 pod uwag臋 i pomin膮膰 ten znak, gdy zauwa偶ymy, 偶e funkcja Base64 nie dzia艂a poprawnie.
  • Kompresja NRV2E: Na tym etapie dane s膮 skompresowane i nale偶y je zdekompresowa膰 algorytmem NRV2E, kt贸rego implementacj臋 mo偶na znale藕膰 m.in. w darmowej bibliotece UCL autorstwa Markus F.X.J. Oberhumer (http://www.oberhumer.com/opensource/ucl/). Funkcja ucl_nrv2e_decompress_8().
  • Dane czyste (plain): Po tych wszystkich etapach otrzymujemy dane tekstowe z kodowaniem UTF16-LE, gdzie poszczeg贸lne informacje s膮 oddzielone znakiem pionowej kreski |, kt贸rej kod to 0x7C.

3. Dekodowanie Aztec 2D z dowodu rej. pojazdu 鈥 kody 藕r贸d艂owe


3.1. C#.NET 鈥 kod 藕r贸d艂owy (License)


VehicleDocumentAztecDecoder.cs

/*  * C#.NET implementation of NRV2E decompression algorithm  * - by http://haker.info A.D. 2019  * Based on original UCL library written by:  * Markus F.X.J. Oberhumer <[email protected]>  * http://www.oberhumer.com/opensource/ucl/  *  * This program is free software: you can redistribute it and/or modify  * it under the terms of the GNU General Public License as published by  * the Free Software Foundation, either version 3 of the License, or  * (at your option) any later version.  * This program is distributed in the hope that it will be useful,  * but WITHOUT ANY WARRANTY; without even the implied warranty of  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  * GNU General Public License for more details. */ using System; using System.Text; namespace FreeAztecVehicleDocDecoder { public class VehicleDocumentAztecDecoder { private const int START_OFFSET = 4; private byte[] src; private int ilen = START_OFFSET; private int currentByte; private int currentBit; private byte[] dst; public string Decode(string text) { byte[] decoded = Base64Decode(text); byte[] decompressed = DecompressNRV2E(decoded); return Encoding.Unicode.GetString(decompressed); } private byte[] DecompressNRV2E(byte[] sourceData) { src = sourceData; uint olen = 0, last_m_off = 1; dst = new byte[BitConverter.ToInt32(src, 0)]; while (ilen < src.Length) { uint m_off, m_len; while (GetBit() == 1) { dst[olen++] = src[ilen++]; } m_off = 1; while (true) { m_off = m_off * 2 + GetBit(); if (GetBit() == 1) break; m_off = (m_off - 1) * 2 + GetBit(); } if (m_off == 2) { m_off = last_m_off; m_len = GetBit(); } else { m_off = (m_off - 3) * 256 + src[ilen++]; if (m_off == 0xffffffff) break; m_len = (m_off ^ 0xffffffff) & 1; m_off >>= 1; last_m_off = ++m_off; } if (m_len > 0) m_len = (uint)1 + GetBit(); else if (GetBit() == 1) m_len = (uint)3 + GetBit(); else { m_len++; do { m_len = m_len * 2 + GetBit(); } while (GetBit() == 0); m_len += 3; } m_len += (uint)(m_off > 0x500 ? 1 : 0); uint m_pos; m_pos = olen - m_off; dst[olen++] = dst[m_pos++]; do dst[olen++] = dst[m_pos++]; while (--m_len > 0); } return dst; } private byte GetBit() { if (ilen >= src.Length) throw new Exception("Przesuni臋cie jest poza zakresem."); if (currentBit == 0) { currentByte = src[ilen++]; currentBit = 8; } return (byte)(((uint)currentByte >> --currentBit) & 1); } private byte[] Base64Decode(string textToDecode) { if (string.IsNullOrWhiteSpace(textToDecode)) return new byte[0]; if (textToDecode.Length % 2 == 1) { textToDecode = textToDecode.Substring(0, textToDecode.Length - 1); } return Convert.FromBase64String(textToDecode); } } }

Program.cs

/*  * C#.NET decoder of Aztec 2D used on Polish Vehicle Registration Documents  * - by http://haker.info A.D. 2019  * Based on original UCL library written by:  * Markus F.X.J. Oberhumer <[email protected]>  * http://www.oberhumer.com/opensource/ucl/  *  * This program is free software: you can redistribute it and/or modify  * it under the terms of the GNU General Public License as published by  * the Free Software Foundation, either version 3 of the License, or  * (at your option) any later version.  * This program is distributed in the hope that it will be useful,  * but WITHOUT ANY WARRANTY; without even the implied warranty of  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  * GNU General Public License for more details. */ using System; using System.Collections.Generic; using System.Text; namespace FreeAztecVehicleDocDecoder { class Program { static void Main(string[] args) { //Przyk艂adowy ci膮g Aztec 2D string test1 = "BgQAANtYAAJDAPkxAHwAQXIw7zcGNN4ANiox+w81HrUGOP8eUABSAEUA+1oAWQBEDv9OAFQAIABN3wAuClMAvlQPV/eKUhq9Wg5X7k58UtcWSVq9TF5J79pBZ+5PAEsG12bTSm5GVQBM/ntSAEH7L1dj+0MAS1vvMvovewo3Ut4wDi39HjEAN6Pbl0FNe3YgPt5Q3kv3IlSevVnX1z9FMmuCShL2WgBaG9umKADvSAApJnx75k+itwZMAEx9X0rvbkSOTXtOOF/DRy0WOW53fPYLFoMzLr0xAi3DGnevLQOCfJ/vQZ5TcBZrN0oa9k4AfA82Q4QaDzj3q8deN6sN7zIE/1x8lbMnQdwBQi5ZT86jL2tqNAr2MwAw34xSH+uPSVPYFxZThBMzON8AMJM5wQA3MwRcMX7bNcET2jInwyedE01HZ4dlM94qKy0DL38fNgAqeBszSxOvNIeKfHM7fCLxNQAwVkMtdzl7Xiw/YMyrFzxQACBWw+Hza7c3C93/NWuHg1OWRquPQ5KP02K9IBZT4QZC9oNZU7aXFiOX83U4ADJFC7ADhrNVCyOW8w9qMbEnZhdHbHxjdjIT7E4DW0M3OQuGaxYmCSSSSSr/"; VehicleDocumentAztecDecoder dec = new VehicleDocumentAztecDecoder(); string result = dec.Decode(test1); Console.OutputEncoding = Encoding.Unicode; //Wy艣wietl rozkodowane dane na konsoli tekstowej Console.WriteLine(result); #if DEBUG Console.ReadLine(); #endif } } }

3.2. C++ 鈥 kod 藕r贸d艂owy (License)


/* * C++ implementation of NRV2E decompression algorithm * which was used in this project to decode * Aztec 2D from Polish Vehicle Registration Documents * - by http://haker.info A.D. 2019 * * Based on original UCL library written by: * Markus F.X.J. Oberhumer <[email protected]> * http://www.oberhumer.com/opensource/ucl/ * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include <iostream> #include <string> #include <vector> #include <fstream> const int START_OFFSET = 4; std::vector<unsigned char> src; int ilen = START_OFFSET; int currentByte; int currentBit; static unsigned char GetBit() { if (ilen >= src.size()) throw std::invalid_argument("Przesuni臋cie jest poza zakresem."); if (currentBit == 0) { currentByte = src[ilen++]; currentBit = 8; } return (unsigned char)(((unsigned int)currentByte >> --currentBit) & 1); } static std::vector<unsigned char> DecompressNRV2E(std::vector<unsigned char> sourceData) { src = sourceData; int destSize = src[0] | (int)src[1] << 8 | (int)src[2] << 16 | (int)src[3] << 24; std::vector<unsigned char> dst(destSize); unsigned int olen = 0, last_m_off = 1; while (ilen < src.size()) { unsigned int m_off, m_len; while (GetBit() == 1) { dst[olen++] = src[ilen++]; } m_off = 1; while (true) { m_off = m_off * 2 + GetBit(); if (GetBit() == 1) break; m_off = (m_off - 1) * 2 + GetBit(); } if (m_off == 2) { m_off = last_m_off; m_len = GetBit(); } else { m_off = (m_off - 3) * 256 + src[ilen++]; if (m_off == 0xffffffff) break; m_len = (m_off ^ 0xffffffff) & 1; m_off >>= 1; last_m_off = ++m_off; } if (m_len > 0) m_len = (unsigned int)1 + GetBit(); else if (GetBit() == 1) m_len = (unsigned int)3 + GetBit(); else { m_len++; do { m_len = m_len * 2 + GetBit(); } while (GetBit() == 0); m_len += 3; } m_len += (unsigned int)(m_off > 0x500 ? 1 : 0); unsigned int m_pos; m_pos = olen - m_off; dst[olen++] = dst[m_pos++]; do dst[olen++] = dst[m_pos++]; while (--m_len > 0); } return dst; } static std::string base64_decode(const std::string& in) { std::string out; std::vector<int> T(256, -1); for (int i = 0; i < 64; i++) T["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[i]] = i; int val = 0, valb = -8; for (unsigned char c : in) { if (T[c] == -1) break; val = (val << 6) + T[c]; valb += 6; if (valb >= 0) { out.push_back(char((val >> valb) & 0xFF)); valb -= 8; } } return out; } int main(int argc, char* argv[]) { std::string test1 = "BgQAANtYAAJDAPkxAHwAQXIw7zcGNN4ANiox+w81HrUGOP8eUABSAEUA+1oAWQBEDv9OAFQAIABN3wAuClMAvlQPV/eKUhq9Wg5X7k58UtcWSVq9TF5J79pBZ+5PAEsG12bTSm5GVQBM/ntSAEH7L1dj+0MAS1vvMvovewo3Ut4wDi39HjEAN6Pbl0FNe3YgPt5Q3kv3IlSevVnX1z9FMmuCShL2WgBaG9umKADvSAApJnx75k+itwZMAEx9X0rvbkSOTXtOOF/DRy0WOW53fPYLFoMzLr0xAi3DGnevLQOCfJ/vQZ5TcBZrN0oa9k4AfA82Q4QaDzj3q8deN6sN7zIE/1x8lbMnQdwBQi5ZT86jL2tqNAr2MwAw34xSH+uPSVPYFxZThBMzON8AMJM5wQA3MwRcMX7bNcET2jInwyedE01HZ4dlM94qKy0DL38fNgAqeBszSxOvNIeKfHM7fCLxNQAwVkMtdzl7Xiw/YMyrFzxQACBWw+Hza7c3C93/NWuHg1OWRquPQ5KP02K9IBZT4QZC9oNZU7aXFiOX83U4ADJFC7ADhrNVCyOW8w9qMbEnZhdHbHxjdjIT7E4DW0M3OQuGaxYmCSSSSSr/"; if (test1.length() % 2 == 1) { test1[test1.length() - 1] = '\0'; } std::string decoded = base64_decode(test1); std::vector<unsigned char> decodedVec = std::vector<unsigned char>(decoded.begin(), decoded.end()); std::vector<unsigned char> decompressed = DecompressNRV2E(decodedVec); std::string plainData(decompressed.begin(), decompressed.end()); //zapisz rozkodowane dane do pliku tekstowego //(zmie艅 艣cie偶k臋 wed艂ug swojego systemu) std::ofstream outfile("D:\\0001\\file1.txt", std::ofstream::binary); outfile.write(plainData.c_str(), plainData.length()); outfile.close(); return EXIT_SUCCESS; }

03 stycznia 2020 r. — poprawiono kodowanie polskich znak贸w w przyk艂adzie dla Visual C++


Rysunek 3.1. Przyk艂ad dla Visual C++ zapisuje rozkodowane dane do pliku tekstowego


4. Opis poszczeg贸lnych p贸l z danymi

Przyk艂adowe rozkodowane dane w stanie surowym przedstawiono na rysunku 4.1 poni偶ej.

Przyk艂adowe rozkodowane dane
Rysunek 4.1. Przyk艂ad rozkodowania kodu Aztec 2D z dow. rej. - dane surowe

W przypadku pisania w艂asnego oprogramowania bazuj膮cego na powy偶szym kodzie, na pewno b臋dzie przydatny opis poszczeg贸lnych p贸l.

Pozycja (indeks) Opis
0Wersja protoko艂u
1Seria i numer dowodu
2Kod terytorialny urz臋du rejestruj膮cego
3Organ wydaj膮cy - Nazwa
4Organ wydaj膮cy - Gmina
5Organ wydaj膮cy - Ulica i nr
6Organ wydaj膮cy - Kod i miejscowo艣膰
7Numer rejestracyjny pojazdu
8Marka
9Typ homologacji
10Wariant homologacji
11Wersja homologacji
12Model
13Numer VIN
14Data wydania dowodu rejestracyjnego
15Okres wa偶no艣ci dowodu
16Nazwa w艂a艣ciciela
17Imiona
18Nazwisko
19?
20PESEL
21Kod pocztowy
22Gmina
23Miejscowo艣膰
24Ulica
25Nr domu
26Nr mieszkania
27Nazwa w艂a艣ciciela
28Imiona
29Nazwisko
30?
31PESEL
32Kod pocztowy
33Gmina
34Miejscowo艣膰
35Ulica
36Nr domu
37Nr mieszkania
38Maksymalna masa ca艂kowita [kg]
39Maksymalna masa ca艂kowita pojazdu [kg]
40Maksymalna masa ca艂kowita zespo艂u pojazd贸w [kg]
41Masa w艂asna
42Kategoria pojazdu
43Numer 艣wiadectwa homologacji typu pojazdu
44Liczba osi
45Maksymalna masa ca艂kowita przyczepy z hamulcem
46Maksymalna mas ca艂kowita przyczepy bez hamulca
47Stosunek mocy do masy (w KW/kg)
48Pojemno艣膰 silnika [cm3]
49Moc silnika [kW]
50Rodzaj paliwa
51Data pierwszej rejestracji pojazdu
52Liczba miejsc siedz膮cych
53Liczba miejsc stoj膮cych
54Rodzaj pojazdu
55Przeznaczenie
56Rok produkcji
57Dopuszczalna 艂adowno艣膰
58Najwi臋kszy dopuszczalny nacisk osi
59Numer karty pojazdu
60Kod ITS
61?
62?
63?
64?
65?

5. Podsumowanie

Dzi臋ki za przeczytanie. Je艣li s膮 jakie艣 pytania lub sugestie dot. tego wpisu to prosz臋 pisa膰.

Dawid Farbaniec


Tagi:  reverse-engineering  visual-cpp  c-sharp 

Komentarze czytaj膮cych

Czytelnik napisa艂:

Rewelacja, super robota. Mam pytanie, jak wykona膰 to w drug膮 stron臋 tzn. aby otrzyma膰 kod Aztec obrazkowy z posiadanych danych.

 rok temu (13 lutego 2019 godz. 18:55)
Dawid (haker.info) napisa艂:

Ja pr贸bowa艂bym wykona膰 poszczeg贸lne kroki dekodowania w odwrotnej kolejno艣ci 馃槂

  1. Zapisa膰 dane tekstem w kodowaniu UTF-16LE oddzielone znakiem pionowej linii | (0x7C) w odpowiedniej kolejno艣ci
  2. Skompresowa膰 algorytmem NRV2E (wariant 8-bitowy)
  3. Zakodowa膰 za pomoc膮 algorytmu Base64
  4. No i o ten ostatni krok pewnie jest pytanie. Trzeba znale藕膰 co艣 co wygeneruje Aztec 2D. Nie pomog臋 w wyborze, bo nigdy takich bibliotek nie szuka艂em. Ale powinno by膰 co艣 takiego, gdy偶 ten ca艂y Aztec 2D to do艣膰 popularny barcode.

Dla wielu programist贸w problemem by艂o to, 偶e do niedawna algorytm nie by艂 jawny dla wszystkich. Nie by艂o wiadomo, 偶e to kompresja NRV2E w wariancie 8-bitowym. Teraz wiadomo czego nale偶y u偶y膰 i pozostaje tylko odpowiednie zaprogramowanie tego.

Pozdrawiam!

 rok temu (13 lutego 2019 godz. 20:02)
Czytelnik napisa艂:

No w艂a艣nie z kompresj膮 algorytmem NRV2E mam problem.

 rok temu (13 lutego 2019 godz. 20:24)
Dawid (haker.info) napisa艂:

W艂膮czy艂em wyszukiwanie w 藕r贸d艂ach biblioteki UCL i opr贸cz dekompresji s膮 tam te偶 funkcje kompresuj膮ce np. ucl_nrv2e_99_compress (nazwa pliku n2_99.ch. Trzeba eksperymentowa膰. Ja bibliotek臋 UCL u偶ywa艂em tylko na potrzeby tego artyku艂u. I to tylko funkcj臋 dekompresuj膮c膮.

 rok temu (13 lutego 2019 godz. 21:03)
Krzysiek napisa艂:

Wszystko super opisane. Mam pytanie dotycz膮ce implementacji w C++.
Jak rozwi膮za膰 problem polskich znak贸w.
Zamiast litery 艁 otrzymuje dwuznak A? (ten znak zapytania jest w takim jakby kwadracie).
Czy m贸g艂by艣 mi napisa膰 w jaki spos贸b wy艣wietli膰 te polskie znaki?

 ponad 11 miesi臋cy temu (26 lipca 2019 godz. 13:42)
Dawid (haker.info) napisa艂:

My艣l臋, 偶e w napisie (zmiennej) znaki s膮 poprawne, a jedynie konsola tekstowa Windows je 藕le wy艣wietla.
Dodaj na pocz膮tku funkcji g艂贸wnej main wywo艂anie: setlocale(LC_ALL, "Polish");
Powinno to wygl膮da膰:

//(...)
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "Polish");
    //(...)

Dzi臋kuj臋 za zainteresowanie artyku艂em 馃槂

 ponad 11 miesi臋cy temu (26 lipca 2019 godz. 23:05)
Krzysiek napisa艂:

Po dodaniu setlocale(LC_ALL, "Polish"); litera 脫 wy艣wietla si臋 poprawnie ale litera 艁 w dalszym ci膮gu wy艣wietla si臋 b艂臋dnie (nawet przy zapisie do pliku).
Czy dysponujesz mo偶e jakim艣 opisem algorytmu NRV2E?

 ponad 11 miesi臋cy temu (27 lipca 2019 godz. 13:15)
Dawid (haker.info) napisa艂:

Uruchomi艂em teraz jeszcze raz kod 藕r贸d艂owy w C# i tam polskie znaki diakrytyczne wy艣wietlaj膮 si臋 poprawnie. Co艣 widocznie jest nie tak z kodowaniem znak贸w w przyk艂adzie dla C++. Nie znalaz艂em dokument贸w, kt贸re by opisywa艂y algorytm NRV2E. Przegl膮da艂em tylko jego oryginaln膮 implementacj臋 jako kod z biblioteki UCL.

 ponad 11 miesi臋cy temu (28 lipca 2019 godz. 01:20)
Jacek napisa艂:

"Aby zeskanowa膰 kod Aztec 2D z polskiego dowodu rejestracyjnego pojazdu mo偶na u偶y膰 gotowych skaner贸w kod贸w Aztec/2D. Po zeskanowaniu otrzymamy ci膮g znak贸w."

znasz jak膮艣 bibliotek臋 kt贸ra pozwala np w xamarin zeskanowa膰 taki kod ? Oczywi艣cie nie pytam o bibliotek臋 od peloka.

 ponad 9 miesi臋cy temu (18 wrze艣nia 2019 godz. 14:53)
Dawid (haker.info) napisa艂:

Jest du偶o profesjonalnych bibliotek, ale p艂atnych. Warto pomy艣le膰 czy nie kupi膰 profesjonalnego SDK, kt贸ry odczyta kod obrazkowy (zaoszcz臋dzi to czas na w艂asne rozpoznawanie obraz贸w), a reszt膮 aplikacji zaj膮膰 si臋 samodzielnie skoro algorytm jest ju偶 jawny.

Mo偶na te偶 spr贸bowa膰 skorzysta膰 z darmowej biblioteki ZXing:
https://github.com/micjahn/ZXing.Net

 ponad 9 miesi臋cy temu (19 wrze艣nia 2019 godz. 19:48)
Klausvonbrown napisa艂:

Hej! Czy masz mo偶e w zanadrzu wersje dekodera dla php lub javascript aby dekodowa膰 to na stronie www (html) ? Probowa艂em przekszta艂ci膰 kod dex4er z github'a, ale nie najlepiej mi to wychodzi 馃槮

 ponad 8 miesi臋cy temu (03 listopada 2019 godz. 12:17)
Dawid (haker.info) napisa艂:

B臋d臋 mia艂 na uwadze rozbudowanie tego artyku艂u o kolejne implementacje dla r贸偶nych j臋zyk贸w programowania. Jednak nie mog臋 obieca膰 kiedy dok艂adnie.

Na ten czas mo偶na stworzy膰 witryn臋 w ASP.NET MVC i u偶y膰 implementacji w C#, kt贸ra wykona si臋 po stronie serwera.

Natomiast dla JavaScript to mo偶e Bridge.NET 鈥 nie u偶ywa艂em, ale zgodnie z opisem na stronie projektu:

Open Source C# to JavaScript Compiler and Frameworks.
Run your C# Apps on the web.

 ponad 8 miesi臋cy temu (04 listopada 2019 godz. 14:17)
艁ukasz :) napisa艂:

Te偶 ch臋tnie przygarn膮艂bym dekoder AZTEC dla PHP

 ponad 6 miesi臋cy temu (18 grudnia 2019 godz. 12:21)


Wszystkie tre艣ci umieszczone na tej witrynie s膮 chronione prawem autorskim. Surowo zabronione jest kopiowanie i rozpowszechnianie zawarto艣ci tej witryny bez zgody autora. Wszelkie opublikowane tutaj tre艣ci (w tym kody 藕r贸d艂owe i inne) s艂u偶膮 wy艂膮cznie celom informacyjnym oraz edukacyjnym. W艂a艣ciciele tej witryny nie ponosz膮 odpowiedzialno艣ci za ewentualne niezgodne z prawem wykorzystanie zasob贸w dost臋pnych w witrynie. U偶ytkownik tej witryny o艣wiadcza, 偶e z zamieszczonych tutaj danych korzysta na w艂asn膮 odpowiedzialno艣膰. Wszelkie znaki towarowe i nazwy zastrze偶one zosta艂y u偶yte jedynie w celach informacyjnych i nale偶膮 wy艂膮cznie do ich prawnych w艂a艣cicieli. Korzystaj膮c z zasob贸w witryny haker.info o艣wiadczasz, 偶e akceptujesz powy偶sze warunki oraz polityk臋 prywatno艣ci.