Открываем Visual Studio , код c++ , создаем консольный проект(show_process) и компилируем код
show_process.cpp
// show_process.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "show_process.h"
#include "windows.h"
#include "iostream"
#include
#include "tlhelp32.h"
#include
#ifdef _DEBUG
#define new DEBUG_NEW
#define NAME_CONSOLE "show_process"
#endif
#pragma comment(lib, "iphlpapi.lib")
// The one and only application object
CWinApp theApp;
using namespace std;
class hide_procces
{
public:
bool proverka (CString fname);
void zaderhka();
void kill(DWORD pid);
CString time();
CString ipadr();
CString read_conf(CString path);
HWND GetConsole_hWnd();
void write_procces();
private:
int time_1;
int kill_1;
CString path1,path2;
CString format;
PROCESSENTRY32 proc;
CStringArray filein;
CString line_w;
HANDLE hSnap,hProcess;
typedef CMap CMyMap;
CMyMap map;
CMyMap::CPair* pCurVal;
int i,j;
};
HWND hide_procces::GetConsole_hWnd()
{
SetConsoleTitle(NAME_CONSOLE);
HWND hwnd;
hwnd=FindWindow(0, NAME_CONSOLE);
if(hwnd==0)
{
return 0;
}
return hwnd;
}
void hide_procces::kill(DWORD pid)
{
hProcess = OpenProcess( PROCESS_TERMINATE, FALSE, pid );
TerminateProcess( hProcess, (DWORD) -1 );
CloseHandle( hProcess );
}
CString hide_procces::read_conf(CString path)
{
CStdioFile file(path,CFile::modeRead);
CString line,format;
while(file.ReadString(line))
{
if(line.Find("path_out=")==FALSE)
{
line.Delete(0,9);
path1=line;
}
if(line.Find("path_in=")==FALSE)
{
line.Delete(0,8);
path2=line;
}
if(line.Find("time=")==FALSE)
{
line.Delete(0,5);
time_1=atoi(line);
}
if(line.Find("kill=")==FALSE)
{
line.Delete(0,5);
kill_1=atoi(line);
}
}
file.Close();
time_1=time_1*1000;
write_procces();
return 0;
}
bool hide_procces:: proverka (CString fname)
{
return CFileFind().FindFile(fname) == TRUE;
}
void hide_procces::zaderhka()
{
HANDLE h;
h=CreateEvent(0, true, false, "et");
WaitForSingleObject(h,time_1);
}
CString hide_procces::time()
{
CTime ct= CTime::GetCurrentTime();
CString date1,date2,date;
date1.Format("%i.%i.%i",ct.GetDay(),ct.GetDayOfWeek(),ct.GetYear());
date2.Format("%i:%i:%i",ct.GetHour(),ct.GetMinute(),ct.GetSecond());
date=date1 + " " + date2;
return date;
}
CString hide_procces::ipadr()
{
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;
CString ipadress;
pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) );
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
}
if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
pAdapter = pAdapterInfo;
while (pAdapter) {
ipadress+=(CString)pAdapter->IpAddressList.IpAddress.String + " ";
pAdapter = pAdapter->Next;
}
}
return ipadress ;
}
void hide_procces::write_procces()
{
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
CStdioFile file1(path2,CFile::modeRead);
filein.RemoveAll();
filein.FreeExtra();
map.RemoveAll();
if(proverka(path1)==FALSE)
{
CStdioFile file2(path1, CFile::modeCreate);
}
CStdioFile file2(path1, CFile::modeReadWrite);
file2.SeekToEnd();
while(file1.ReadString(line_w))
{
filein.Add(line_w);
}
if (Process32First(hSnap, &proc))
{
map.SetAt(proc.szExeFile,proc.th32ProcessID);
while (Process32Next(hSnap, &proc))
{
map.SetAt(proc.szExeFile,proc.th32ProcessID);
}
}
pCurVal= map.PGetFirstAssoc();
while (pCurVal != NULL)
{
for(j=0; jkey==filein.GetAt(j))
{
if(kill_1==1)
{
kill(pCurVal->value);
file2.WriteString("KILL ");
}
format.Format("%s ",time());
file2.WriteString(format);
format.Format("%s",ipadr());
file2.WriteString(format);
format.Format("%s ",filein.GetAt(j));
file2.WriteString(format);
file2.WriteString("\n");
}
}
pCurVal= map.PGetNextAssoc(pCurVal);
}
file1.Close();
file2.Close();
zaderhka();
write_procces();
}
int _tmain(int argc, char* argv[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = 1;
}
else
{
FreeConsole();
hide_procces proc;
if (AttachConsole(ATTACH_PARENT_PROCESS))
{
HWND hwndClosole;
hwndClosole=proc.GetConsole_hWnd();
ShowWindow(hwndClosole,SW_HIDE);
}
if(argc==3)
{
CString str1,str2,str;
str1.Format("%s",argv[1]);
str2.Format("%s",argv[2]);
if(str1=="-c")
{
proc.read_conf(str2);
}
else
{
printf("ERROR: parametry ne verny");
}
}
else
{
printf("ERROR: ne vse vvedeny parametry");
}
}
return nRetCode;
}
Файл in
В этот фаил мы будем писать название процессов которые хотим отследить, например:
Zuma.exe
putty.exe
vmnat.exe
puttytel.exe
Фаил process.conf
Это фаил конфигурации, в котором можно изменять всего четыре параметра:
path_out | здесь указываем полный путь к файлу куда будут писаться логи |
path_in | здесь указываем полный путь к файлу |
in time | здесь указываем время в секундах, через которое программа будет проверять , если данный процесс в системе |
kill | здесь указываем либо “0” ничего не делать с процессом , либо “1” – убивать все процессы из списка in |
Например:
path_out=\\192.168.50.4\process\out
path_in=\\192.168.50.4\process\in
time=15
kill=1
Фаил show_process.exe
Исполняемый фаил , запускаться он должен с параметром “-c” , после которого указываем путь к файлу process.conf , например
show_process.exe -c \\192.168.50.4\process\process.conf
Пример логов:
30.2.2008 15:57:0 192.168.50.8 putty.exe
30.2.2008 15:57:15 192.168.50.8 putty.exe
30.2.2008 15:57:30 192.168.50.8 putty.exe
30.2.2008 15:57:45 192.168.50.8 putty.exe
30.2.2008 15:58:0 192.168.50.8 putty.exe
30.2.2008 15:58:15 192.168.50.8 putty.exe
30.2.2008 15:58:30 192.168.50.8 putty.exe
30.2.2008 15:58:45 192.168.50.8 putty.exe
Пример использования программы , если у вас в сети используется доменный сервер, может сделать чтоб программа грузилась из сети на всех компьютерах………..