在网上看到一篇关于内核级隐藏进程的文章,是用驱动实现,可是不知道在VC中如何调用由那位牛人所写代码生成的SYS啊。
现转帖牛人的代码,望高手指点一二,谢谢。#include "ntddk.h"#define NT_DEVICE_NAME      L"\\Device\\ProtectProcess"
#define DOS_DEVICE_NAME     L"\\DosDevices\\ProtectProcess"#define IOCTL_PROTECT_CONTROL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)NTSTATUS DispatchDeviceControl(IN PDEVICE_OBJECT  DeviceObject,IN PIRP  Irp);
VOID OnUnload(IN PDRIVER_OBJECT DriverObject);#pragma pack(1) //SSDT表的结构
typedef struct ServiceDescriptorEntry {
 unsigned int *ServiceTableBase;
 unsigned int *ServiceCounterTableBase; //Used only in checked build
 unsigned int NumberOfServices;
 unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable; //变量名是不能变的,因为是从外部导入
//这个是查询某个函数的地址的一个宏
#define SYSTEMSERVICE(_function)  KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)_function+1)]NTSYSAPI NTSTATUS NTAPI ZwOpenProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL);
typedef NTSTATUS (*ZWOPENPROCESS)(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL);ZWOPENPROCESS OldZwOpenProcess;
long pid = -1;NTSTATUS NewZwOpenProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL)
{
 //用来替换的新函数
 NTSTATUS nStatus = STATUS_SUCCESS;
 if((long)ClientId->UniqueProcess == pid)
 {
  DbgPrint("保护进程 PID:%ld\n",pid);
  return STATUS_ACCESS_DENIED;
 } //剩下的交给我们的原函数
 nStatus = OldZwOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);
 return STATUS_SUCCESS;
}VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
 //卸载时会调用
 UNICODE_STRING DeviceLinkString;
 PDEVICE_OBJECT DeviceObjectTemp1=NULL;
 PDEVICE_OBJECT DeviceObjectTemp2=NULL; DbgPrint("驱动程序卸载...\n"); RtlInitUnicodeString(&DeviceLinkString,DOS_DEVICE_NAME);
 IoDeleteSymbolicLink(&DeviceLinkString);
 if(DriverObject)
 {
  DeviceObjectTemp1=DriverObject->DeviceObject;
  while(DeviceObjectTemp1)
  {
   DeviceObjectTemp2=DeviceObjectTemp1;
   DeviceObjectTemp1=DeviceObjectTemp1->NextDevice;
   IoDeleteDevice(DeviceObjectTemp2);
  }
 }  
 DbgPrint("设备已经卸载\n"); DbgPrint("修复SSDT表\n");
 (ZWOPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess)) = OldZwOpenProcess; DbgPrint("驱动卸载完毕.\n");
}NTSTATUS DispatchDeviceControl(IN PDEVICE_OBJECT  DeviceObject,IN PIRP  Irp)
{
 //IRP_MJ_DEVICE_CONTROL的响应函数
 NTSTATUS nStatus = STATUS_SUCCESS;
 ULONG IoControlCode = 0;
 PIO_STACK_LOCATION IrpStack = NULL; long* inBuf = NULL;
 char* outBuf = NULL;
 ULONG inSize = 0;
 ULONG outSize = 0;
 PCHAR buffer = NULL;
 PMDL mdl = NULL; Irp->IoStatus.Status = STATUS_SUCCESS;
 Irp->IoStatus.Information = 0; IrpStack = IoGetCurrentIrpStackLocation(Irp); switch(IrpStack->MajorFunction)
 {
 case IRP_MJ_CREATE:
  DbgPrint("IRP_MJ_CREATE 被调用\n");
  break;
 case IRP_MJ_CLOSE:
  DbgPrint("IRP_MJ_CLOSE 被调用\n");
  break;
 case IRP_MJ_DEVICE_CONTROL:
  DbgPrint("IRP_MJ_DEVICE_CONTROL 被调用\n");
  IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
  switch(IoControlCode)
  {
  case IOCTL_PROTECT_CONTROL:
   inSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
   outSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;   
   inBuf = (long*)Irp->AssociatedIrp.SystemBuffer;
  
   pid = *inBuf;
   DbgPrint("===========================\n");
   DbgPrint("IOCTL_PROTECT_CONTROL 被调用,通讯成功!\n");
   DbgPrint("输入缓冲区大小: %d\n",inSize);
   DbgPrint("输出缓冲区大小: %d\n",outSize);
   DbgPrint("输入缓冲区内容: %ld\n",*inBuf);
   DbgPrint("当前保护进程ID: %ld\n",pid);
   DbgPrint("===========================\n"); 
   
   strcpy(Irp->UserBuffer,"OK!\n");
   break;
  default:
   break;
  }
  break;
 default:
  DbgPrint("未知请求包被调用\n");
  break;
 } nStatus = Irp->IoStatus.Status; IoCompleteRequest(Irp,IO_NO_INCREMENT); return nStatus;
}NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING theRegistryPath)
{
 //驱动入口函数
 NTSTATUS        ntStatus = STATUS_SUCCESS;
 UNICODE_STRING  ntDeviceName;
 UNICODE_STRING  DeviceLinkString;
 PDEVICE_OBJECT  deviceObject = NULL; DbgPrint("驱动程序加载...\n"); RtlInitUnicodeString( &ntDeviceName, NT_DEVICE_NAME ); ntStatus = IoCreateDevice(
  DriverObject,
  0,
  &ntDeviceName,
  FILE_DEVICE_UNKNOWN,
  0,
  FALSE,
  &deviceObject ); if ( !NT_SUCCESS( ntStatus ) )
 {
  DbgPrint("无法创建驱动设备");
  return ntStatus;
 } RtlInitUnicodeString(&DeviceLinkString,DOS_DEVICE_NAME);
 ntStatus=IoCreateSymbolicLink(&DeviceLinkString,&ntDeviceName); if(!NT_SUCCESS(ntStatus))
 {
  return ntStatus;
 } DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchDeviceControl;
 DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchDeviceControl;
 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;
 DriverObject->DriverUnload = OnUnload; DbgPrint("驱动程序已经启动\n"); DbgPrint("修改SSDT表...\n"); //修改 ZwOpenProcess 函数地址
 OldZwOpenProcess =(ZWOPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess));
 (ZWOPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess)) = NewZwOpenProcess; DbgPrint("驱动程序加载完毕.\n"); return STATUS_SUCCESS;
}#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <process.h>#define BUF_SIZE 4096int main(int argc,char* argv[])
{
 char path[BUF_SIZE];
 char base[BUF_SIZE];
 char sername[BUF_SIZE];
 char disname[BUF_SIZE];
 memset(path,0,BUF_SIZE);
 memset(base,0,BUF_SIZE);
 memset(sername,0,BUF_SIZE);
 memset(disname,0,BUF_SIZE);
 
 SC_HANDLE rh = NULL;
 SC_HANDLE sh = NULL;
 if (argc == 1)
 {
  printf("use: install/start/uninstall\n");
  exit(0);
 }
 
 ::GetModuleFileName(0,base,BUF_SIZE);
 int p = strlen(base);
 while(base[p] != '\\'){p--;}
 strncpy(path,base,p+1);
 memset(base,0,BUF_SIZE);
 sprintf(base,"%sInstall.ini",path);
 memset(path,0,BUF_SIZE);
 ::GetPrivateProfileString("Config","Path","",path,BUF_SIZE,base);
 ::GetPrivateProfileString("Config","ServiceName","",sername,BUF_SIZE,base);
 ::GetPrivateProfileString("Config","DisplayName","",disname,BUF_SIZE,base); printf("[*]Service Name:%s\n",sername);
 printf("[*]Display Name:%s\n",disname);
 printf("[*]Driver  Path:%s\n",path);
 
 
 sh = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
 
 if (!sh){
  printf("[-]Error OpenSCManger.\n");
  exit(0);
 }
 
 
 if (argc == 2 && !strcmp(argv[1],"install"))
 {
  if (!strcmp(path,""))
  {
   printf("[-]error read Install.ini\n");
   exit(0);
  }
  
  rh = CreateService(sh,sername,disname,
   SERVICE_ALL_ACCESS,
   SERVICE_KERNEL_DRIVER,
   //{
   //SERVICE_SYSTEM_START,
   SERVICE_DEMAND_START,
   //}
   SERVICE_ERROR_NORMAL,
   path,
   NULL,NULL,NULL,NULL,NULL);  if (!rh){
   printf("[-]error CreateService.\n");
   exit(0);
  }  printf("[-]Install Service Complete...\n");
 }else if (argc == 2 && !strcmp(argv[1],"start"))
 {  rh = OpenService(sh,sername,SERVICE_ALL_ACCESS);  if (!rh){
   printf("error OpenService.\n");
   exit(0);
  }  StartService(rh,NULL,NULL);  printf("[-]Start Service Complete...\n"); }else if (argc == 2 && !strcmp(argv[1],"uninstall"))
 {
  rh = OpenService(sh,sername,SERVICE_ALL_ACCESS);  if (!rh){
   printf("error OpenService.\n");
   exit(0);
  }  SERVICE_STATUS ss;
  ControlService(rh,SERVICE_CONTROL_STOP,&ss);  printf("[-]Stop Service Complete...\n");  DeleteService(rh);  printf("[-]Delete Service Complete...\n"); 
 } CloseServiceHandle(rh);
 CloseServiceHandle(sh); return 1;
}

解决方案 »

  1.   

    http://www.china-pub.com/ureader/product.asp?bookid=208960
    看1.3.2
      

  2.   

    #define NT_DEVICE_NAME L"\\Device\\ProtectProcess"
    #define DOS_DEVICE_NAME L"\\DosDevices\\ProtectProcess"#define IOCTL_PROTECT_CONTROL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)1.用drivermonitor或者上面提供的代码,加载驱动
    2.用CreateFile 第一个参数是\\\\.\\ProtectProcess,打开驱动
    3.用DeviceIoControl dwIoControlCode使用IOCTL_PROTECT_CONTROL控制驱动保护进程
    4.CloseHandle关闭
      

  3.   

    就是建立个服务。#define DRIVER_NAME "MyDriver"
    #define DRIVER_PATH "..\\MyDriver.sys"
    BOOL LoadDriver(char* lpszDriverName,char* lpszDriverPath)
    {
    char szDriverImagePath[256];
    //得到完整的驱动路径
    GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL); BOOL bRet = FALSE; SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄
    SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄 //打开服务控制管理器
    hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if( hServiceMgr == NULL )  
    {
    //OpenSCManager失败
    printf( "OpenSCManager() Faild %d ! \n", GetLastError() );
    bRet = FALSE;
    goto BeforeLeave;
    }
    else
    {
    ////OpenSCManager成功
    printf( "OpenSCManager() ok ! \n" );  
    } //创建驱动所对应的服务
    hServiceDDK = CreateService( hServiceMgr,
    lpszDriverName, //驱动程序的在注册表中的名字  
    lpszDriverName, // 注册表驱动程序的 DisplayName 值  
    SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限  
    SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序  
    SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值  
    SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值  
    szDriverImagePath, // 注册表驱动程序的 ImagePath 值  
    NULL,  
    NULL,  
    NULL,  
    NULL,  
    NULL);   DWORD dwRtn;
    //判断服务是否失败
    if( hServiceDDK == NULL )  
    {  
    dwRtn = GetLastError();
    if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )  
    {  
    //由于其他原因创建服务失败
    printf( "CrateService() Faild %d ! \n", dwRtn );  
    bRet = FALSE;
    goto BeforeLeave;
    }  
    else  
    {
    //服务创建失败,是由于服务已经创立过
    printf( "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" );  
    } // 驱动程序已经加载,只需要打开  
    hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );  
    if( hServiceDDK == NULL )  
    {
    //如果打开服务也失败,则意味错误
    dwRtn = GetLastError();  
    printf( "OpenService() Faild %d ! \n", dwRtn );  
    bRet = FALSE;
    goto BeforeLeave;
    }  
    else 
    {
    printf( "OpenService() ok ! \n" );
    }
    }  
    else  
    {
    printf( "CrateService() ok ! \n" );
    } //开启此项服务
    bRet= StartService( hServiceDDK, NULL, NULL );  
    if( !bRet )  
    {  
    DWORD dwRtn = GetLastError();  
    if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )  
    {  
    printf( "StartService() Faild %d ! \n", dwRtn );  
    bRet = FALSE;
    goto BeforeLeave;
    }  
    else  
    {  
    if( dwRtn == ERROR_IO_PENDING )  
    {  
    //设备被挂住
    printf( "StartService() Faild ERROR_IO_PENDING ! \n");
    bRet = FALSE;
    goto BeforeLeave;
    }  
    else  
    {  
    //服务已经开启
    printf( "StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! \n");
    bRet = TRUE;
    goto BeforeLeave;
    }  
    }  
    }
    bRet = TRUE;
    //离开前关闭句柄
    BeforeLeave:
    if(hServiceDDK)
    {
    CloseServiceHandle(hServiceDDK);
    }
    if(hServiceMgr)
    {
    CloseServiceHandle(hServiceMgr);
    }
    return bRet;
    }
    //卸载驱动程序  
    BOOL UnloadDriver( char * szSvrName )  
    {
    BOOL bRet = FALSE;
    SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄
    SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄
    SERVICE_STATUS SvrSta;
    //打开SCM管理器
    hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );  
    if( hServiceMgr == NULL )  
    {
    //带开SCM管理器失败
    printf( "OpenSCManager() Faild %d ! \n", GetLastError() );  
    bRet = FALSE;
    goto BeforeLeave;
    }  
    else  
    {
    //带开SCM管理器失败成功
    printf( "OpenSCManager() ok ! \n" );  
    }
    //打开驱动所对应的服务
    hServiceDDK = OpenService( hServiceMgr, szSvrName, SERVICE_ALL_ACCESS );   if( hServiceDDK == NULL )  
    {
    //打开驱动所对应的服务失败
    printf( "OpenService() Faild %d ! \n", GetLastError() );  
    bRet = FALSE;
    goto BeforeLeave;
    }  
    else  
    {  
    printf( "OpenService() ok ! \n" );  
    }  
    //停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。  
    if( !ControlService( hServiceDDK, SERVICE_CONTROL_STOP , &SvrSta ) )  
    {  
    printf( "ControlService() Faild %d !\n", GetLastError() );  
    }  
    else  
    {
    //打开驱动所对应的失败
    printf( "ControlService() ok !\n" );  
    }  
    //动态卸载驱动程序。  
    if( !DeleteService( hServiceDDK ) )  
    {
    //卸载失败
    printf( "DeleteSrevice() Faild %d !\n", GetLastError() );  
    }  
    else  
    {  
    //卸载成功
    printf( "DelServer:eleteSrevice() ok !\n" );  
    }  
    bRet = TRUE;
    BeforeLeave:
    //离开前关闭打开的句柄
    if(hServiceDDK)
    {
    CloseServiceHandle(hServiceDDK);
    }
    if(hServiceMgr)
    {
    CloseServiceHandle(hServiceMgr);
    }
    return bRet;

    int main()
    {
      //加载驱动
      BOOL bRet = LoadNTDriver(DRIVER_NAME,DRIVER_PATH);
      ......
      //卸载驱动
      UnloadNTDriver(DRIVER_NAME);
    }
      

  4.   

    -----------------
    case IOCTL_PROTECT_CONTROL:
      inSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
      outSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;   
      inBuf = (long*)Irp->AssociatedIrp.SystemBuffer;
       
      pid = *inBuf;
    --------------------------
    irp主类型--IRP_MJ_DEVICE_CONTROL irp次类型 min --IOCTL_PROTECT_CONTROL
    代码里面很明显了 你只要将 需要保护的进程的pid作为内容写入即可 buffer传递给驱动即可