Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

Запуск сервиса.

Ниже представлен пример, который для запуска сервиса открывает дескриптор сервиса из базы сервисов, а затем передаёт его в функцию StartService. После запуска сервиса, пример использует структуру SERVICE_STATUS, возвращаемую функцией QueryServiceStatus, чтобы получить состояние сервиса.

 

DWORD StartSampleService()
 {
     SERVICE_STATUS ssStatus;
     DWORD dwOldCheckPoint;
     DWORD dwStartTickCount;
     DWORD dwWaitTime;
     DWORD dwStatus;
 
     schService = OpenService(
         schSCManager,          // база сервисов SCM
         "Sample_Srv",          // имя сервиса
         SERVICE_ALL_ACCESS);
 
     if (schService == NULL)
     {
         MyErrorExit("OpenService");
     }
 
     if (!StartService(
             schService,  // дескриптор сервиса
             0,           // количество аргументов
             NULL) )      // нет аргументов
     {
         MyErrorExit("StartService");
     }
     else
     {
         printf("Service start pending.\n");
     }
 
     // Проверяем состояние сервиса до тех пор, пока он не запустится.
 
     if (!QueryServiceStatus(
             schService,   // дескриптор сервиса
             &ssStatus) )  // адрес структуры с информацией о сервисе
     {
         MyErrorExit("QueryServiceStatus");
     }
 
     // Сохраняем счётчик тиков и начальную точку.
 
     dwStartTickCount = GetTickCount();
     dwOldCheckPoint = ssStatus.dwCheckPoint;
 
     while (ssStatus.dwCurrentState == SERVICE_START_PENDING)
     {
         // Не нужно ожидать дольше, чем приблизительное время,
         // необходимое для старта. Обычно ожидать лучше всего одну
         // десятую этого значения, но не более одно секунды
         // и никак не более 10 секунд.
 
         dwWaitTime = ssStatus.dwWaitHint / 10;
 
         if( dwWaitTime < 1000 )
             dwWaitTime = 1000;
         else if ( dwWaitTime > 10000 )
             dwWaitTime = 10000;
 
         Sleep( dwWaitTime );
 
         // Снова проверяем статус.
 
         if (!QueryServiceStatus(
                 schService,   // дескриптор сервиса
                 &ssStatus) )  // адрес структуры
             break;
 
         if ( ssStatus.dwCheckPoint > dwOldCheckPoint )
         {
             // Сервис в процесса старта.
 
             dwStartTickCount = GetTickCount():
             dwOldCheckPoint = ssStatus.dwCheckPoint;
         }
         else
         {
             if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint)
             {
                 // Время до старта не изменилось
                 break;
             }
         }
     }
 
     if (ssStatus.dwCurrentState == SERVICE_RUNNING)
     {
         printf("StartService SUCCESS.\n");
         dwStatus = NO_ERROR;
     }
     else
     {
         printf("\nСервис на запущен. \n");
         printf("  Current State: %d\n", ssStatus.dwCurrentState);
         printf("  Exit Code: %d\n", ssStatus.dwWin32ExitCode);
         printf("  Service Specific Exit Code: %d\n",
             ssStatus.dwServiceSpecificExitCode);
         printf("  Check Point: %d\n", ssStatus.dwCheckPoint);
         printf("  Wait Hint: %d\n", ssStatus.dwWaitHint);
         dwStatus = GetLastError();
     }
 
     CloseServiceHandle(schService);
     return dwStatus;
 }


<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS