• XSS.stack #1 – первый литературный журнал от юзеров форума

Запуск Windows service как exe

Пожалуйста, обратите внимание, что пользователь заблокирован
The minimum requirements for any exe(or even any PE file) for run as a service are the following:
  • A Main Entry point (like any application)
  • A Service Entry point
  • A Service Control Handle
The Service Main Entry Point performs the following tasks:
  • Initialize any required things that we postponed from the Main Entry Point.
  • Register the service control handler (ControlHandler) that will process Service Stop, Pause, Continue, etc. control commands.
  • These are registered as a bit mask via the dwControlsAccepted field of the SERVICE STATUS structure.
  • Set Service Status to SERVICE RUNNING.
  • Perform initialization procedures. Such as creating threads/events/mutex/IPCs, etc.
C:
void ServiceMain(int argc, char** argv) {
  serviceStatus.dwServiceType        = SERVICE_WIN32;
  serviceStatus.dwCurrentState       = SERVICE_START_PENDING;
  serviceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
  serviceStatus.dwWin32ExitCode      = 0;
  serviceStatus.dwServiceSpecificExitCode = 0;
  serviceStatus.dwCheckPoint         = 0;
  serviceStatus.dwWaitHint           = 0;

  hStatus = RegisterServiceCtrlHandler("MeowService", (LPHANDLER_FUNCTION)ControlHandler);
  RunMeow();

  serviceStatus.dwCurrentState = SERVICE_RUNNING;
  SetServiceStatus (hStatus, &serviceStatus);

  while (serviceStatus.dwCurrentState == SERVICE_RUNNING) {
    Sleep(SLEEP_TIME);
  }
  return;
}

The Service Control Handler was registered in your Service Main Entry point. Each service must have a handler to handle control requests from the SCM:

C:
void ControlHandler(DWORD request) {
  switch(request) {
    case SERVICE_CONTROL_STOP:
      serviceStatus.dwWin32ExitCode = 0;
      serviceStatus.dwCurrentState  = SERVICE_STOPPED;
      SetServiceStatus (hStatus, &serviceStatus);
      return;

    case SERVICE_CONTROL_SHUTDOWN:
      serviceStatus.dwWin32ExitCode = 0;
      serviceStatus.dwCurrentState  = SERVICE_STOPPED;
      SetServiceStatus (hStatus, &serviceStatus);
      return;

    default:
      break;COM DLL hijack
  }
  SetServiceStatus(hStatus,  &serviceStatus);
  return;
}

Took here - https://cocomelonc.github.io/tutorial/2022/05/09/malware-pers-4.html

Feel free to ask more qu. here. Enjoy the coding.

ЗЫ - сорян сначала подумал ты амер, потом пригляделся, такие ошибки в словах обычно только у русских.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Можно попробовать пропатчить точку входа , нужно смотреть конкретный ехе, что он там делает и как.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Сервис - служба это по сути статика закрепа в системе (процессы) положил бинарь в папку ауторана - профит =ехекуте exe .
мужик, ты сам понял что написал?
 
Если ты про bruteratel, где экзешник только через SCM стартует, то проще собрать шеллкод и прикрутить к нему загрузчик.
 
Пожалуйста, обратите внимание, что пользователь заблокирован

можно подробнее про точку входа.​

Как это практически реализовать ?
Сервис в винде обычно состоит минимум из трех функций. Это ServiceMain , которую вызывает диспетчер служб, ServiceControlHandler, который реагирует на команды остановки/запуска и т.д. службы, и собственно main - функция где есть основной код сервиса. В теории, если в ServiceMain не идет ничего важного (вида, инициализация какой-то глобальной переменной, нужной дальше по коду), можно изменить РЕ->optional_header->entry point на адрес функции main, и код заработает как обычный ехе файл. Практически - надо изучать конкретный бинарник, реверсить его и смотреть что да как.
 
Сервис в винде обычно состоит минимум из трех функций. Это ServiceMain , которую вызывает диспетчер служб, ServiceControlHandler, который реагирует на команды остановки/запуска и т.д. службы, и собственно main - функция где есть основной код сервиса. В теории, если в ServiceMain не идет ничего важного (вида, инициализация какой-то глобальной переменной, нужной дальше по коду), можно изменить РЕ->optional_header->entry point на адрес функции main, и код заработает как обычный ехе файл. Практически - надо изучать конкретный бинарник, реверсить его и смотреть что да как.
Строго говоря - минимум 2. Служебная dll может не иметь точки входа, только экспортировать ServiceMain - например, exe при инфекте обнуляет точку входа и меняет характеристики файла на dll, прописывается как служебная dll и становится легитимный svchost с нашей dll на борту. А вообще не понятно, чем сложность: достаточно на точе входа вызывать StartServiceCtrlDispatcher и если мы не служба - она вернет ERROR_FAILED_SERVICE_CONTROLLER_CONNECT. Т.е. на одной точке входа быть и службой и обычной exe
 
Спасибо всем за ответы, но ни чего не понятно.

Все таки, как практически это все реализовать?
примерно так:
C:
#define HACK_THE_PLANET_SERVICE L"HackThePlanet"

static void Payload()
{
    /// real main()
    return;
}

static void WINAPI ServiceHandler(DWORD fdwControl)
{
    /// ...
    return;
}

static void WINAPI ServiceMain(DWORD dwArgc,LPWSTR *lpszArgv)
{
    SERVICE_STATUS_HANDLE hSvcStatus=RegisterServiceCtrlHandler(HACK_THE_PLANET_SERVICE,ServiceHandler);
    if (hSvcStatus)
    {
        SERVICE_STATUS SvcStatus={0};
        SvcStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;
        SvcStatus.dwCurrentState=SERVICE_RUNNING;
        SvcStatus.dwWin32ExitCode=NO_ERROR;
        SetServiceStatus(hSvcStatus,&SvcStatus);

        Payload();
    }
    return;
}
void main()
{
    SERVICE_TABLE_ENTRYW ServiceEntry[]=
    {
        {HACK_THE_PLANET_SERVICE,(LPSERVICE_MAIN_FUNCTIONW)ServiceMain},
        {NULL,NULL}
    };

    if (StartServiceCtrlDispatcher(ServiceEntry))
        return;

    Payload();
    return;
}
 
Запускается толоко как Windows service (без параметров)

Возиожно ли ее запустить как обычный exe ?
Попытайтесь запустить Ваш exe из CLI c ключами:

Код:
ваша_программа --help
ваша_программа -help
ваша_программа -h
ваша_программа --info
ваша_программа -i
ваша_программа /h
ваша_программа /H

И конечно стоит её дизассемблировать и глянуть список строк, предварительно проанализировав её в DiE, ибо ХЗ на чём она написана и чем накрыта.
 
Alex_lonescu ,спасибо за код.
Но все равно ни чего не понятно :)
Объясни подробнее, что куда пихать.

Например сюда:
Код:
static void Payload()
{
    /// real main()
    return;
}

и сюда:
Код:
static void WINAPI ServiceHandler(DWORD fdwControl)
{
    /// ...
    return;
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Но все равно ни чего не понятно
Спрошу иначе - у тебя есть опыт в вин32 разработке / реверсе? Если нет, то понятно что ничего не понятно, это не вставить скрипт на сайт, тут надо или разбираться, или давать тем, кто разбирается.
уже говорил - выкладывай ехе сюда или пиши в комерц.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх