杀掉本地进程,取得进程ID后,调用OpenProcess函数打开进程句柄,然
后调用TerminateProcess函数就可以杀掉进程了。有些情况下并不能直接打开进程句柄,例如WINLOGON等系统进程,因为权限不够。这个时候我们就得先提升自己的进程的权限了。提升权限过程也不复杂,先调用GetCurrentProcess函数取得当前进程的句柄,然后调用OpenProcessToken打开当前进程的访问令牌,接着调用LookupPrivilegeValue函数取得你想提升的权限的值,最后调用AdjustTokenPrivileges函数给当前进程的访问令牌增加权限就可以了。一般有了SeDebugPrivilege特权后,就可以杀掉除Idle外的所有进程了。

解决方案 »

  1.   

    DWORD GetProcessIdFromName(LPCTSTR 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(1);
    CloseHandle(hSnapshot);
    return id;
    }
    DWORD id=GetProcessIdFromName("EXCEL.EXE");
    HANDLE myhandle=OpenProcess(PROCESS_ALL_ACCESS,TRUE,id);
    DWORD exitcode=0;
    TerminateProcess(myhandle,exitcode);
      

  2.   

    先定义CEvent g_eventKill全局事件对像
    再在你所要控制的线程中添加(在循环语句中)
    if(::WaitForSingleObject(g_eventKill,0)==WAIT_OBJECT_0) break;
    这样在你需要结束这个线程时只要
    g_eventKill.SetEvent();就行了.
      

  3.   

    这个难点是由己知进程名取得取程ID?
    版本masterz 说得太简了,我们是新手,我们理解很费劲。 
      

  4.   

    请 masterz()哥哥给大家说清楚一点。
    不同意的,请举起脚走出来。哈哈!
      

  5.   

    to masterz
    你说的是在管理员权限下的如果是一般用户通过DEBUG漏洞才行呀!
    还有就是取得了句柄后可以用注入线程啥不要这样暴力!
    这是小弟的愚见如有不妥望指正!
      

  6.   

    #include <windows.h>
    ////////////////////////////////////////////////////////////////////////////
    BOOL SetPrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege)
    {
    TOKEN_PRIVILEGES tp;
    LUID luid;if(!LookupPrivilegeValue(NULL,lpszPrivilege,&luid))
    {
    printf("\nLookupPrivilegeValue error:%d", GetLastError() ); 
    return FALSE; 
    }
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
    tp.Privileges[0].Attributes = 0;
    // Enable the privilege or disable all privileges.
    AdjustTokenPrivileges(
    hToken, 
    FALSE, 
    &tp, 
    sizeof(TOKEN_PRIVILEGES), 
    (PTOKEN_PRIVILEGES) NULL, 
    (PDWORD) NULL); 
    // Call GetLastError to determine whether the function succeeded.
    if (GetLastError() != ERROR_SUCCESS) 

    printf("AdjustTokenPrivileges failed: %u\n", GetLastError() ); 
    return FALSE; 

    return TRUE;
    }
    ////////////////////////////////////////////////////////////////////////////
    BOOL KillPS(DWORD id)
    {
    HANDLE hProcess=NULL,hProcessToken=NULL;
    BOOL IsKilled=FALSE,bRet=FALSE;
    __try
    {if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
    {
    printf("\nOpen Current Process Token failed:%d",GetLastError());
    __leave;
    }
    //printf("\nOpen Current Process Token ok!");
    if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE))
    {
    __leave;
    }
    printf("\nSetPrivilege ok!");if((hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,id))==NULL)
    {
    printf("\nOpen Process %d failed:%d",id,GetLastError());
    __leave;
    }
    //printf("\nOpen Process %d ok!",id);
    if(!TerminateProcess(hProcess,1))
    {
    printf("\nTerminateProcess failed:%d",GetLastError());
    __leave;
    }
    IsKilled=TRUE;
    }
    __finally
    {
    if(hProcessToken!=NULL) CloseHandle(hProcessToken);
    if(hProcess!=NULL) CloseHandle(hProcess);
    }
    return(IsKilled);
    }
      

  7.   

    插播紧急新闻请关注:http://www.csdn.net/expert/topic/709/709609.xml?temp=.4640314