这一年来流氓软件特别多,面对这种非常恶心的软件,让大家非常痛苦。正是在这种环境之下,众多客户需要强大查杀这种流氓软件的工具。如果让你来开发一个查杀这种病毒的软件,你会怎么做呢?当然是先把电脑里所有进程遍历出来,然后把每个进程的详细信息显示给用户,让用户决定自己那些进程可以运行,那些不可以运行。或者根据当前进程的信息,再跟根据病毒库里的特征码进行比较,就可以标识那些是可疑的病毒了。下面就来演示用函数OpenProcess怎么打开进程并获取进程的名称。 函数OpenProcess声明如下: WINBASEAPI __out HANDLE WINAPI OpenProcess( __in DWORD dwDesiredAccess, __in BOOL bInheritHandle, __in DWORD dwProcessId ); dwDesiredAccess是访问进程的权限。 bInheritHandle是句柄是否继承进程属性。 dwProcessId是进程ID。 调用函数的例子如下: #001 //获取进程的信息。 #002 //蔡军生 2007/12/13 QQ:9073204 深圳 #003 void TestOpenProcesses(void) #004 { #005 // #006 const int nBufSize = 512; #007 TCHAR chBuf[nBufSize]; #008 ZeroMemory(chBuf,nBufSize); #009 #010 // #011 DWORD dwProcs[1024]; #012 DWORD dwNeeded; #013 #014 //枚举所有进程ID。 #015 if ( !EnumProcesses( dwProcs, sizeof(dwProcs), &dwNeeded ) ) #016 { #017 //输出出错信息。 #018 wsprintf(chBuf,_T("EnumProcesses failed (%d).\n"), GetLastError() ); #019 OutputDebugString(chBuf); #020 #021 return; #022 } #023 #024 // 计算有多少个进程ID。 #025 DWORD dwProcCount = dwNeeded / sizeof(DWORD); #026 #027 wsprintf(chBuf,_T("EnumProcesses Count(%d).\n"), dwProcCount ); #028 OutputDebugString(chBuf); #029 #030 //遍历所有进程ID,打开进程。 #031 for (DWORD i = 0; i < dwProcCount; i++) #032 { #033 wsprintf(chBuf,_T("EnumProcesses (%d).\r\n"), dwProcs[i] ); #034 OutputDebugString(chBuf); #035 #036 //根据进程ID打开进程。 #037 HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | #038 PROCESS_VM_READ, #039 FALSE, dwProcs[i] ); #040 #041 if (hProcess) #042 { #043 HMODULE hMod; #044 DWORD cbNeeded; #045 #046 //获取进程第一个模块的句柄。 #047 if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), #048 &cbNeeded) ) #049 { #050 // #051 ZeroMemory(chBuf,nBufSize); #052 #053 //获取进程第一个模块的名称。 #054 if (::GetModuleBaseName(hProcess,hMod,chBuf,nBufSize)) #055 { #056 // #057 OutputDebugString(chBuf); #058 OutputDebugString(_T("\r\n")); #059 } #060 } #061 } #062 } #063 #064 }
|