首页
社区
课程
招聘
请教一个关于Windows提权的问题
发表于: 2007-5-6 15:06 6754

请教一个关于Windows提权的问题

2007-5-6 15:06
6754
大家好,我初学Windows,对很多东西都还不熟,我想编一个程序来杀掉天网防火墙,但是总杀不掉.
我提升了自己的权限的,但是总是不行,不知道是什么原因,希望高手们帮忙一下.
非常感谢!
#include <windows.h> 
#include <tlhelp32.h> 
#include <stdio.h> 

BOOL SetPrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege) 
{ 
   BOOL bRet = FALSE; 
   LUID luid; 
   TOKEN_PRIVILEGES tp; 
    
   bRet = LookupPrivilegeValue(NULL,lpszPrivilege,&luid); 
   if(!bRet) 
       return bRet; 

   tp.PrivilegeCount = 1; 
   if(bEnablePrivilege) 
       tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
   else 
       tp.Privileges[0].Attributes = 0; 

   bRet = AdjustTokenPrivileges(hToken, 
                        FALSE, 
                                &tp, 
                                sizeof(TOKEN_PRIVILEGES), 
                                (PTOKEN_PRIVILEGES)NULL, 
                                (PDWORD)NULL); 

   if(!bRet) 
       return bRet; 

   return TRUE; 
} 

BOOL KillProcess(DWORD PID) 
{ 
   HANDLE hProcess = NULL; 
   HANDLE hToken   = NULL; 
   BOOL   bKilled = FALSE; 
   BOOL   bRet   = FALSE; 

   bRet = OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hToken); 
   if(!bRet) 
       return bRet; 

   bRet = SetPrivilege(hToken,SE_TCB_NAME,TRUE); //我这里将权限设为了最大,还是不行
   if(!bRet) 
       return bRet; 

   hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); 
   if(!hProcess) 
       return bRet; 

   bRet = TerminateProcess(hProcess,1); 
   if(!bRet) 
       return bRet; 

   bKilled = TRUE; 
   CloseHandle(hToken); 
   CloseHandle(hProcess); 
   return bKilled; 
} 

int main(int argc, char **argv) 
{ 
   if(argc!=2) 
   { 
       printf("Usage: %s PID\n",argv[0]); 
       return 0; 
   } 

   if(!KillProcess(atoi(argv[1]))) 
   { 
       printf("The Process Can not Be Killed\n"); 
       return 1; 
   } 
   return 0; 
} 


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 158
活跃值: (273)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
2
可能天王做了system权限,常规提权也不一定能解决。
你的代码,我没有测试。

就假设你的代码是正确的,还是不行。那你能使用非常规方式来Kill吧,比如 驱动
2007-5-19 20:30
0
雪    币: 139
活跃值: (141)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
You just passed the wrong parameter, buddy.

Try mine and see if that works.

BOOL EnablePrivileges( VOID )
{
    HANDLE  hToken;
    TOKEN_PRIVILEGES tkp;
    BOOL    Result = FALSE;
    WCHAR   wszMsg[MAX_PATH] = {0};

    if ( ! OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
        return FALSE;

    LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &(tkp.Privileges[0].Luid) );     // Get the LUID for the privilege.
    tkp.PrivilegeCount = 1;                                                     // one privilege to set
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
   
    AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, 0 );
    DWORD dwError = GetLastError();
    if( ERROR_SUCCESS == dwError )
        Result = TRUE;
    else
    {
        StringCchPrintfW( wszMsg, MAX_PATH, L"\tError: EnablePrivileges() fails with error code %x.\n", dwError );
        OutputDebugStringW( wszMsg );
    }

    CloseHandle( hToken );
    return Result;
}
2007-5-26 06:28
0
雪    币: 139
活跃值: (141)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
认真、仔细地看看MSDN里对各个函数的解释,对提高程序的质量有很大帮助。很多bug其实就是粗心所致。比如AdjustTokenPrivileges,看看MSDN怎么说:

Return Values

If the function succeeds, the return value is nonzero. To determine whether the function adjusted all of the specified privileges, call GetLastError, which returns one of the following values when the function succeeds

ERROR_SUCCESS      The function adjusted all specified privileges.

在Vista上该方法可能会失败,取决于你的权限和目标进程的所有者的权限,微软对process ACL的内部处理做了不小的改动,安全性较之XP和2003有一定的提高,当然还是有很多问题和bug。
2007-5-26 07:14
0
雪    币: 139
活跃值: (141)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
附:

GetLastError()返回的错误值仅仅和你的当前的thread有关,和进程内其它的线程无关(not process-wide),可以放心使用。

Linux里的errno也是一样的,each thread has its own errno。
2007-5-26 07:22
0
游客
登录 | 注册 方可回帖
返回