Как правильно убивать процесс?

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

  1. gyrus

    gyrus New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2007
    Сообщения:
    15
    Уважаемые Дзенствующие! Проконсультируйте по вот какому вопросу
    Как правильно убивать процесс?
    Я делаю, как и в нескольких примерах/туториалах/вирусах
    вот так:
    Код (Text):
    1.     invoke  OpenProcess, PROCESS_TERMINATE, 1, ID
    2.     .IF     eax
    3.         push    eax
    4.         invoke  TerminateProcess, eax, 0
    5.         call    CloseHandle
    6.     .ENDIF
    Процесс это конечно, вырубает. Но динамические библиотеки,
    которыми он пользовался, остаются занятыми, и их нельзя
    удалить (а мне как раз это надо сделать).

    В MSDN, собственно, так и говорится о функции TerminateProcess -
    мол, поведение используемых библиотек непредсказуемо.

    Тогда как же корректно удалять?
    ведь Task Manager как-то это делает корректно....
    Поделитесь информацией, если кто знает.

    Спасибо
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Ты все правильно написал по части кода. Но ты уверен что те библиотеки использует только убиенный процесс??? Скорее всего, их использует кто-то еще, ибо после убития процесса все открытые им хэндлы, в т.ч. и библиотеки, освобождаются (читай закрываются)!
     
  3. gyrus

    gyrus New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2007
    Сообщения:
    15
    Я уверен, что больше эту библиотеку ничего не использует.
    Во-первых, при обрубании процесса через диспетчер все проходит нормально

    Во-вторых, эту библиотеку получается расшарить простым LoadLibrary/FreeLibrary
    но на это уходит секунд 10-20, поэтому это не может служить рабочим вариантом

    В-третьих, вот, собственно, фрагмент MSDN, прямо говорящий о
    некорректности того что я делаю:
    Код (Text):
    1. The TerminateProcess function is used to unconditionally cause a process
    2. to exit. Use it only in extreme circumstances. The state of global data maintained
    3. by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used
    4. rather than ExitProcess.
    Можно ли процесс как-то ЗАВЕРШИТЬ, а не останавливать?
     
  4. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    CreateRemoteThread() + ExitProcess()?
     
  5. gyrus

    gyrus New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2007
    Сообщения:
    15
    2 nester7

    а поподробнее можно?

    под процессом имеется ввиду приложение (без окон)
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Тогда открываешь процесс на запись, выделяешь в нем память (VirtualAllocEx), копируешь туда код (WriteProcessMemory), который вызовет ExitProcess, и создаешь удаленный тред (CreateRemoteThread)
     
  7. gyrus

    gyrus New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2007
    Сообщения:
    15
    неужели и TASKMANAGER так делает???
     
  8. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Логичный вопрос. Хм... Не знаю, но я просто дал ответ на твой вопрос
     
  9. gyrus

    gyrus New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2007
    Сообщения:
    15
    Попробовал вот так:
    Код (Text):
    1. KillProcess proc ID: DWORD
    2.     LOCAL procHandle:HANDLE
    3.     LOCAL procThread:HANDLE
    4.     LOCAL fnExitProcess:DWORD
    5.     LOCAL hKernel:HMODULE
    6.  
    7.     invoke  OpenProcess, PROCESS_ALL_ACCESS, 0, ID
    8.     .IF     eax
    9.         mov procHandle, eax
    10.         .IF procHandle != INVALID_HANDLE_VALUE
    11.         invoke GetModuleHandle, addr lpKernel
    12.         mov hKernel, eax
    13.         invoke GetProcAddress, hKernel, addr lpExitProcess
    14.         .IF eax
    15.            mov fnExitProcess, eax
    16.            invoke CreateRemoteThread, procHandle, NULL, 0, fnExitProcess, 0, 0, NULL      
    17.            .IF eax
    18.               mov procThread,eax  
    19.           invoke WaitForSingleObject, procThread, INFINITE
    20.           invoke CloseHandle, procThread
    21.        .ENDIF
    22.     .ENDIF
    23.     invoke CloseHandle, procHandle
    24.     .ENDIF
    25.     .ENDIF
    26.     ret
    27. KillProcess endp
    но эффект не изменился...
     
  10. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    дык ты ж адрес ExitProcess ищешь в своем адресном пространстве! тебе нужен адрес это апишки в искомом процессе! Если так действовать, то тебе надо будет читать и обрабатывать таблицу импорта и в ней искать эту функцию. Так таскменеджер явно не делает :)
     
  11. gyrus

    gyrus New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2007
    Сообщения:
    15
    напиши как правильно
     
  12. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Пиши так, как я говорил в ответе #6. Внутрь закрываемого процесса пиши такой код:
    Код (Text):
    1. push 07E9FAD36h;      это число - хэш строки "ExitProcess"
    2. call GetAPI
    3. push 0
    4. call eax
    5.  
    6. GetAPI proc FHash:DWORD
    7. LOCAL VAOrdinalTable:   DWORD
    8. LOCAL VANameTable:      DWORD
    9. LOCAL VAAddressTable:   DWORD
    10.  
    11.     ;Поиск таблиц имен, ординалов и адресов
    12.     pushad
    13.     assume fs:nothing
    14.     mov eax,fs:[030h]       ;eax => pointer to PEB
    15.     mov eax,[eax+0Ch]       ;eax => pointer to PEB_LDR_DATA
    16.     mov eax,[eax+0Ch]       ;eax => pointer to LDR_MODULE
    17.     mov eax,[eax]           ;ntdll LDR_MODULE
    18.     mov eax,[eax]           ;kernel LDR_MODULE
    19.     mov eax,[eax+18h]       ;kernel image base
    20.  
    21.     mov ebx,eax
    22.     add eax,[eax+3Ch]
    23.     mov eax,[eax+78h]
    24.     add eax,ebx
    25.     lea esi,[eax+1Ch]
    26.     lea edi,VAAddressTable
    27.     mov ecx,3
    28. next_table:
    29.     lodsd
    30.     add eax,ebx
    31.     stosd
    32.     loop next_table
    33.  
    34.     ;Поиск адресов функций в таблице экспорта
    35.     mov esi,VANameTable
    36.     mov edx,-1
    37. next_func:
    38.     inc edx
    39.     lodsd
    40. get_hash:
    41.     pushad
    42.  
    43.     lea esi,[eax+ebx]                ;функция получения хэша из строки
    44.     xor ebx,ebx                       ;esi - указатель на строку
    45.     xor edx,edx
    46.     imul eax,edx,5
    47. @@: ror eax,7
    48.     inc edx
    49.     ror edx,7
    50.     add eax,edx
    51.     xor ebx,eax
    52.     lodsb
    53.     test al,al
    54.     jnz @B                 ;конец функции получения хэша; хэш в ebx
    55.  
    56.     mov [esp+7*4],ebx
    57.     popad
    58.     cmp FHash,eax
    59.     jz hash_ok
    60.     jmp next_func
    61.  
    62.     ;Получение и сохранение адреса функции
    63. hash_ok:
    64.     shl edx,1
    65.     add edx,VAOrdinalTable
    66.     movzx eax,word ptr [edx]
    67.     shl eax,2
    68.     add eax,VAAddressTable
    69.     mov eax,[eax]
    70.     add eax,ebx
    71.     mov [esp+7*4],eax
    72.     popad
    73.     ret
    74. GetAPI endp
    Извини, влом тестировать код. Посмотри, вроде бы должен работать
     
  13. gyrus

    gyrus New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2007
    Сообщения:
    15
    просто нет слов...
    ньюбовский вопрос: а как из этого кода по-быстрому db-файл сделать?
     
  14. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    1) шо такое ньюбовский вопрос?
    2) зачем тебе db? вставляй прямо в код.
    3) если уж на то пошло, скомпилируй этот код и сделай его дамп. А для перевода файла в формат db (если я правильно понимаю, что это такое) есть спец. утилита в пакете масма. Ну или аттач смотри - там через ком. строку работает (просто укажи в ком. строке имя файла).
     
  15. gyrus

    gyrus New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2007
    Сообщения:
    15
    1) ньюбовский вопрос - это когда человек новичек.
    2) а ведь действительно...
    3) в db я умею переводить из бинарника, а не из исходника напрямую...

    код компилируется
    теперь осталось выжать из тебя код от VirtualAllocEx до CreateRemoteThread ;)
     
  16. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Код (Text):
    1.     invoke VirtualAllocEx,hProc,0,loader_size,MEM_COMMIT,PAGE_EXECUTE_READWRITE
    2.     mov edi,eax
    3.     test eax,eax
    4.     jz _err
    5.  
    6.     invoke WriteProcessMemory,hProc,edi,offset code_to_insert,code_size,0       ;запись кода
    7.     test eax,eax
    8.     jz _err
     
  17. gyrus

    gyrus New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2007
    Сообщения:
    15
    реализовать этот вариант получилось. откомпилировать то есть.

    процесс умирает.
    но библиотека по-прежнему не расшаривается...

    уж готов подумать, что процесс/библиотека какие-то неправильные, но ведь как-то же их зараза диспетчер удаляет...
     
  18. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Значит так совпали звезды :)

    Как вариант, попробуй для них в этом же коде делать FreeLibrary. Или вааще юзай ZwDeleteFile - позволяет удалять даже занятые файлы. Или нет?
     
  19. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Таскманагер делает так:
    Проверяет системный ли процесс, если да то выходит.
    Выводит диалог пдотверждения.
    Проверяет процесс для VDM? Если да то VDMTerminateTaskWOW и exit.
    Ставит себе привелегию "SeDebugPrivilege".
    Открывает процесс с флагом PROCESS_TERMINATE.
    Терминирует его с dwExitCode == 1.
    Закрывает хендлы, освобождает ресурсы.
    Всё.

    По крайне мере так у меня в WinXP SP2.
     
  20. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    из-зп чего вообще это все? из-за того, что dllки не сразу выгружаются?
    они и не должны сразу, где-то в реестре есть параметр, управляющий их выгрузкой из оперативки (в смысле, отмапливанием секции)