'프로세스'에 해당되는 글 13건

  1. 2011.06.15 원격 윈도우 프로세스 제어 (taskkill, tasklist)
  2. 2010.01.06 [윈도우] 숨겨진 프로세스를 찾는 방법들
  3. 2010.01.06 Windows 프로세스 모니터링 및 관리
2011.06.15 19:15

원격 윈도우 프로세스 제어 (taskkill, tasklist)

윈도우 환경에서 원격 호스트의 프로세스 리스트 및 프로세스 종료를 수행할 수 있는 명령이다.

 

/P를 입력안하면, 권한 요청시 암호를 입력할 수 있다.

 

예)

> tasklist /S 111.222.111.222 /U User /P pppp

 

> taskkill /S 111.222.111.222 /U User /P pppp /IM aaa.exe

 



TASKLIST [/S 시스템 [/U 사용자 이름 [/P [암호]]]]
         [/M [모듈] | /SVC | /V] [/FI 필터] [/FO 형식] [/NH]

설명:
    이 명령줄 도구는 현재 로컬 또는 원격 시스템에서
    실행되고 있는 응용 프로그램 및 관련 작업/프로세스 목록을
    표시합니다.

매개 변수 목록:
   /S     시스템           연결할 원격 시스템을 지정합니다.

   /U     [domain\]user    명령을 실행해야 하는 사용자
                           컨텍스트를 지정합니다.

   /P     [암호]           해당 사용자 컨텍스트의 암호를 지정합니다.
                           생략한 경우에는 물어봅니다.

   /M     [모듈]           해당 패턴 이름과 일치하며 DLL 모듈이 로드된
                           모든 작업을 나열합니다.
                           모듈 이름을 지정하지 않으면
                           각 작업에서 로드한 모든 모듈을 표시합니다.

   /SVC                    각 프로세스에 있는 서비스를 표시합니다.

   /V                      자세한 정보를 표시하도록
                           지정합니다.

   /FI    필터             필터에서 지정한 조건과 일치하는
                           작업 집합을 표시합니다.

   /FO    형식             출력 형식을 지정합니다.
                           사용할 수 있는 값: "TABLE", "LIST", "CSV".

   /NH                     출력에 표시하지 않을 "열 머리글"을
                           지정합니다.
                           "TABLE"과 "CSV" 형식에서만 사용할 수 있습니다.

   /?                      이 도움말/사용법을 표시합니다.

필터:
    필터 이름       유효한 연산자             유효한 값
    -----------     ---------------           --------------
    STATUS          eq, ne                    RUNNING | NOT RESPONDING
    IMAGENAME       eq, ne                    이미지 이름
    PID             eq, ne, gt, lt, ge, le    PID 값
    SESSION         eq, ne, gt, lt, ge, le    세션 번호
    SESSIONNAME     eq, ne                    세션 이름
    CPUTIME         eq, ne, gt, lt, ge, le    CPU 시간
                                              (hh:mm:ss 형식)
                                              hh - 시간,
                                              mm - 분, ss - 초
    MEMUSAGE        eq, ne, gt, lt, ge, le    메모리 사용(KB)
    USERNAME        eq, ne                    사용자 이름([domain\]user
                                              형식)
    SERVICES        eq, ne                    서비스 이름
    WINDOWTITLE     eq, ne                    창 제목
    MODULES         eq, ne                    DLL 이름

예:
    TASKLIST
    TASKLIST /M
    TASKLIST /V
    TASKLIST /SVC
    TASKLIST /M wbem*
    TASKLIST /S 시스템 /FO LIST
    TASKLIST /S 시스템 /U domain\username /FO CSV /NH
    TASKLIST /S 시스템 /U 사용자 이름 /P 암호 /FO TABLE /NH
    TASKLIST /FI "USERNAME ne NT AUTHORITY\SYSTEM" /FI "STATUS eq running"

 

 

 

TASKKILL [/S 시스템 [/U 사용자 이름 [/P [암호]]]]
         { [/FI 필터] [/PID 프로세스 id | /IM 이미지 이름] } [/F] [/T]

설명:
    이 명령줄 도구는 하나 이상의 프로세스를 종료하기 위해 사용할 수 있습니다.
    프로세스 id 또는 이미지 이름으로 프로세스를 종료할 수 있습니다.

매개 변수 목록:
    /S    시스템           연결할 원격 시스템을 지정합니다.

    /U    [domain\]user    명령을 실행해야 하는 사용자
                           컨텍스트를 지정합니다.

    /P    [암호]           해당 사용자 컨텍스트의 암호를 지정합니다.
                           생략한 경우에는 물어봅니다.

    /F                     프로세스를 강제로 종료하도록
                           지정합니다.

    /FI   필터             필터에서 지정한 조건과 일치하는
                           작업 집합을 표시합니다.

    /PID  프로세스 id      종료해야 하는 프로세스의 PID를
                           지정합니다.

    /IM   이미지 이름      종료해야 하는 프로세스의 이미지 이름을
                           지정합니다. 와일드 카드 문자 '*'를 사용하여
                           모든 이미지 이름을 지정할 수 있습니다.

    /T                     트리 종료: 지정된 프로세스와 그 프로세스로부터 시작된
                           모든 자식 프로세스를 종료합니다.

    /?                     이 도움말/사용법을 표시합니다.

필터:
    필터 이름   유효한 연산자           유효한 값
    -----------   ---------------           --------------
    STATUS        eq, ne                    RUNNING | NOT RESPONDING
    IMAGENAME     eq, ne                    이미지 이름
    PID           eq, ne, gt, lt, ge, le    PID 값
    SESSION       eq, ne, gt, lt, ge, le    세션 번호.
    CPUTIME       eq, ne, gt, lt, ge, le    CPU 시간 형식
                                            hh:mm:ss
                                            hh - 시간,
                                            mm - 분, ss - 초
    MEMUSAGE      eq, ne, gt, lt, ge, le    메모리 사용(KB)
    USERNAME      eq, ne                    사용자 이름([domain\]user
                                            형식)
    MODULES       eq, ne                    DLL 이름
    SERVICES      eq, ne                    서비스 이름
    WINDOWTITLE   eq, ne                    창 제목

참고: /IM 스위치에 대한 와일드 카드 문자 '*'는 필터에서만 사용할 수 있습니다.

참고: 원격 프로세스의 종료는 /F 옵션 지정 여부와 상관없이
      항상 강제적으로 수행됩니다.

예:
    TASKKILL /S 시스템 /F /IM notepad.exe /T
    TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
    TASKKILL /F /IM notepad.exe /IM mspaint.exe
    TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
    TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe
    TASKKILL /S 시스템 /U domain\username /FI "USERNAME ne NT*" /IM *
    TASKKILL /S 시스템 /U 사용자 이름 /P 암호 /FI "IMAGENAME eq note*"



출처 : http://blog.naver.com/xlogic/

Trackback 0 Comment 0
2010.01.06 10:29

[윈도우] 숨겨진 프로세스를 찾는 방법들

 1. EPROCESS의 ActiveProcessLinks Linked List를 이용해서 Traverse.
 ( 왠만한 루트킷들은 이 값을 조작하므로 별로 소용없을지도 모르지만,
  ZwQuerySystemInformation()을 후킹하여 결과값을 조작하는 식으로 숨기는 경우는
  이 방법으로 손쉽게 찾아낼 수 있습니다. )

 2. ZwOpenProcess() Brute-Force Detection
 유효 PID인 0L부터 0xFFFFL까지 4의 배수들을 모두 Open해서 성공적으로 열어지는 프로세스를
 감지합니다. 단, 프로세스가 종료되었으나 핸들이 닫히지 않은 경우에도 Open되므로 추가적인
 확인이 필요합니다.

 3. PspCidTable Traverse
 Windows NT에는 PspCidTable이라는 Unexported Symbol이 존재하는데, 프로세스와 스레드에
 대한 개체 포인터들을 저장하고 있는 핸들 테이블의 일종입니다. 이를 트레버싱하여 숨겨진
 프로세스를 찾을 수도 있습니다.
 ( 개체 포인터만 저장되어있으므로, 포인터-0x18 한 값이 가리키는 OBJECT_HEADER 헤더의
 Type 필드가 PsProcessType인지 검사해줄 필요가 있습니다. )

 4. Process Handle Table Link Traverse
 EPROCESS에는 HandleTable 필드가 존재하고 이 안에는 링크드 리스트가 존재합니다.
 이 리스트를 이용해서 트레버싱하면 모든 EPROCESS를 찾을 수 있습니다.

 5. CSRSS.EXE의 Handle Table Traversing
 CSRSS.EXE 프로세스는 프로세스 시작을 커널에 통지하고 그 뒷처리를 하는 역할을 하기도 합니다.
 (BaseSetProcessCreateNotify라는 Unexported/Undocumented Symbol을 이용합니다.
 이 심볼 포인터를 후킹함으로써 User Mode에서 폴링(Polling) 과정 없이 프로세스 시작을
 감지하는 방법을 구현한 적이 있습니다. http://blog.naver.com/startgoora/130026875156 )
 때문에 CSRSS.EXE에는 모든 프로세스에 대한 핸들이 저장되어있습니다.

 * 참고적으로 이를 반대로 이용하여 NtOpenProcess()를 거치지 않고 프로세스를 여는 방법중의 하나로 NtQuerySystemInformation()으로 모든 핸들을 얻어온 후 NtDuplicateObject()를 사용하여 핸들을 복사할 수 있습니다.

 6. Memory Scanning
 Process 개체 이전에 붙는 OBJECT_HEADER로 Scan하는 방법입니다.
 http://vbdream.tistory.com/entry/Kernel-탐구-숨겨진-EPROCESS를-찾는-방법-1-Memory-Scanning
 에서 PoC(Proof-of-Concept) 코드로 올린 바가 있습니다.

 7. ETHREAD로 부터 프로세스 개체 얻기
 ETHREAD::ThreadsProcess 필드를 응용하면 EPROCESS의 Pointer를 취득할 수 있습니다.
 PspCidTable이나 링크드 리스트를 이용해서 ETHREAD를 구할 수 있습니다.
 그리고 EPROCESS의 UniqueProcessId가 조작되어도 ETHREAD::Cid를 이용하면
 원래 PID를 구할 수도 있습니다.

 8. PsSetCreateProcessNotifyRoutine()
 프로세스 생성과 종료에 대한 콜백을 등록할 수 있습니다.
 드라이버 로드시에 모든 프로세스를 얻어놓고 이 콜백에 의존하여 리스트를 빼거나 추가함으로써
 순수한 프로세스 리스트를 얻을 수가 있겠죠.
 (비슷한 것으로 PsSetCreateThreadNotifyRoutine와 PsSetLoadImageNotifyRoutine가 있습니다.)
 
 9. CSRSS.EXE::BaseSetProcessCreateNotify Hook
 위에서도 잠깐 언급하였으며 http://blog.naver.com/startgoora/130026875156 를 참고하세요.
 이 방법은 프로세스 시작만 감지할 수 있다는 단점이 있습니다.
 ( 뭐... CSRSS.EXE의 ZwClose를 후킹하면 될지도 모른다는 생각이 드는군요. :-) )


출처 : http://blog.naver.com/startgoora

Trackback 0 Comment 0
2010.01.06 10:11

Windows 프로세스 모니터링 및 관리

시스템에서 프로세스를 사용 중인 경우 가끔 주어진 시간에 실행되고 있는 모든 프로세스를 볼 필요가 있습니다. 예를 들어, 프로세스 중지 기능을 제공하는 응용 프로그램을 만들려면 먼저 어느 프로세스가 실행되고 있는지 알아야 합니다. 목록 상자를 프로세스 이름으로 채우고 각각 다른 작업을 수행하는 프로세스를 선택할 수 있습니다.

실행 중인 프로세스를 보려면

  1. Process 형식의 빈 배열을 선언합니다.

  2. 빈 배열을 GetProcesses 메서드의 반환 값으로 채웁니다.

  3. 배열에서 각 프로세스의 이름을 얻으려면 인덱싱된 값을 사용하여 프로세스 배열을 검색하고 콘솔에 씁니다.

    다음 예제에서는 Process 구성 요소의 GetProcesses 메서드를 호출하여 프로세스 배열을 반환하고 콘솔에 ProcessName 값을 쓰는 방법을 보여 줍니다.

    Visual Basic
    Dim myProcesses() As Process
    Dim myProcess As Process
    myProcesses = Process.GetProcesses()
    ' Iterate through the process array.
    For Each myProcess In myProcesses
        Console.WriteLine(myProcess.ProcessName)
    Next
    C#
    Process[] myProcesses = Process.GetProcesses();
    foreach (Process myProcess in myProcesses)
    {
        Console.WriteLine(myProcess.ProcessName);
    }

출처 : msdn.microsoft.com

Trackback 0 Comment 0