Vietnes sadaļas
Redaktora izvēle:
- Vai esat nolēmis pārslēgties no Windows uz Mac?
- Kā lietot Google fotoattēlus, Google foto pieteikšanās funkciju pārskats
- Maksājumu sistēma Payza (ex-Alertpay) Payza pieteikšanās savā personīgajā kontā
- Kā atvērt APK un kā rediģēt?
- Pārskats par Alpha GT viedtālruni no Highscreen Iepakojums un piegāde
- Oficiālā LG programmaparatūra, izmantojot KDZ
- Kas ir SSD un kā to instalēt?
- Kā programmā Word likt uzsvaru uz burta
- Kā pārvērst attēlus PNG formātā?
- Tehniskas problēmas un to risinājumi v
Reklāma
Sniffer vietējam tīklam ar veidotāju. Vienkārša sniffer rakstīšana operētājsistēmai Windows |
Šajā rakstā mēs aplūkosim vienkārša sniffer izveidi operētājsistēmai Windows OS. IevadsMērķis: uzrakstiet programmu, kas uztvers tīkla trafiku (Ethernet, WiFi), kas tiek pārraidīts pa IP protokolu. Ceru, ka jums tas liksies interesanti. Teorija (lasīt nav obligāti, bet ieteicams)IN Šis brīdis lielākā daļa mūsdienu informācijas tīkli ir balstīti uz TCP/IP protokolu steku pamatu. TCP/IP protokolu steks (Transmission Control Protocol/Internet Protocol) ir tīklos izmantoto dažāda līmeņa tīkla protokolu kolektīvs nosaukums. Šajā rakstā mūs galvenokārt interesēs IP protokols - maršrutēts tīkla protokols, ko izmanto tā sauktajās paketēs (pareizāks termins ir datagramma) sadalītu datu negarantētai piegādei no viena tīkla mezgla uz otru. Prakse (saruna pēc būtības)Šobrīd ir izveidots diezgan daudz programmatūra lai klausītos satiksmi. Slavenākais no tiem: Wireshark. Protams, mērķis nav plūkt laurus - mūs interesē uzdevums pārtvert trafiku, vienkārši “klausoties” tīkla saskarnē. Ir svarīgi saprast, ka mēs negrasāmies uzlauzt un pārtvert svešinieks satiksme. Mums vienkārši jāskata un jāanalizē datplūsma, kas iet caur mūsu saimniekdatoru. Kāpēc tas var būt nepieciešams:
Atšķirībā no Wireshark, kura pamatā ir libpcap/WinPcap bibliotēka, mūsu analizators neizmantos šo draiveri. Turklāt mums vispār nebūs draivera, un mēs nerakstīsim paši savu NDIS (ak, šausmas!). Par to varat lasīt šajā tēmā. Viņš vienkārši būs pasīvs novērotājs, izmantojot tikai WinSock bibliotēka. Šajā gadījumā draivera izmantošana ir lieka. Kā tā? Ļoti vienkārši. Sākot ar operētājsistēmu Windows 2000 (NT 5.0), kļuva ļoti viegli izveidot programmu tīkla segmenta klausīšanai, jo viņa tīkla draiverisļauj pārslēgt ligzdu visu pakešu saņemšanas režīmā. Promiscuous režīma iespējošanagarš karogs = 1; SOCKET ligzda; #define SIO_RCVALL 0x98000001 ioctlsocket(ligzda, SIO_RCVALL, &RS_Flag);Mūsu programma darbojas ar IP paketēm un izmanto Windows Sockets bibliotēkas versiju 2.2 un neapstrādātas ligzdas. Lai iegūtu tiešu piekļuvi IP paketei, ligzda ir jāizveido šādi: Neapstrādātas ligzdas izveides = ligzda(AF_INET, SOCK_RAW, IPPROTO_IP);Šeit konstantes vietā SOCK_STREAM(TCP protokols) vai SOCK_DGRAM(UDP protokols), mēs izmantojam vērtību SOCK_RAW. Vispārīgi runājot, darbs ar neapstrādātām ligzdām ir interesants ne tikai no satiksmes uztveršanas viedokļa. Faktiski mēs iegūstam pilnīgu kontroli pār iepakojuma veidošanu. Pareizāk sakot, veidojam manuāli, kas ļauj, piemēram, nosūtīt konkrētu ICMP paketi... Uz priekšu. Ir zināms, ka IP pakete sastāv no galvenes, pakalpojuma informācijas un faktiski datiem. Iesaku ielūkoties šeit, lai atsvaidzinātu savas zināšanas. Aprakstīsim IP galveni struktūras veidā (pateicoties lieliskajam rakstam par RSDN): IP pakešu struktūras aprakststypedef struct _IPHeader ( unsigned char ver_len; // galvenes versija un garums neparakstītas rakstzīmes; // pakalpojuma veids neparakstīts īss garums; // visas paketes garums unsigned short id; // Id unsigned short flgs_offset; // karodziņi un nobīde unsigned char ttl // dzīves laikā neparakstīts char protokols // protokols unsigned short xsum; čekas summa neparakstīts garš src; // Sūtītāja IP adrese unsigned long dest; // Galamērķa IP adrese unsigned short *params; // parametri (līdz 320 bitiem) unsigned char *data; // dati (līdz 65535 oktetiem)IPHeader;Klausīšanās algoritma galvenā funkcija izskatīsies šādi: Vienas paketes uztveršanas funkcijaIPHeader* RS_Sniff() ( IPHeader *hdr; int count = 0; count = recv(RS_SSocket, (char*)&RS_Buffer, sizeof(RS_Buffer), 0); if (count >= sizeof(IPHeader)) ( hdr = (LPIPHeader) )malloc(MAX_PACKET_SIZE); memcpy(hdr, RS_Buffer, MAX_PACKET_SIZE) cits atgriež 0;Šeit viss ir vienkārši: mēs saņemam datu daļu, izmantojot standarta ligzdas funkciju recv, un pēc tam kopējiet tos tādā struktūrā kā IP Header. Uztversim visas paketes, kas sasniedz mūsu tīkla saskarniwhile (true) (IPHeader* hdr = RS_Sniff(); // IP paketes apstrāde if (hdr) ( // drukāt galveni konsolē)Mazliet offtopicŠeit un tālāk autors izveidoja RS_ (no Raw Sockets) prefiksu dažām svarīgām funkcijām un mainīgajiem. Projektu veicu pirms 3-4 gadiem, un man radās traka ideja uzrakstīt pilnvērtīgu bibliotēku darbam ar neapstrādātām ligzdām. Kā jau nereti gadās, pēc dažu nozīmīgu (autorei) rezultātu iegūšanas entuziasms pagaisa, un tālāk par mācību piemēru lieta netika. Principā varat iet tālāk un aprakstīt visu turpmāko protokolu galvenes, kas atrodas iepriekš. Lai to izdarītu, jums ir jāanalizē lauks protokols struktūrā IP Header. Apskatiet piemēru kodu (jā, tur jābūt slēdzim, sasodīts!), kur galvene ir iekrāsota atkarībā no tā, kādu protokolu pakete ir iekapsulējusi IP: /* * Pakotnes izcelšana ar krāsu */ void ColorPacket(const IPHeader *h, const u_long haddr, const u_long whost = 0) ( if (h->xsum) SetConsoleTextColor(0x17); // ja pakotne nav tukša cits SetConsoleTextColor(0x07) ; // tukša pakotne if (haddr == h->src) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_RED | FOREGROUND_INTENSITY); // pakotnei "native" = "native" h->dest ) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_GREEN | FOREGROUND_INTENSITY); // "vietējā" saņemšanas pakete ) if (h->protocol == PROT_ICMP ||) h->protocol ==ex. (0x70) ; // ICMP pakete ) else if(h->protocol == PROT_IP || h->protocol == 115) ( SetConsoleTextColor(0x4F); // IP-in-IP pakete, L2TP ) else if(h) - >protocol == 53 ||. h->protocol == 56) ( SetConsoleTextColor(0x4C); // TLS, IP ar šifrēšanu ) if(whost == h->dest || whost == h->src) ( SetConsoleTextColor (0x0A); Tomēr tas ievērojami pārsniedz šī raksta darbības jomu. Mūsu apmācības piemēram pietiks apskatīt to resursdatoru IP adreses, no kuriem un uz kuriem nāk trafika, un aprēķināt tā apjomu laika vienībā (gatavā programma atrodas arhīvā raksta beigās) . Lai parādītu IP galvenes datus, ir jāievieš funkcija, kas konvertē datagrammas galveni (bet ne datus) par virkni. Kā ieviešanas piemēru mēs varam piedāvāt šādu iespēju: IP galvenes pārveidošana par virkniinline char* iph2str(IPHeader *iph) (const int BUF_SIZE = 1024; char *r = (char*)malloc(BUF_SIZE); memset((void*)r, 0, BUF_SIZE); sprintf(r, "ver=%" d hlen=%d tos=%d len=%d id=%d karodziņi=0x%X nobīde=%d ttl=%dms prot=%d crc=0x%X src=%s dest=%s", BYTE_H (iph->ver_len), BYTE_L(iph->ver_len)*4, iph->tos, ntohs(iph->length), ntohs(iph->id), IP_FLAGS(ntohs(iph->flgs_offset)), IP_OFFSET (ntohs(iph->flgs_offset)), iph->ttl, iph->protocol, ntohs(iph->xsum), nethost2str(iph->src), nethost2str(iph->dest));Pamatojoties uz iepriekš sniegto pamatinformāciju, mēs iegūstam šo mazo programmu (rāpojošs nosaukums ss, saīsinājums no vienkāršas sniffer), kas ievieš lokālu IP trafika klausīšanos. Tās saskarne ir parādīta zemāk attēlā. Avots un binārais kods Es sniedzu to tādu, kāds tas ir, kā tas bija pirms vairākiem gadiem. Tagad man ir bail uz to skatīties, un tomēr, tas ir diezgan lasāms (protams, nevar būt tik pašpārliecināts). Kompilācijai pietiks pat ar Visual Studio Express 2005. Ar ko mēs nonācām:
Paldies par uzmanību, novēlu jums un visiem priecīgus Ziemassvētkus! Šajā rakstā mēs aplūkosim vienkārša sniffer izveidi operētājsistēmai Windows OS. IevadsMērķis: uzrakstiet programmu, kas uztvers tīkla trafiku (Ethernet, WiFi), kas tiek pārraidīts pa IP protokolu.Ērtības: Visual Studio 2005 vai jaunāka versija. Šeit aprakstītā pieeja nepieder personīgi autoram un tiek veiksmīgi izmantota daudzās komerciālās, kā arī pilnīgi bezmaksas programmās (sveiki, GPL). Šis darbs ir paredzēts galvenokārt tīkla programmēšanas iesācējiem, kuriem tomēr ir vismaz pamatzināšanas ligzdu jomā kopumā un Windows ligzdu jomā. Šeit es bieži rakstīšu labi zināmas lietas, jo priekšmeta joma ir specifiska, ja kaut ko palaidīšu garām, mana galva būs juka. Ceru, ka jums tas liksies interesanti. Teorija (lasīt nav obligāti, bet ieteicams)Šobrīd lielākā daļa mūsdienu informācijas tīklu ir balstīti uz TCP/IP protokolu steku. TCP/IP protokolu steks (Transmission Control Protocol/Internet Protocol) ir tīklos izmantoto dažāda līmeņa tīkla protokolu kolektīvs nosaukums. Šajā rakstā mūs galvenokārt interesēs IP protokols - maršrutēta tīkla protokols, ko izmanto tā sauktajās paketēs (pareizāks termins ir datagramma) sadalītu datu negarantētai piegādei no viena tīkla mezgla uz otru.Īpaši mūs interesē IP paketes, kas paredzētas informācijas pārsūtīšanai. Tas ir diezgan augsts OSI tīkla datu modeļa līmenis, kad var norobežoties no ierīces un datu pārraides vides, darbojoties tikai ar loģisku attēlojumu. Ir pilnīgi loģiski, ka agrāk vai vēlāk bija jāparādās tīkla trafika pārtveršanai, uzraudzībai, ierakstīšanai un analīzei. Šādus rīkus parasti sauc par trafika analizatoriem, pakešu analizatoriem vai sniffers (no angļu valodas uz sniff - sniff). Šis ir tīkla trafika analizators, programma vai aparatūras-programmatūras ierīce, kas paredzēta, lai pārtvertu un pēc tam analizētu vai tikai analizētu tīkla trafiku, kas paredzēta citiem mezgliem. Prakse (saruna pēc būtības)Šobrīd ir izveidots diezgan daudz programmatūras, lai klausītos satiksmi. Slavenākais no tiem: Wireshark. Protams, mērķis nav plūkt laurus - mūs interesē uzdevums pārtvert trafiku, vienkārši “klausoties” tīkla saskarnē. Ir svarīgi saprast, ka mēs negrasāmies uzlauzt un pārtvert svešinieks satiksme. Mums vienkārši jāskata un jāanalizē datplūsma, kas iet caur mūsu saimniekdatoru.Kāpēc tas var būt nepieciešams:
Kā tā? Ļoti vienkārši. Sākot ar operētājsistēmu Windows 2000 (NT 5.0), kļuva ļoti viegli izveidot programmu tīkla segmenta klausīšanai, jo tā tīkla draiveris ļauj iestatīt ligzdu visu pakešu saņemšanai. Promiscuous režīma iespējošanagarš karogs = 1; SOCKET ligzda; #define SIO_RCVALL 0x98000001 ioctlsocket(ligzda, SIO_RCVALL, &RS_Flag);Mūsu programma darbojas ar IP paketēm un izmanto Windows Sockets bibliotēkas versiju 2.2 un neapstrādātas ligzdas. Lai iegūtu tiešu piekļuvi IP paketei, ligzda ir jāizveido šādi: Neapstrādātas ligzdas izveides = ligzda(AF_INET, SOCK_RAW, IPPROTO_IP);Šeit konstantes vietā SOCK_STREAM(TCP protokols) vai SOCK_DGRAM(UDP protokols), mēs izmantojam vērtību SOCK_RAW. Vispārīgi runājot, darbs ar neapstrādātām ligzdām ir interesants ne tikai no satiksmes uztveršanas viedokļa. Faktiski mēs iegūstam pilnīgu kontroli pār iepakojuma veidošanu. Pareizāk sakot, veidojam manuāli, kas ļauj, piemēram, nosūtīt konkrētu ICMP paketi... Uz priekšu. Ir zināms, ka IP pakete sastāv no galvenes, pakalpojuma informācijas un faktiski datiem. Iesaku ielūkoties šeit, lai atsvaidzinātu savas zināšanas. Aprakstīsim IP galveni struktūras veidā (pateicoties lieliskajam rakstam par RSDN): IP pakešu struktūras aprakststypedef struct _IPHeader ( unsigned char ver_len; // galvenes versija un garums neparakstītas rakstzīmes; // pakalpojuma veids neparakstīts īss garums; // visas paketes garums unsigned short id; // Id unsigned short flgs_offset; // karodziņi un nobīde unsigned char ttl // lifetime unsigned src // sūtītāja IP adrese unsigned short *params (līdz; 65535 okteti) )IPHeader;Klausīšanās algoritma galvenā funkcija izskatīsies šādi: Vienas paketes uztveršanas funkcijaIPHeader* RS_Sniff() ( IPHeader *hdr; int count = 0; count = recv(RS_SSocket, (char*)&RS_Buffer, sizeof(RS_Buffer), 0); if (count >= sizeof(IPHeader)) ( hdr = (LPIPHeader) )malloc(MAX_PACKET_SIZE); memcpy(hdr, RS_Buffer, MAX_PACKET_SIZE) cits atgriež 0;Šeit viss ir vienkārši: mēs saņemam datu daļu, izmantojot standarta ligzdas funkciju recv, un pēc tam kopējiet tos tādā struktūrā kā IP Header. Visbeidzot, mēs sākam bezgalīgu pakešu uztveršanas cilpu: Uztversim visas paketes, kas sasniedz mūsu tīkla saskarniwhile (true) (IPHeader* hdr = RS_Sniff(); // IP paketes apstrāde if (hdr) ( // drukāt galveni konsolē)Mazliet offtopicŠeit un tālāk autors izveidoja RS_ (no Raw Sockets) prefiksu dažām svarīgām funkcijām un mainīgajiem. Projektu veicu pirms 3-4 gadiem, un man radās traka ideja uzrakstīt pilnvērtīgu bibliotēku darbam ar neapstrādātām ligzdām. Kā jau nereti gadās, pēc dažu nozīmīgu (autorei) rezultātu iegūšanas entuziasms pagaisa, un tālāk par mācību piemēru lieta netika.Principā varat iet tālāk un aprakstīt visu turpmāko protokolu galvenes, kas atrodas iepriekš. Lai to izdarītu, jums ir jāanalizē lauks protokols struktūrā IP Header. Apskatiet piemēru kodu (jā, tur jābūt slēdzim, sasodīts!), kur galvene ir iekrāsota atkarībā no tā, kādu protokolu pakete ir iekapsulējusi IP: /* * Pakotnes izcelšana ar krāsu */ void ColorPacket(const IPHeader *h, const u_long haddr, const u_long whost = 0) ( if (h->xsum) SetConsoleTextColor(0x17); // ja pakotne nav tukša cits SetConsoleTextColor(0x07) ; // tukša pakotne if (haddr == h->src) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_RED | FOREGROUND_INTENSITY); // pakotnei "native" = "native" h->dest ) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_GREEN | FOREGROUND_INTENSITY); // "vietējā" saņemšanas pakete ) if (h->protocol == PROT_ICMP ||) h->protocol ==ex. (0x70) ; // ICMP pakete ) else if(h->protocol == PROT_IP || h->protocol == 115) ( SetConsoleTextColor(0x4F); // IP-in-IP pakete, L2TP ) else if(h) - >protocol == 53 ||. h->protocol == 56) ( SetConsoleTextColor(0x4C); // TLS, IP ar šifrēšanu ) if(whost == h->dest || whost == h->src) ( SetConsoleTextColor (0x0A); Tomēr tas ievērojami pārsniedz šī raksta darbības jomu. Mūsu apmācības piemēram pietiks apskatīt to resursdatoru IP adreses, no kuriem un uz kuriem nāk trafika, un aprēķināt tā apjomu laika vienībā (gatavā programma atrodas arhīvā raksta beigās) . Lai parādītu IP galvenes datus, ir jāievieš funkcija, kas konvertē datagrammas galveni (bet ne datus) par virkni. Kā ieviešanas piemēru mēs varam piedāvāt šādu iespēju: IP galvenes pārveidošana par virkniinline char* iph2str(IPHeader *iph) (const int BUF_SIZE = 1024; char *r = (char*)malloc(BUF_SIZE); memset((void*)r, 0, BUF_SIZE); sprintf(r, "ver=%" d hlen=%d tos=%d len=%d id=%d karodziņi=0x%X nobīde=%d ttl=%dms prot=%d crc=0x%X src=%s dest=%s", BYTE_H (iph->ver_len), BYTE_L(iph->ver_len)*4, iph->tos, ntohs(iph->length), ntohs(iph->id), IP_FLAGS(ntohs(iph->flgs_offset)), IP_OFFSET (ntohs(iph->flgs_offset)), iph->ttl, iph->protocol, ntohs(iph->xsum), nethost2str(iph->src), nethost2str(iph->dest));Pamatojoties uz iepriekš sniegto pamatinformāciju, mēs iegūstam šo mazo programmu (rāpojošs nosaukums ss, saīsinājums no vienkāršas sniffer), kas ievieš lokālu IP trafika klausīšanos. Tās saskarne ir parādīta zemāk attēlā. Es sniedzu avota un bināro kodu tādu, kāds tas ir, kā tas bija pirms vairākiem gadiem. Tagad man ir bail uz to skatīties, un tomēr, tas ir diezgan lasāms (protams, nevar būt tik pašpārliecināts). Kompilācijai pietiks pat ar Visual Studio Express 2005. Ar ko mēs nonācām:
Labdien Kaut kā darbā radās problēma - bija ierīce, kas strādāja caur I2C un kuras protokols bija jāsaprot. Tāpēc mums ir nepieciešams sniffer I2C interfeisam, kas izvadītu visu, kas nāk un iet caur I2C uz UART portu un pēc tam caur pārveidotāju uz datora COM portu. SāktMan bija tikai pāris Atmeg8, un es nolēmu, kāpēc gan tos neizmantot. Tālāk radās jautājums par snifera ķēdi.Bija 2 iespējas - ieslēgt sniffer paralēli, vai atvērtā ķēdē. Acīmredzot pirmais variants izskatās daudz vienkāršāks, kas patiesībā izrādījās pilnīgi nepareizs. Bet vispirms vispirms. Īsumā par pašu saskarni. I2C (TWI in Atmel) izmanto divus vadus - SCL un SDA. Pirmais ir atbildīgs par signāla pulksteni, otrais ir atbildīgs par informācijas tiešu pārraidi. Interfeisam ir arī START un STOP stāvokļi. Tātad, mana pirmā doma bija paņemt zondi un savienot to ar manu kāju vienā pusē ārējs pārtraukums uz atmega8 no otras uz SDA līniju un noķert priekšējo malu un noteikt 0 vai 1 no pagājušā laika Acīmredzot tam vajadzēja darboties ļoti slikti, jo STOP signāls netika apstrādāts pareizi. Otra doma bija darīt to pašu, bet uztvert pārtraukumu SCL līnijā un nolasīt SDA līniju, kas savienota ar parasto digitālo posmu, izmantojot pārtraukumu. Šeit viss izskatījās dzīvotspējīgāks, izņemot to pašu STOP stāvokli, bet es nolēmu mēģināt to salikt uz maizes dēļa un redzēt, kas notiks. Jau iepriekš atvainojos, ja zemāk esošajā kodā atrodat acīmredzamas kļūdas, jo es uz ceļiem rekonstruēju noraidītās koda versijas no atmiņas. Pārtraukumu apstrādātāja kods izskatījās šādi: ISR(INT0_vect) (cli(); if (bitIsHigh(PINB, 0)) uart_send_char("1"); else uart_send_char("0"); sei(); ) Statiskie uint8_t dati = 0; statisks uint8_t idx = 7; ISR(INT0_vect) ( cli(); dati |= bitIsHigh(PINB, 0)<< (idx--);
if (!idx)
{
uart_send_char(data);
data = 0;
idx = 7;
}
sei();
}
Uz pareizā ceļaNeatkarīgi no tā, cik daudz es mēģināju ieviest sniffer, izmantojot paralēlo ķēdi, nekas nesanāca. Pamatojoties uz to, atlika tikai viena iespēja - spraugā bija jāiekļauj mikrokontrolleris, tas ir, tam jābūt gan atbildes ierīcei, gan oriģinālajam saimniekam. Droši vien tas izklausās mulsinoši, bet patiesībā tas tā nav.Tā kā atmega8 ir tikai viena aparatūra I2C, ir skaidrs, ka, lai tas darbotos, jums ir jāraksta programmatūras atbalsts protokolam. Rezultāts bija šāds kods: ISR (TWI_VECT) (CLI (); UINT8_T Statuss = TWSR; UINT8_T B; Char S; S = 0; _DLAY_MS (1); STATUSS & I2C_STATUS_MASK) (CASE I2C_STATUS_SR_RX_ADR_AC:/* CASE I2C_ST ARS:* AW :"); uart_send_int(TWDR); i2csoft_start(); i2csoft_open_write(I2C_ADDRESS); pārtraukums; case I2C_STATUS_SR_RX_DATA_ACK:/* case I2C_STATUS_SR_RX_DATA_NACK:*/ b = TWDR(b.sstr); i2csoft_write_byte(b) case I2C_STATUS_SR_RX_START: uart_send_str("E\n"); _lasīšanas_baits (); uart_send_str(s); uart_send_str("L\n"); pārtraukums; noklusējuma: uart_send_char("U"); uart_send_int(statuss); uart_send_char(" "); pārtraukums; ) TWCR |= (1< Ja kādam interesē, avotus var ņemt no |
Lasīt: |
---|
Jauns
- Kā lietot Google fotoattēlus, Google foto pieteikšanās funkciju pārskats
- Maksājumu sistēma Payza (ex-Alertpay) Payza pieteikšanās savā personīgajā kontā
- Kā atvērt APK un kā rediģēt?
- Pārskats par Alpha GT viedtālruni no Highscreen Iepakojums un piegāde
- Oficiālā LG programmaparatūra, izmantojot KDZ
- Kas ir SSD un kā to instalēt?
- Kā programmā Word likt uzsvaru uz burta
- Kā pārvērst attēlus PNG formātā?
- Tehniskas problēmas un to risinājumi v
- Bioshock remastered nesāksies