pControl v0.5
v1rusL4ir
/*pControl v0.5
coded by v1rusL4ir (2008) viruslair[at]ihrisko[dot]org
This code is freeware.You can use,modify,distribute this code
but you can't sell it or use as part of commercial software without my approval.
Contact me and we can make a deal.
Use this code/tool at own risk.Im not responsible of anything you do with this code.
I don't take responsibility of any damage caused by improper usage of this code/tool
Keep the original copyright but dont misrepresent modifyed version as original one.
future improvements - the module name+path in terminate output.
*/
#include
#include
#include
#pragma comment(lib,"Psapi.lib")
#define DEVICE_NAME "\\\\.\\PControl_device"
#define SERVICE_NAME "ProcessControl"
#define DRIVER_FILE "pcontrol.sys"
bool LoadDriver();
DWORD Read_Proc();
void CleanUp();
FILE* file;
typedef struct pinfo{
DWORD parent;
DWORD process;
BOOLEAN create;
}PROC_INFO;
BOOL CtrlHandler(DWORD fdwCtrlType)
{
switch(fdwCtrlType)
{
case CTRL_C_EVENT:
case CTRL_CLOSE_EVENT:
case CTRL_BREAK_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
CleanUp();
return FALSE;
}
return FALSE;
}
int main(int argc,char **argv)
{
printf ("PControl v0.5 coded by v1rusL4ir(2008).\n");
printf ("You can enable logging to file by passing \"-l [filename]\" as an argument.\n");
HANDLE hDevice,hProc,hProcParent;
char proc_file[MAX_PATH],p_proc_file[MAX_PATH],log_file[MAX_PATH];
DWORD bRead = 0;
PROC_INFO p_info;
SYSTEMTIME time;
if(argc > 1)
{
if(strcmp(argv[1],"-l") == 0){
file = fopen(argv[2],"a");
if(file)
printf("[+]Logging enabled.Logfile: %s .\n",argv[2]);
else
printf("[-]Cannot open the file.Logging disabled.\n");
}else
printf("[-]Invalid parameter\n");
}
if(!LoadDriver()) return -1;
printf("[+]Driver loaded.\n");
if(( hDevice = CreateFile( DEVICE_NAME, GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE){
printf("[-]Cannot open I/O device \n ");
return -1;
}
printf("[+]Connected to device.\n");
SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE);
while(1){
ReadFile(hDevice,&p_info,sizeof(PROC_INFO),&bRead,0);
if(bRead == sizeof(PROC_INFO)){
GetLocalTime(&time);
printf("-------------------------------------------------------\n");
if(p_info.create){
hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,TRUE,p_info.process);
hProcParent = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,TRUE,p_info.parent);
if(hProc && hProcParent){
GetModuleFileNameEx(hProc,NULL,(LPSTR)&proc_file,MAX_PATH);
GetModuleFileNameEx(hProcParent,NULL,(LPSTR)&p_proc_file,MAX_PATH);
if (p_info.create){
printf("[%d:%d:%d]Process execution detected: %s PID: %d \n",time.wHour,time.wMinute,time.wSecond,proc_file,p_info.process);
printf("\tExecuted by: %s PID: %d \n",p_proc_file,p_info.parent);
if(file){
fprintf(file,"-----------------------------------------------------\n");
fprintf(file,"[%d:%d:%d]Process execution detected: %s PID: %d \n",time.wHour,time.wMinute,time.wSecond,proc_file,p_info.process);
fprintf(file,"\tExecuted by: %s PID: %d \n",p_proc_file,p_info.parent);
}
}
}
}else{
printf("[%d:%d:%d]Process termination detected. PID: %d \n",time.wHour,time.wMinute,time.wSecond,p_info.process);
if(file){
fprintf(file,"-----------------------------------------------------\n");
fprintf(file,"[%d:%d:%d]Process termination detected. PID: %d \n",time.wHour,time.wMinute,time.wSecond,p_info.process);
}
}
ZeroMemory(&proc_file,sizeof(MAX_PATH));
ZeroMemory(&p_proc_file,sizeof(MAX_PATH));
}
ZeroMemory(&p_info,sizeof(PROC_INFO));
Sleep(1000);
bRead = 0;
}
CleanUp();
return 0;
}
bool LoadDriver()
{
SC_HANDLE hManager;
SC_HANDLE hService;
SERVICE_STATUS ss;
char path[MAX_PATH];
GetModuleFileName(0,path,MAX_PATH);
char *pos = strrchr(path,'\\');
*(pos + 1) = 0;
strcat(path,DRIVER_FILE);
// does file exists?
FILE *f = fopen(path, "r");
if(!f){
printf("[-]Cannot locate driver.Put it in the same directory,where this application is.\n");
return FALSE;
}
fclose(f);
// try to open service manager
hManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if(!hManager){
printf("[-]Failed to open services manage.r\n");
return FALSE;
}
// check if service exists.
if((hService = OpenService(hManager, SERVICE_NAME, SERVICE_START | DELETE | SERVICE_STOP | SERVICE_QUERY_STATUS)) == NULL){
// create service
hService = CreateService(hManager, SERVICE_NAME, SERVICE_NAME,
SERVICE_START | DELETE | SERVICE_STOP | SERVICE_QUERY_STATUS, SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, path,
NULL, NULL, NULL, NULL, NULL);
if(!hService){
printf("[-]Failed to obtain service handle.\n");
CloseServiceHandle(hManager);
return FALSE;
}
}
// start service
QueryServiceStatus(hService, &ss);
if(ss.dwCurrentState != SERVICE_RUNNING) {
if(!StartService(hService, 0, NULL)){
printf("[-]Failed to start service.\n");
ControlService(hService, SERVICE_CONTROL_STOP, &ss);
DeleteService(hService);
CloseServiceHandle(hService);
CloseServiceHandle(hManager);
return FALSE;
}
}
CloseServiceHandle(hService);
CloseServiceHandle(hManager);
return TRUE;
}
void CleanUp()
{
if(file)
fclose(file);
printf("[*]Unloading driver - ");
SC_HANDLE hManager;
SC_HANDLE hService;
SERVICE_STATUS ss;
hManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
hService = OpenService(hManager, SERVICE_NAME, SERVICE_START | DELETE | SERVICE_STOP);
ControlService(hService, SERVICE_CONTROL_STOP, &ss);
DeleteService(hService);
CloseServiceHandle(hService);
CloseServiceHandle(hManager);
printf("[+]DONE \n");
}