taskkill命令ntsd命令行无法结束的进程我下载了一个“冰刃”进程程序,可以结束它请问我要写一个要用到那几个api呢?谢谢

解决方案 »

  1.   

    ExitProcess
    TerminateProcess不过这种强制结束线程的方法一般不推荐用,会导致一些资源泄露。
      

  2.   

    提升权限结束进程(2011-05-25 22:13:06)转载标签: 杂谈  
      
    1、进程相当于系统提供的一个平台,它可以包括一个或多个线程,如IE是个进程,
       打开多个网页是它的多个线程,把IE进程Kill掉即可关闭多个打开网页的线程。
    2、98和NT不一样。98下可以用CreateToolhelp32Snapshot函数Process32First和
       Process32Next来枚举当前所有进程的进程ID(先调用函数CreateToolhelp32Snapshot)
       NT下用EnumProcesses函数来枚举。2000是支持CreateToolhelp32Snapshot函数的。
       得到进程ID后就可以用OpenProcess函数得到句柄了,在NT和2000下要通过安全检测。
    3、EnumProcess 也可以得到系统中的进程列表
       杀掉本地进程其实很简单,取得进程ID后,调用OpenProcess函数打开进程句柄,然
       后调用TerminateProcess函数就可以杀掉进程了。有些情况下并不能直接打开进程句柄,
       例如WINLOGON等系统进程,因为权限不够。这个时候我们就得先提升自己的进程的权限了。
       提升权限过程也不复杂,先调用GetCurrentProcess函数取得当前进程的句柄,然后调用
       OpenProcessToken打开当前进程的访问令牌,接着调用LookupPrivilegeValue函数取得你
       想提升的权限的值,最后调用AdjustTokenPrivileges函数给当前进程的访问令牌增加权限
       就可以了。一般有了SeDebugPrivilege特权后,就可以杀掉除Idle外的所有进程了。
    1.OpenProcessToken
    要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作,只要当前进程具有SeDeDebug权限就可以了。要是一个用户是Administrator或是被给予了相应的权限,就可以具有该权限。可是,就算我们用Administrator帐号对一个系统安全进程执行OpenProcess(PROCESS_ALL_ACCESS,FALSE,          dwProcessID)还是会遇到“访问拒绝”的错误。什么原因呢?原来在默认的情况下进程的一些访问权限是没有被置为可用状态(即Enabled)的,所以我们要做的首先是使这些权限可用。与此相关的一些API函数有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。我们要修改一个进程的访问令牌,首先要获得进程访问令牌的句柄,这可以通过OpenProcessToken得到,函数的原型如下:
    BOOL      OpenProcessToken(
               HANDLE      ProcessHandle,       //要修改访问权限的进程句柄
               DWORD      DesiredAccess,        //指定你要进行的操作类型
               PHANDLE      TokenHandle         //返回的访问令牌指针
         );
    成功返回非0;
    参数说明:
    第一参数是要修改访问权限的进程句柄;
    第三个参数就是返回的访问令牌指针;
    第二个参数指定你要进行的操作类型,如要修改令牌我们要指定第二个参数为TOKEN_ADJUST_PRIVILEGES(其它一些参数可参考Platform          SDK)。通过这个函数我们就可以得到当前进程的访问令牌的句柄(指定函数的第一个参数为GetCurrentProcess()就可以了)。接着我们可以调用AdjustTokenPrivileges对这个访问令牌进行修改。
    包含头文件Winbase.h2.LookupPrivilegeValue
    获取当前系统上,指定权限名字的唯一标志(LUID),函数原形如下:
    BOOL LookupPrivilegeValue(
      LPCTSTR lpSystemName,
      LPCTSTR lpName,
      PLUID lpLuid
    );
    成功返回非0;
    参数说明:
    lpSystemName
     [in]传入参数,字符传指针;指定需要获取权限的操作系统名字,如果传入null,那么将在本地系统上查询指定权限名的LUID;
    lpName
     [in]传入参数,字符串指针;指定需要查询LUID的权限名字,可以系统中定义了的权限产量(如SE_SECURITY_NAME),也可以是一个自己定义的字符串(如"SeSecurityPrivilege");
    lpLuid
     [out]传出参数,字符串指针; 传出权限名字指定的LUID;
    包含头文件Winbase.h3.AdjustTokenPrivileges
     根据指定的权限令牌,置进程的权限为可用或不可用;
     函数原型:
    BOOL AdjustTokenPrivileges(
      HANDLE TokenHandle,
      BOOL DisableAllPrivileges,
      PTOKEN_PRIVILEGES NewState,
      DWORD BufferLength,
      PTOKEN_PRIVILEGES PreviousState,
      PDWORD ReturnLength
    );
    参数说明:
    TokenHandle
    [in]包含需要修改权限的令牌句柄.这个参速需要有TOKEN_ADJUST_PRIVILEGES权限.如果参数PreviousState=NULL,那么句柄已应该拥有TOKEN_QUERY权限.
    DisableAllPrivileges
    [in]是否置所有的权限为不可用状态.如果值=TRUE,使所有的权限不可用,并且忽略NewState参数.如果为FALSE,那么该函数将修改这些权限为NewState参数所指的状态.
    NewState
    [in]指向一个描述权限属性的TOKEN_PRIVILEGES结构数组.如果DisableAllPrivileges=FALSE,那么AdjustTokenPrivileges将使数组中指向的属性为可用,不可用状态或者删除.
       系统中定义的三个常量SE_PRIVILEGE_ENABLED,SE_PRIVILEGE_ENABLED,SE_PRIVILEGE_REMOVED.
      Windows XP/2000/NT中,不能删除权限
    BufferLength
    [in] 以字节为单位指定了PreviousState所指缓冲buffer的长度,如果PreviousState参数为NULL,那么BufferLength可以被置为0.
    PreviousState
    [out] 传输AdjustTokenPrivileges参作将修改的属性的修改前状态,可以被置为NULL;
    ReturnLength
    [out] 返回PreviousState请求字节长度,如果PreviousState=NULL,这个参数可以为NULL;
    包含头文件Winbase.h4.OpenProcessToken ,LookupPrivilegeValue,AdjustTokenPrivileges引用举例
    BOOL EnableDebugPrivilege(BOOL fEnable) {
    BOOL fOk = FALSE;    // Assume function fails
    HANDLE hToken;
       //以修改选项,获取当前进程的令牌环
       if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
       {
          TOKEN_PRIVILEGES tp;
          tp.PrivilegeCount = 1;
       //获取debug权限的luid
          LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
       //将权限属性置为可用
          tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
       //修改权限
          AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
          fOk = (GetLastError() == ERROR_SUCCESS);
          CloseHandle(hToken);
       }
       return(fOk);

    //结束进程#include<windows.h>
    #include<process.h>
    #include<string.h>
    #include<Tlhelp32.h>DWORD GetProcessIdFromName(char * name)
    {
     PROCESSENTRY32 pe;
     DWORD id = 0;
     
     HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
     pe.dwSize = sizeof(PROCESSENTRY32);
     if( !Process32First(hSnapshot,&pe)) return 0;
     do
     {
      pe.dwSize = sizeof(PROCESSENTRY32);
      if( Process32Next(hSnapshot,&pe)==FALSE ) break;
      if(strcmp(pe.szExeFile,name) == 0)
      {
       id = pe.th32ProcessID;
       break;
      }
     } while(TRUE);
     CloseHandle(hSnapshot);
     return id;
    }int WINAPI WinMain(  HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow){
    //////////////////////////////////////////////////////////////////////     提升权限为SE_DEBUG_NAME
     HANDLE hToken;
     if(OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
     {
      LUID luid;
      if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
      {
       TOKEN_PRIVILEGES TokenPrivileges;
       TokenPrivileges.PrivilegeCount = 1;
       TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
                TokenPrivileges.Privileges[0].Luid = luid;
       AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, 0, NULL, NULL);
      }
      CloseHandle(hToken);
     }
    ///////////////////////////////////////////////////////////////////////     DWORD pid=GetProcessIdFromName("WINLOGON.EXE");          //结束WINLOGO.EXE进程
     HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
     TerminateProcess(hProcess, 0);
     return 0;
    }
      

  3.   

    办法挺多的, 还可以FreeLibrary, UnmapviewOfFile, 进程内存清0等