/*需要引入的头文件*/
#include <stdio.h>
#include <winsock.h>
#include <winbase.h>
#include <accctrl.h>
#include <aclapi.h>
#pragma comment ( lib, "ws2_32.lib" ) 
// NtQuerySystemInformation record type 16 
#define NT_HANDLE_LIST 16 
#define OBJECT_TYPE_SOCKET 0x1A 
#define MAX_HANDLE_LIST_BUF 0x200000 
// 定义HanleInfo数据结构 
typedef struct _HandleInfo
{
USHORT dwPid;
USHORT CreatorBackTraceIndex;
BYTE ObjType;
BYTE HandleAttributes;
USHORT HndlOffset;
        DWORD dwKeObject;
ULONG GrantedAccess;
}HANDLEINFO,*PHANDLEINFO;
// 申明NtQuerySystemInformation()函数
typedef DWORD (CALLBACK* NTQUERYSYSTEMINFORMATION)( DWORD, PDWORD, DWORD, PVOID );
NTQUERYSYSTEMINFORMATION NtQuerySystemInformation;
// 判断SOCKET类型的数组
char szSockType[6][6] = { "NUL", "TCP", "UDP", "RAW", "RDM", "SEQ" };
// 
// RaisePrivleges()函数用来提升本进程的特权
// 
bool RaisePrivleges( HANDLE hToken, char *pPriv )

TOKEN_PRIVILEGES tkp; 
if(!LookupPrivilegeValue(NULL,pPriv, &tkp.Privileges[0].Luid ) ) 
{
printf( "LookupPrivilegevalue Error:%d\n", GetLastError() ); 
return false; 
}
tkp.PrivilegeCount = 1; 
tkp.Privileges[0].Attributes |= SE_PRIVILEGE_ENABLED; 
int iRet = AdjustTokenPrivileges(hToken,false, &tkp,0,(PTOKEN_PRIVILEGES)NULL,0 ); 
if ( iRet == NULL )//AdjustTokenPrivileges函数调用失败 
{
printf( "AdjustTokenPrivileges Error:%d\n", GetLastError() ); 
return false; 
}
else //AdjustTokenPrivileges调用成功 
{//使用GetLastError()获得返回值
iRet = GetLastError(); 
switch ( iRet ) 

case ERROR_NOT_ALL_ASSIGNED://未指派所有的特权 
printf( "AdjustTokenPrivileges ERROR_NOT_ALL_ASSIGNED\n" ); 
 return false; 
case ERROR_SUCCESS: //成功地指派了所有的特权 
return true; 
default: //不知名的错误 
printf( "AdjustTokenPrivileges Unknow Error:%d\n", iRet ); 
return false; 


}//end of RaisePrivleges 
//
// AdjustDacl用来调整目标进程的DACL 
// 
void AdjustDacl( HANDLE hProcess ) 

SID world = { SID_REVISION, 1, SECURITY_WORLD_SID_AUTHORITY, 0 }; 
LPTSTR ptstrName = (LPTSTR)&world;
EXPLICIT_ACCESS ea =
{
STANDARD_RIGHTS_ALL | SPECIFIC_RIGHTS_ALL,
SET_ACCESS,
NO_INHERITANCE,
{
0, NO_MULTIPLE_TRUSTEE,
TRUSTEE_IS_SID,
TRUSTEE_IS_USER,
ptstrName
}
}; 
ACL * pdacl = 0; 
if ( SetEntriesInAcl(1, &ea, 0, &pdacl) != ERROR_SUCCESS ) 
 printf( "SetEntriesInAcl Error:%d", GetLastError() ); 
if ( SetSecurityInfo(hProcess, 
SE_KERNEL_OBJECT, 
DACL_SECURITY_INFORMATION, 
0 , 0, pdacl, 0 ) != ERROR_SUCCESS ) 
printf( "SetSecurityInfo Error:%d", GetLastError() ); 
LocalFree(pdacl); 
}//end of AdjustDacl 
int main( ) 

printf( "\t=*=Process:----:Port =*=\n\n" ); 
int iRet; 
WSADATA wsaData; 
iRet = WSAStartup( MAKEWORD(1,1), &wsaData ); 
if ( iRet ) 
printf( "WSAStartup Error:%d\n", GetLastError() );  HANDLE hCurrentProc = GetCurrentProcess(); 
HANDLE hToken; 
if ( !OpenProcessToken(hCurrentProc, 
TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, 
&hToken ) ) 
printf( "OpenProcessToken Error:%d\n", GetLastError() ); 
else 

if ( !RaisePrivleges( hToken, SE_DEBUG_NAME ) ) 
printf( "SetPrivleges SE_DEBUG_NAME Error:%d\n", GetLastError() ); 

if ( hToken ) 
CloseHandle( hToken ); 
HMODULE hNtdll = NULL; 
hNtdll = LoadLibrary( "ntdll.dll" ); 
if ( !hNtdll ) 

printf( "LoadLibrary( NTDLL.DLL ) Error:%d\n", GetLastError() ); 
return false; 

NtQuerySystemInformation = (NTQUERYSYSTEMINFORMATION)GetProcAddress(hNtdll,"NtQuerySystemInformation");
if ( !NtQuerySystemInformation ) 

printf( "GetProcess( NtQuerySystemInformation ) Error:%d\n", GetLastError() ); 
return false; 

DWORD dwNumBytes = MAX_HANDLE_LIST_BUF; 
PDWORD pdwHandleList = (PDWORD)malloc( dwNumBytes ); 
if ( !pdwHandleList )
{
printf( "Malloc for Handle List Error:%d\n", GetLastError() ); 
return false; 

DWORD dwNumBytesRet = 0; 
iRet = (*NtQuerySystemInformation)(NT_HANDLE_LIST,pdwHandleList,dwNumBytes,&dwNumBytesRet); 
DWORD dwNumEntries; 
PHANDLEINFO pHandleInfo; 
if ( iRet ) 

printf( "NtQuerySystemInformation return %d, Error:%d\n", 
dwNumBytesRet, 
GetLastError() ); 

else 

HANDLE hProc; 
dwNumEntries = pdwHandleList[0]; 
pHandleInfo = (PHANDLEINFO)( pdwHandleList + 1 ); 
 for ( DWORD i = 0; i < dwNumEntries; i++ ) 
{
if((pHandleInfo->ObjType == OBJECT_TYPE_SOCKET ) 
&& ( pHandleInfo->dwPid ) ) 

hProc = OpenProcess(WRITE_DAC, 
false, 
pHandleInfo->dwPid); 
if ( hProc ) 

AdjustDacl( hProc ); 
CloseHandle( hProc ); 

 else 
printf( "OpenProcess(WRITE_DAC) %d Error:%d\n",pHandleInfo->dwPid, 
GetLastError() );
HANDLE hMyHandle = NULL; 
hProc = OpenProcess(PROCESS_DUP_HANDLE, true,pHandleInfo->dwPid ); 
if ( hProc ) 

DuplicateHandle(hProc,(HANDLE)pHandleInfo->HndlOffset, hCurrentProc, &hMyHandle, STANDARD_RIGHTS_REQUIRED, true, 0 ); 
CloseHandle( hProc ); 

else 
printf( "OpenProcess %d Error:%d\n",pHandleInfo->dwPid,GetLastError() ); 
if ( !hMyHandle ) 


printf( "DuplicateHandle PID=%4d HANDLE:%4d Error:%d\n", 
pHandleInfo->dwPid, pHandleInfo->HndlOffset, GetLastError() ); 

 else 

sockaddr_in name = {0}; 
name.sin_family = AF_INET; 
int namelen = sizeof(sockaddr_in);
SOCKET s = (SOCKET)hMyHandle; 
iRet = getsockname( s, (sockaddr*)&name,&namelen ); 
if ( iRet != SOCKET_ERROR ) 

 int sockType = 0; 
int optlen = 4; 
iRet = getsockopt(s,SOL_SOCKET,SO_TYPE,
(char *)&sockType,&optlen );
printf( "PID=%4d PORT=%5d %s\n",pHandleInfo->dwPid,ntohs( name.sin_port ),szSockType[sockType] ); 
}
}
}
pHandleInfo++;
}
}
if(pdwHandleList)
free( pdwHandleList);
if ( hCurrentProc )
CloseHandle( hCurrentProc );
return 0;
}
以上程序代码在没开QQ时很正常,但是开了QQ就失败,为什么啊?