亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? load.c

?? 驅動層Hook系統內核調用的
?? C
字號:
/*
 driver loader is used to install the driver via service manager 
 it also sends some commands to driver
 usage is simple: load driver_name driver_display_name path
 you can use loadhook.bat 

 second thread was added to receive events from driver 
 it uses asynchronous IO to manage this
 see description in the main driver file for more
*/

#include <windows.h>
#include <stdio.h>
#include <ddk/ntddk.h>
#include "../drvcomm.h"


int work=0;                                     //indicator of application status
HANDLE notify_event;                            //sync event between notify thread and main thread
int notify_type;                                //type of driver notification
DWORD notify_data;                              //driver notification data
HANDLE notify_dev;                              //notify thread device file

/*
 second thread manages notifications from driver
 we do not take any action if something in this thread failed
 however, for the functionality of our program this thread is important 
 so in real world program this should be handled too
 also synchronization is missing in this example
*/

DWORD WINAPI notify_thread(LPVOID args)
{
  printf("Notify thread runs\n");
  HANDLE notify_dev=CreateFile(args,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,
                               NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
  if (notify_dev==INVALID_HANDLE_VALUE) notify_dev=0;
  if (notify_dev)
  {
    OVERLAPPED overlapped;
    overlapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

    if (overlapped.hEvent)
    {
      while (work)
      {
        DRVCOMM_REQUEST_BUFFER buf_req;
        DRVCOMM_RESPONSE_BUFFER buf_res;
        memset(&buf_req,0,sizeof(buf_req));
        memset(&buf_res,0,sizeof(buf_res));

        DWORD bytes;
        int ret=DeviceIoControl(notify_dev,IOCTL_NOTIFY,NULL,0,&buf_res,sizeof(buf_res),&bytes,&overlapped);

        int err=ret?0:GetLastError();

        if (err==ERROR_IO_PENDING)
        {
          if (GetOverlappedResult(notify_dev,&overlapped,&bytes,TRUE)) err=0;
          else err=GetLastError();
        }

        if (err)
        {
          if (err==ERROR_OPERATION_ABORTED) printf("Notify thread received exit signal\n");
          else printf("Notify thread error: unexpected DeviceIoControl error %d\n",err);
          break;
        }

        if (!bytes || !buf_res.status)
        {
          printf("Notify thread communication error: bytes=%d; buf_res.status=0x%.8X\n",bytes,buf_res.status);
          break;
        }

        /*
         we've received notification from driver
         we'll contact second thread for user input 
        */
        HKEY key;
        char name[512],*svc_name,imagepath[512],svc_path[512];
        DWORD imagepath_len=sizeof(imagepath);
        memset(imagepath,0,imagepath_len);
        err=0;

        switch (buf_res.type)
        {
          case RESPONSE_NOTIFY_PROCESS_CHECK:
            printf("Notify thread: RESPONSE_NOTIFY_PROCESS_CHECK received, you should make a decision:\n");
            notify_type=RESPONSE_NOTIFY_PROCESS_CHECK;
            notify_data=buf_res.parameters.process_check.pid;

            printf("permit 0x%.8X access for process pid=%d to process pid=%d?\n",
                   buf_res.parameters.process_check.access,buf_res.parameters.process_check.caller_pid,notify_data);

            PulseEvent(notify_event);
            WaitForSingleObject(notify_event,INFINITE);
            printf("Notify thread wait done, answer = %s\n",notify_data?"deny":"permit");

            buf_req.parameters.process_check.permit=notify_data;
            ret=DeviceIoControl(notify_dev,IOCTL_NOTIFY_PROCESS_CHECK,&buf_req,sizeof(buf_req),NULL,0,&bytes,&overlapped);

            if (!ret && (GetLastError()==ERROR_IO_PENDING)) GetOverlappedResult(notify_dev,&overlapped,&bytes,TRUE);
            break;

          case RESPONSE_NOTIFY_LOAD_DRIVER_CHECK:
            /*
             we've got a system registry path to Services in HKLM, we open it and read ImagePath from there
            */
            notify_type=RESPONSE_NOTIFY_LOAD_DRIVER_CHECK;
            notify_data=(ULONG)&buf_res.parameters.load_driver_check.regpath;

            err=3;
            sprintf(name,"%S\0",&buf_res.parameters.load_driver_check.regpath);
            svc_name=strrchr(name,'\\');
            svc_name++;

            if (svc_name && *svc_name)
            {
              err--;
              sprintf(svc_path,"SYSTEM\\CurrentControlSet\\Services\\%s\0",svc_name);

              if (ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,svc_path,0,KEY_QUERY_VALUE,&key)==ERROR_SUCCESS)
              {
                err--;
                printf("Notify thread: RESPONSE_NOTIFY_LOAD_DRIVER_CHECK received, you should make a decision:\n");

                if (ret=RegQueryValueEx(key,"ImagePath",NULL,NULL,imagepath,&imagepath_len)==ERROR_SUCCESS)
                {
                  err--;
                  printf("permit loading driver ServiceName=%s ImagePath=%s for process pid=%d?\n",
                         svc_name,imagepath,buf_res.parameters.load_driver_check.caller_pid);

                  PulseEvent(notify_event);
                  WaitForSingleObject(notify_event,INFINITE);
                  printf("Notify thread wait done, answer = %s\n",notify_data?"deny":"permit");
                }
              }
            }

            if (err)
            {
              printf("Notify thread: RESPONSE_NOTIFY_LOAD_DRIVER_CHECK received, but error occurred: ");
              switch (err)
              {
                case 1:printf("RegQueryValueEx for ImagePath failed with code %d",ret); break;
                case 2:printf("RegOpenKeyEx failed with code %d",ret); break;
                case 3:printf("invalid service name"); break;
              }

              //something went wrong -> deny access
              printf(" -> denying access");
              notify_data=0;
            }
            buf_req.parameters.load_driver_check.permit=notify_data;
            ret=DeviceIoControl(notify_dev,IOCTL_NOTIFY_LOAD_DRIVER_CHECK,&buf_req,sizeof(buf_req),NULL,0,&bytes,&overlapped);

            if (!ret && (GetLastError()==ERROR_IO_PENDING)) GetOverlappedResult(notify_dev,&overlapped,&bytes,TRUE);
            break;


          default:
            printf("Notify thread error: unknown response buffer type\n");
        }
      }
      CloseHandle(overlapped.hEvent);
    } else printf("Notify thread error: unable to create event\n");

    CloseHandle(notify_dev);
  } else printf("Notify thread error: unable to connect device\n");

  printf("Notify thread terminates\n");
  ExitThread(0);
}



int main(int argc,char **argv)
{
  /*
   this version uses ZwQueryInformationThread in kernel driver to determine
   process that owns specific thread, unfortunately ntoskrnl.exe exports 
   ZwQueryInformationThread in XP and higher, but the implementation is also 
   available in W2k, so we will do a little hack here and from user mode 
   ntdll.dll we retrieve an index to SDT and send it to kernel driver to call
   ZwQueryInformationThread using this index
   we could hardcode the index for W2k but this way it is more elegant as we 
   don't need to care about service pack differences
   this is quite simple solution but it works only if this function is not 
   hooked in ntdll.dll, if the function is hooked (and index is rewritten)
   this hack fails, however, in this case we should load and map ntdll.dll
   from disk to get raw unhooked image and find our function address in export 
   table and retrieve the index from the image then, this is not implemented 
   in this version, we assume clear (not hooked) environment
  */
  ULONG SDT_index_ZwQIT=0;
  HMODULE ntdll=GetModuleHandle("ntdll.dll");
  PVOID ZwQIT=GetProcAddress(ntdll,"ZwQueryInformationThread");
  if (ZwQIT) SDT_index_ZwQIT=*((PULONG)((UCHAR *)ZwQIT+1));

  printf("SDT_index_ZwQIT = 0x%.8X\n",SDT_index_ZwQIT);
  if (SDT_index_ZwQIT>0x0200) SDT_index_ZwQIT=0;
  if (!SDT_index_ZwQIT)
  {
    printf("error: unable to retrieve valid SDT index for ZwQueryInformationThread\n");
    return 0;
  }

  printf("Opening service manager ...\n");
  HANDLE scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
  
  if(scm)
  {
    printf("Creating service ...\n");

    HANDLE svc=CreateService(scm,argv[1],argv[2],SERVICE_START | DELETE | SERVICE_STOP,SERVICE_KERNEL_DRIVER,
                             SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,argv[3],NULL,NULL,NULL,NULL,NULL);

    if(!svc)
    {
      printf("Creating failed, trying to open service ...\n");
      svc=OpenService(scm,argv[1],SERVICE_START | DELETE | SERVICE_STOP);
    }

    if(svc)
    {
      printf("Starting service\n");

      StartService(svc,0,NULL);

      printf("Creating communication device ...\n");

      /*
       for MSTS we need to use Global namespace to access our device
      */
      char dev_name[256];
      if ((GetVersion()&0xFF)>=5) sprintf(dev_name,"\\\\.\\Global\\%s\0",argv[1]);
      else sprintf(dev_name,"\\\\.\\%s\0",argv[1]);

      HANDLE dev=CreateFile(dev_name,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);

      if (dev==INVALID_HANDLE_VALUE) dev=0;
      if (dev)
      {
        printf("Starting notify thread\n");
        work=1;
        DWORD tid;
        HANDLE thread=CreateThread(NULL,0,notify_thread,dev_name,0,&tid);
        if (thread==INVALID_HANDLE_VALUE) thread=0;
        notify_event=CreateEvent(NULL,TRUE,FALSE,NULL);

        if (thread && notify_event)
        {
          CloseHandle(thread);

          printf("Press Enter to send IOCTL_HOOK_START\n");
          getchar();

          DRVCOMM_REQUEST_BUFFER buf_req;
          DRVCOMM_RESPONSE_BUFFER buf_res;
          DWORD bytes=0,ret;

          buf_req.parameters.init.SDT_index_ZwQueryInformationThread=SDT_index_ZwQIT;

          /*
           send command to our driver, no input buffer is used here
           output buffer contains status value only
          */
          memset(&buf_res,0,sizeof(buf_res));
          ret=DeviceIoControl(dev,IOCTL_HOOK_START,&buf_req,sizeof(buf_req),&buf_res,sizeof(buf_res),&bytes,NULL);
          printf("DeviceIoControl returned code 0x%.8X, status 0x%.8X and %d bytes\n",ret,buf_res.status,bytes);

          if (buf_res.status)
          {
            /*
             this is a loop for driver rules managment
            */
            printf("\nenter commands to protect/disable protection of processes\n"
                   "to enable protection for process write 'e PID'\n"
                   "to disable protection for process write 'd PID'\n"
                   "to answer notify check write 'p 0/1' - '0' for deny and '1' for permit\n"
                   "current process id = %d\n"
                   "write 'x 0' for end\n",GetCurrentProcessId());

            while (work)
            {
              bytes=0;
              char ch_type;
              int obj_id=0;
              scanf("%c %d",&ch_type,&obj_id);
              getchar();

              int enable;
              ULONG code;

              switch (ch_type)
              {
                case 'd':
                case 'e':
                  enable=ch_type=='e';
                  code=IOCTL_PROTECT_PROCESS;
                  buf_req.parameters.protect_process.pid=obj_id;
                  buf_req.parameters.protect_process.enable=enable;
                  ret=DeviceIoControl(dev,code,&buf_req,sizeof(buf_req),&buf_res,sizeof(buf_res),&bytes,NULL);
                  printf("DeviceIoControl returned code 0x%.8X, status 0x%.8X and %d bytes\n",ret,buf_res.status,bytes);
                  break;

                case 'p':
                  notify_data=!obj_id;          //we set protect TRUE or FALSE -> protect = !permit
                  PulseEvent(notify_event);
                  break;

                case 'x':
                  work=0;
                  break;

                default:
                  printf("unknown command type %c\n",ch_type);
              }
            }

            bytes=0;
            printf("Press Enter to send IOCTL_HOOK_STOP\n");
            getchar();

            ret=DeviceIoControl(dev,IOCTL_HOOK_STOP,NULL,0,&buf_res,sizeof(buf_res),&bytes,NULL);
            printf("DeviceIoControl returned code 0x%.8X, status 0x%.8X and %d bytes\n",ret,buf_res.status,bytes);

            //cancel possible waiting
            PulseEvent(notify_event);
          }

          printf("Press Enter to send close device handle\n");
          getchar();
          CloseHandle(dev);
        } else printf("error: unable to create notify thread\n");

        if (notify_event) CloseHandle(notify_event);

      } else printf("error: unable to create communication device\n");

      printf("Press Enter to stop and delete service \n");
      getchar();

      SERVICE_STATUS status;
      ControlService(svc,SERVICE_CONTROL_STOP,&status);

      DeleteService(svc);
      CloseServiceHandle(svc);
    } else printf("error: unable to create/open service\n");

    CloseServiceHandle(scm);
  } else printf("error: unable to open manager\n");
  
  return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久一本精品| 欧美精品一区二区三区在线播放| 激情图区综合网| 日韩专区中文字幕一区二区| 国产精品国模大尺度视频| 日本一区二区三区电影| 国产精品三级av在线播放| 中文字幕 久热精品 视频在线| 久久久www成人免费毛片麻豆| 国产午夜精品久久久久久免费视| 国产欧美视频一区二区| 国产精品国产三级国产有无不卡 | 色噜噜夜夜夜综合网| 97精品视频在线观看自产线路二| jvid福利写真一区二区三区| 在线国产亚洲欧美| 欧美剧情片在线观看| 91精品欧美久久久久久动漫| 精品粉嫩aⅴ一区二区三区四区| 精品国偷自产国产一区| 国产午夜精品理论片a级大结局| 亚洲色图一区二区三区| 午夜av电影一区| 精品一区二区三区视频| 成人激情文学综合网| 欧美伊人精品成人久久综合97| 6080日韩午夜伦伦午夜伦| 国产偷国产偷亚洲高清人白洁| 国产精品国产三级国产普通话三级 | 亚洲在线成人精品| 日韩av电影免费观看高清完整版在线观看| 另类中文字幕网| 91伊人久久大香线蕉| 91精品啪在线观看国产60岁| 欧美mv日韩mv国产网站app| 久久久久久久久久久久久夜| 亚洲激情图片一区| 国产永久精品大片wwwapp| 在线观看亚洲一区| 国产亚洲精品中文字幕| 婷婷一区二区三区| 97久久精品人人做人人爽| 欧美大片在线观看一区二区| 一区二区三区欧美亚洲| 国产69精品久久久久毛片| 欧美剧情片在线观看| 亚洲私人黄色宅男| 国产精品一二三四区| 欧美一区二区三区电影| 亚洲国产毛片aaaaa无费看 | 香蕉久久一区二区不卡无毒影院| 国产乱子轮精品视频| 欧美猛男gaygay网站| 亚洲免费视频成人| av动漫一区二区| 久久久亚洲综合| 看片的网站亚洲| 欧美一区二区三区四区久久| 日韩伦理免费电影| 国产精品一区二区免费不卡| 欧美一区二区精品| 亚洲一区二区在线免费观看视频| 成人免费黄色大片| 国产日韩影视精品| 风间由美中文字幕在线看视频国产欧美| 制服丝袜中文字幕亚洲| 亚洲成a人v欧美综合天堂| 在线免费观看日本一区| 亚洲精品乱码久久久久久久久| 丁香婷婷深情五月亚洲| 国产精品午夜电影| 成人综合婷婷国产精品久久免费| 久久综合九色综合97_久久久| 日韩精彩视频在线观看| 欧美色精品在线视频| 午夜在线电影亚洲一区| 欧美午夜精品一区二区三区| 亚洲综合清纯丝袜自拍| 欧美日韩国产免费| 美美哒免费高清在线观看视频一区二区| 欧美日韩精品一区二区三区蜜桃| 一区二区在线观看av| 欧美在线观看一二区| 午夜久久久久久电影| 日韩你懂的在线播放| 三级在线观看一区二区| 日韩欧美第一区| 国产一区二区三区蝌蚪| 国产精品色哟哟网站| 91玉足脚交白嫩脚丫在线播放| 亚洲精品中文在线影院| 欧美精品亚洲二区| 国产专区欧美精品| 国产精品久久久久久一区二区三区| 91视视频在线观看入口直接观看www| 中文字幕人成不卡一区| 欧美日韩电影在线播放| 精彩视频一区二区三区 | 色视频欧美一区二区三区| 亚洲va天堂va国产va久| 欧美成人女星排名| 99精品国产91久久久久久| 午夜精品一区二区三区免费视频| 欧美精品一区二区三区在线 | 欧美日韩国产另类一区| 老司机精品视频在线| 国产精品久线观看视频| 欧美电影一区二区| 国产v日产∨综合v精品视频| 亚洲美女精品一区| 久久免费看少妇高潮| 欧美三级电影在线看| 国产盗摄一区二区| 亚洲小说春色综合另类电影| 精品国产亚洲在线| 色婷婷综合在线| 国模少妇一区二区三区| 亚洲精品中文在线| 国产午夜精品在线观看| 91麻豆精品久久久久蜜臀| 成人国产精品免费观看| 日本不卡视频一二三区| 一区二区三区美女| 日本一区二区三区电影| 精品欧美黑人一区二区三区| 91蜜桃在线免费视频| 国产精品66部| 九九精品视频在线看| 性做久久久久久| 一区二区三区欧美亚洲| 日韩毛片精品高清免费| 国产欧美日韩麻豆91| 日韩午夜在线播放| 欧美放荡的少妇| 欧美性大战久久久久久久| 国产成人久久精品77777最新版本| 爽好多水快深点欧美视频| 亚洲女爱视频在线| 中文字幕亚洲不卡| 中文字幕欧美激情一区| 久久久久国色av免费看影院| 日韩精品综合一本久道在线视频| 欧美猛男男办公室激情| 91丨九色丨蝌蚪丨老版| 成人一区二区三区| 精品在线亚洲视频| 久久疯狂做爰流白浆xx| 日韩电影在线看| 美美哒免费高清在线观看视频一区二区 | 播五月开心婷婷综合| 国产sm精品调教视频网站| 国产一区二区久久| 国产成a人亚洲| 高清国产一区二区| 北条麻妃国产九九精品视频| 成人美女视频在线观看18| 成人美女视频在线观看| 一本色道久久综合精品竹菊| 91影院在线免费观看| 欧美性极品少妇| 制服视频三区第一页精品| 91精品国产麻豆国产自产在线 | 午夜视黄欧洲亚洲| 日韩黄色在线观看| 久久99久国产精品黄毛片色诱| 久久se这里有精品| 国产精品白丝av| 91在线播放网址| 欧美人与禽zozo性伦| 日韩一区二区免费电影| 国产三级精品在线| 一区二区三区在线影院| 蜜臀精品久久久久久蜜臀| 国产精品99久久久久久似苏梦涵 | 欧美不卡视频一区| 久久久久高清精品| 亚洲色欲色欲www| 丝袜美腿亚洲一区| 国产91丝袜在线播放九色| 99久久国产综合精品色伊| 欧美三级电影网站| 久久久国产精品不卡| 一区二区三区四区国产精品| 亚洲超碰97人人做人人爱| 国产一区二区三区视频在线播放| 成人久久18免费网站麻豆| 欧美日韩在线播| 国产日韩在线不卡| 偷拍亚洲欧洲综合| 成人深夜福利app| 欧美精品久久一区| 日本一区二区在线不卡| 日韩成人免费电影| 91视频.com| 久久久久久久久97黄色工厂| 亚洲国产综合在线| 99久久99久久综合| 欧美白人最猛性xxxxx69交| 亚洲蜜桃精久久久久久久| 极品少妇一区二区|