Usługa systemowa z tut. by Grzonu

Lucjan_Inferno

Użytkownik
Dołączył
Wrzesień 8, 2008
Posty
14
Elo. Znalazłem na tym forum mały art Grzona o usługach systemowych :) Tak srednio znam sie na winApi wiec nie wiem co może byc nie tak :)

#include <windows.h>
int main()
{
SC_HANDLE sh_manager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(!sh_manager)
{
return false; //nie udalo sie otworzyc SCManagera
}

SC_HANDLE service_handle=CreateService(sh_manager,"nazwa_naszej_uslugi5","nazwa_naszej_uslugi5",SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,"D:\\Pasek.exe",NULL,NULL,NULL,NULL,NULL);
if(!service_handle)
{
if(GetLastError()==ERROR_SERVICE_EXISTS)//usluga o tej nazwie juz istnieje
{
service_handle= OpenService(sh_manager,"nazwa_naszej_uslugi5",SERVICE_ALL_ACCESS);
}
else
{
CloseServiceHandle(sh_manager);//zamykamy uchwyty
CloseServiceHandle(service_handle);
return false;//nie udalo sie stworzyc uslugi
}
}
else
{
if(StartService(service_handle,0,NULL)==0)//jesli nie ma zadnych bledow no to mozemy wystartowac nasza usluge :D
{
WinExec("D:\\Przelicznik.exe", SW_SHOW);
if(GetLastError()==ERROR_SERVICE_ALREADY_RUNNING)
{
return true;//zostala juz wczesniej uruchomiona
}
}
}
CloseServiceHandle(sh_manager);//zamykamy uchwyty
CloseServiceHandle(service_handle);

return true;//w tym momecie nasza usluga juz chodzi i uruchomi sie tez przy nastepnym uruchomieniu

}

I problem w tym że robi się wpis do usług, jest poprawna sciezka do pliku exe lecz po ponowym starcie systemu program który miał sie odpalić czyli przelicznik.exe to się nie odpala. Powie mi ktoś dlaczego ?

Nie interesują mnie inne metody autostartu :)) Z racji iz chce to testować na maszynie gdzie jest zablokowany rejestr, autostart itd :)
 

msvcrt

Użytkownik
Dołączył
Październik 15, 2011
Posty
71
A ten Twój program jest napisany jako zwykły program czy jako usługa?
 

msvcrt

Użytkownik
Dołączył
Październik 15, 2011
Posty
71
Wydaje mi się, że musisz ten swój programik napisać jako usługę systemową bo inaczej nie będzie to działać. Tutaj jest jakiś artykuł po angielsku, jak się pisze usługi systemowe http://www.devx.com/cplus/Article/9857

W C++ Builder jest gotowa klasa do tego: TService. Masz też gotowy szablon kodu: wybierasz z menu File->New->Other->Service Application.
 
Ostatnia edycja:

msvcrt

Użytkownik
Dołączył
Październik 15, 2011
Posty
71
A możesz na tym kompie uruchomić menadżer zadań i zabić jakiś proces? Tak sobie pomyślałem że można by zrobić tak. Przypuśćmy że na tym komputerze wraz ze startem systemu uruchamiany jest jakiś program np. abc.exe. Więc zabijamy ten program abc.exe przez menadżer zadań. Zmieniamy mu nazwę na abc1.exe Następnie kopiujesz swój program do katalogu z abc1.exe ale pod nazwą abc.exe. W ten sposób bedzie uruchamiany twój program. W swoim programie możęsz dodać kod który uruchomi abc1.exe. O ile masz takie uprawnienia żęby zmieniac nazwy plikow w program files itp.
 

Lucjan_Inferno

Użytkownik
Dołączył
Wrzesień 8, 2008
Posty
14
Mam dostęp do dysku C (ale w folderach systemowych mam blokade) itd :) - Najlepiej bylo by to zrobic w kodzie.... Wieczorkiem sproboje jeszcze pobawic sie tymi uslugami...
 

Lucjan_Inferno

Użytkownik
Dołączył
Wrzesień 8, 2008
Posty
14
Jaki komputer ?
Hmmm jest to a raczej są to komputery szkolne xD Ale z racji iż mamy ogarnietego admina xD nie mam pomyslu jak to zrobić xD
Bo napisałem sobie fajnego keya w c++ z paroma funkcjami, wszystko smiga, dziala itd no ale tylko jesli odpale program recznie.... Wszystkie metody autostartu zostaly obalone przezemnie xD
Nawet ophcrack nie ogarnia tego - mimo iż nie ma tam sbs! :)

Co do Twojej metody to watpie by przeszla bo opiera sie do na 'zaplanowanych zadaniach' a one tez są zablokowane xD

Edit:
Hmmm u Sb znalazłem usługe nero która podobno uruchamia sie z kazdym startem SO
Podmienilem na swój plik, lecz nie odpala go :/ Tamten też był exe :/ Nie wiem co jest nie tak
 
Ostatnia edycja:

Abdiz

Użytkownik
Dołączył
Grudzień 3, 2011
Posty
8
Doczytaj końcówkę:
"Ale jest pewien problem ktorego jeszcze nie rozgryzlem ale znalazlem sposob na jego obejscie
a mianowicie program musi miec specjalna funkcje main(dla uslugi) - jest ona opisana na MSDN - chetnych zapraszam do lektury
jesli nie ma jej to po kilku sekundach sie wylaczy ale wystarczy teraz uzyc w zwyklym mainie funkcji WinExec i wystartowac inny program"

Teoretycznie twój Pasek.exe powinien zawierać np WinExec("c:/innyplik.exe",SW_MAXIMIZE);
"innyplik.exe" ma zawierać już tego twojego keya.

Ale niestety już to wypróbowałem i nie działa :/ Może Grzonu coś nam więcej podpowie jak będzie. Jak coś uda Ci się zrobić to napisz, ja też będę dalej próbował.
 

msvcrt

Użytkownik
Dołączył
Październik 15, 2011
Posty
71
No to może napisać taką prostą usługę która jedynie uruchamiała by twój program i nic więcej nie robiła.
 

Lucjan_Inferno

Użytkownik
Dołączył
Wrzesień 8, 2008
Posty
14
Hmmm w zasadzie mój exe tez jest usługą....Sprobowałem tak, lecz nic z tego....
Ten kod poniżej skompilowałem nazwałem usluga.exe i wkleiłem na dysk D
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
SC_HANDLE sh_manager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(!sh_manager)
{
return false; //nie udalo sie otworzyc SCManagera
}

SC_HANDLE service_handle=CreateService(sh_manager,"nazwa_naszej_uslugi7","nazwa_naszej_uslugi7",SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,"D:\\usluga.exe",NULL,NULL,NULL,NULL,NULL);
//powyzej odpalam usluga.exe
if(!service_handle)
{
if(GetLastError()==ERROR_SERVICE_EXISTS)//usluga o tej nazwie juz istnieje - czyli po restarcie jesli moj program uruchomil by się
{
service_handle= OpenService(sh_manager,"nazwa_naszej_uslugi7",SERVICE_ALL_ACCESS);
cout<<"Usluga istnieje ";
WinExec("D:\\pasek.exe", SW_SHOW); //Jesli po starcie uruchomi się usluga i spełni warunek to odpala program pasek.exe
}
else
{
CloseServiceHandle(sh_manager);//zamykamy uchwyty
CloseServiceHandle(service_handle);
return false;//nie udalo sie stworzyc uslugi
cout<<"Usluga off ";
}
}
else
{
if(StartService(service_handle,0,NULL)==0)//jesli nie ma zadnych bledow no to mozemy wystartowac nasza usluge :D
{
cout<<"Usluga onnnnn ";
WinExec("E:\\Informatyka\\Keyloger by Lucjan\\usluga\\uslugi.exe", SW_SHOW);




if(GetLastError()==ERROR_SERVICE_ALREADY_RUNNING)
{
return true;//zostala juz wczesniej uruchomiona
}
}
}
CloseServiceHandle(sh_manager);//zamykamy uchwyty
CloseServiceHandle(service_handle);
return true;
}

Hmmmm i teraz pytanie dlaczego usługa nie odpala mi programu usluga.exe ?
Nie ogarniam juz tego.... LIcze na odpowiedzi - PILNE :)
 
Do góry Bottom