if ( FALSE == ret ) { printf( "GetProcAddress() failed"); } ntdll_dll = NULL; return( ret ); }
/*++ This routine is used to get a process's username from it's SID --*/ BOOL GetUserNameFromSid(PSID pUserSid, char *szUserName) { // sanity checks and default value if (pUserSid == NULL) return false; strcpy(szUserName, "?");
// Retrieve user name and domain name based on user's SID. if ( ::LookupAccountSid( NULL, pUserSid, szUser, pcchUser, szDomain, pcchDomain, &snu ) ) { wsprintf(szUserName, "%s", szUser); } else { return false; }
return true; }
/*++
This routine is used to get the DNS process's Id
Here, I use WTSEnumerateProcesses to get process user Sid, and then get the process user name. Beacause as it's a "NETWORK SERVICE", we cann't use OpenProcessToken to catch the DNS process's token information, even if we has the privilege in catching the SYSTEM's.
/*++ This doesn't work as we know, sign... but you can use the routine for other useing... --*/ /* BOOL GetProcessUserFromId(char *szAccountName, DWORD PID) { HANDLE hProcess = NULL, hAccessToken = NULL; TCHAR InfoBuffer[1000], szDomainName[200]; PTOKEN_USER pTokenUser = (PTOKEN_USER)InfoBuffer; DWORD dwInfoBufferSize,dwAccountSize = 200, dwDomainSize = 200; SID_NAME_USE snu;
for(i = 0; i<NumOfHandle ;i++) { try { if( ( h_info[i].ProcessId == PID ) && ( h_info[i].ObjectTypeNumber == 0x1c ) && (h_info[i].Handle!=0x2c) // I don't know why if the Handle equal to 0x2c, in my test, it stops at getsockname() // So I jump over this situation... // May be it's different in your system, ) //wind2000 is 0x1a { //printf("Handle:0x%x Type:%08x\n",h_info[i].Handle, h_info[i].ObjectTypeNumber); if( 0 == DuplicateHandle( OpenProcess(PROCESS_ALL_ACCESS, TRUE, PID), (HANDLE)h_info[i].Handle, GetCurrentProcess(), &sock, STANDARD_RIGHTS_REQUIRED, true, DUPLICATE_SAME_ACCESS) ) { printf("DuplicateHandle wrong:%8x", GetLastError()); continue; }
//printf("DuplicateHandle ok\n"); sockaddr_in name = {0}; name.sin_family = AF_INET; int namelen = sizeof(sockaddr_in); getsockname( (SOCKET)sock, (sockaddr*)&name, &namelen ); //printf("PORT=%5d\n", ntohs( name.sin_port )); if(ntohs(name.sin_port)>0) // if port > 0, then we can use it break; } } catch(...) { continue; } }
//----------------------------------------------- // Create a receiver socket to receive datagrams RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//----------------------------------------------- // Bind the socket to any address and the specified port. RecvAddr.sin_family = AF_INET; RecvAddr.sin_port = htons(Port); RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
//----------------------------------------------- // Call the recvfrom function to receive datagrams // on the bound socket. printf("Receiving datagrams...\n"); while(1) { recvfrom(RecvSocket, RecvBuf, BufLen, 0, (SOCKADDR *)&SenderAddr, &SenderAddrSize); printf("%s\n", RecvBuf); }
//----------------------------------------------- // Close the socket when finished receiving datagrams printf("Finished receiving. Closing socket.\n"); closesocket(RecvSocket);
//----------------------------------------------- // Clean up and exit. printf("Exiting.\n"); WSACleanup(); return; }