• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            小默

            (zz)初步實現系統(tǒng)級攔截應用程序取硬盤物理序列號

            標 題: 【原創(chuàng)】初步實現系統(tǒng)級攔截應用程序取硬盤物理序列號
            作 者: rockhard
            時 間: 2006-11-29,12:09
            鏈 接: http://bbs.pediy.com/showthread.php?t=35626

            【文章標題】: 初步實現系統(tǒng)級攔截應用程序取硬盤物理序列號
            【文章作者】: rockhard
            【作者郵箱】: wnh1@sohu.com
            【作者聲明】: 只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教!
            --------------------------------------------------------------------------------
            【詳細過程】
              以前想模擬某個程序取硬盤系列號,就將一個DLL注入進去,攔截DeviceIoControl的返回值,將其修改為目標硬盤的值。
              后來看到REGMON 從SSDT著手攔截注冊表操作,可以看到任何程序的讀寫操作,就仿著改了一下程序。經測試可以欺騙相當
              一部分程序讀硬盤序列號,包括ASPROTECT及用其加密算法的子孫:)。
              
              我的思路是這樣的:
               
              1、首先用程序取自己的真正的硬盤序列號,假設為XXXX
              
              2、攔截系統(tǒng)的ZwDeviceIoControlFile,并判斷入口參數中的IoControlCode ,只有某幾個特定的值用來取序列號的,
                 目前在所有的程序中取硬盤序列號的,我只發(fā)現兩個值,一個是0x7c088,另外一個是什么忘了。
                 
                 如果IoControlCode為上面的值,讀取系統(tǒng)原有的ZwDeviceIoControlFile返回BUFFER,并用串匹配方法查找這個返回值中存在
                 不存在XXXX,如果存在,替換為你要欺騙的值.
              
              代碼很簡單:
              
              UCHAR __DiskSerial[DISK_SERIAL_BUFF_LENGTH]={0};
              UCHAR __ChangeTo  [DISK_SERIAL_BUFF_LENGTH]={0};
              
              //一個簡單的低率串匹配算法 ,判斷一個串S1是不是另外一個串S2的子串
              PUCHAR IsSubString(PUCHAR String, PUCHAR SubString ,ULONG StringLength ,ULONG SubStringLength)
              {
                  ULONG i,j;
                  for(i=0;i<StringLength - SubStringLength +1 ;i++){
                      for(j=0;j<SubStringLength;j++){
                          if(String[i+j]!=SubString[j])
                              break;
                      }
                      if(j==SubStringLength)  //match a substring
                          return String+i;
                  }
                  return NULL;
              }
              
              //----------------------------------------------------------------------
              //
              //  Our own routine for ZwDeviceIocontrolFile
              //  We change the hard disk serial number value requested by user
              //
              //----------------------------------------------------------------------
              NTSTATUS HookZwDeviceIoControlFile(
                                                IN HANDLE FileHandle,
                                                IN HANDLE Event OPTIONAL,
                                                IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
                                                IN PVOID ApcContext OPTIONAL,
                                                OUT PIO_STATUS_BLOCK IoStatusBlock,
                                                IN ULONG IoControlCode,
                                                IN PVOID InputBuffer OPTIONAL,
                                                IN ULONG InputBufferLength,
                                                OUT PVOID OutputBuffer OPTIONAL,
                                                IN ULONG OutputBufferLength
                                                )
              {
                  NTSTATUS rc;
              
                  rc = RealZwDeviceIoControlFile (
                      FileHandle,
                      Event,
                      ApcRoutine,
                      ApcContext,
                      IoStatusBlock,
                      IoControlCode,
                      InputBuffer,
                      InputBufferLength,
                      OutputBuffer,
                      OutputBufferLength
                  );
                  //判斷IoControlcode是不是取序列號的值
                  if((0x7c088 ==IoControlCode) && OutputBufferLength >DISK_SERIAL_BUFF_LENGTH){
              
                      //判斷返回值中是否包含當前的硬盤序列號,是的話用假的替換
                      PUCHAR Locate = IsSubString(OutputBuffer,__DiskSerial,OutputBufferLength,DISK_SERIAL_BUFF_LENGTH);
                      if(Locate){
                          UCHAR i;
                          for(i=0;i<20;i++){
                              Locate[i]= __ChangeTo[i];
                          }
                      }
                  }
                  return(rc);
              }
              
              
              目前,驅動只處理了簡單的幾個應用層的消息,包括停止欺騙,開始欺騙,設置新的欺騙值。
              
              BOOLEAN  HDHookDeviceControl( IN PFILE_OBJECT FileObject, IN BOOLEAN Wait,
                                            IN PVOID InputBuffer, IN ULONG InputBufferLength,
                                            OUT PVOID OutputBuffer, IN ULONG OutputBufferLength,
                                            IN ULONG IoControlCode, OUT PIO_STATUS_BLOCK IoStatus,
                                            IN PDEVICE_OBJECT DeviceObject ) {
                  BOOLEAN                 retval = FALSE;
                  ULONG i;
              
                  // Its a message from our GUI!
                  IoStatus->Status      = STATUS_SUCCESS; // Assume success
                  IoStatus->Information = 0;              // Assume nothing returned
              
              
                  switch ( IoControlCode ) {
              
                  //  開始欺騙
              
                  case HDHOOK_HOOK:
                      HookStart();
                      break;
              
                  // 停止欺騙
              
                  case HDHOOK_UNHOOK:
                      HookStop();
                      break;
              
                  // 告訴驅動當前自己硬盤的序列號值為多少
              
                  case HDHOOK_SETSELFVALUE:
                    if( InputBufferLength < DISK_SERIAL_BUFF_LENGTH || InputBuffer == NULL){
                      IoStatus->Status = STATUS_INVALID_PARAMETER;
                      break;
                    }
                    for(i=0; i< DISK_SERIAL_BUFF_LENGTH ;i++)
                      __DiskSerial[i] = ((UCHAR *)InputBuffer)[i];
              
                      break;
              
                  // 設置新的欺騙的硬盤序列號
              
                  case HDHOOK_SETEMULABLEVALUE:
                    if( InputBufferLength < DISK_SERIAL_BUFF_LENGTH || InputBuffer == NULL){
                      IoStatus->Status = STATUS_INVALID_PARAMETER;
                      break;
                    }
              
                    for(i=0;i< DISK_SERIAL_BUFF_LENGTH ;i++)
                      __ChangeTo[i] = ((UCHAR *)InputBuffer)[i];
              
                      break;
              
                //返回驅動的版本號
              
                case HDHOOK_VERSION:
                      if ( OutputBufferLength < sizeof(ULONG) ||
                           OutputBuffer == NULL ) {
                          IoStatus->Status = STATUS_INVALID_PARAMETER;
                          break;
                      }
              
                      *(ULONG *)OutputBuffer = REGMONVERSION;
                      IoStatus->Information = sizeof(ULONG);
                      break;
              
                  default:
                      IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
                      break;
                  }
                  return TRUE;
              }
              
              
              ////////////////////////////////////////////////
              應用層程序可以通過如下簡單代碼與驅動進行通信:
              
              #define HDHOOK_HOOK                  (ULONG) CTL_CODE( FILE_DEVICE_REGMON, 0x00, METHOD_BUFFERED, FILE_ANY_ACCESS )
              #define HDHOOK_UNHOOK                (ULONG) CTL_CODE( FILE_DEVICE_REGMON, 0x01, METHOD_BUFFERED, FILE_ANY_ACCESS )
              #define HDHOOK_VERSION               (ULONG) CTL_CODE( FILE_DEVICE_REGMON, 0x02, METHOD_BUFFERED, FILE_ANY_ACCESS )
              #define HDHOOK_SETSELFVALUE          (ULONG) CTL_CODE( FILE_DEVICE_REGMON, 0x03, METHOD_BUFFERED, FILE_ANY_ACCESS )
              #define HDHOOK_SETEMULABLEVALUE      (ULONG) CTL_CODE( FILE_DEVICE_REGMON, 0x04, METHOD_BUFFERED, FILE_ANY_ACCESS )
              
              #define DISK_SERIAL_BUFF_LENGTH      20
              
              //設置新的序列號模擬值
              DeviceIoControl(__SysHandle,HDHOOK_SETEMULABLEVALUE,szEmulSerial,DISK_SERIAL_BUFF_LENGTH, NULL, 0, &dwDummy, NULL) ;
              
              //告訴驅動自己的硬盤序列號
              DeviceIoControl(__SysHandle,HDHOOK_SETSELFVALUE,szBuffer,DISK_SERIAL_BUFF_LENGTH, NULL, 0, &dwDummy, NULL) ;
              
              //開始攔截
              DeviceIoControl(__SysHandle,HDHOOK_HOOK,NULL,0,NULL,0,&dwDummy,NULL) ;
              
              
              //停止攔截
              DeviceIoControl(__SysHandle,HDHOOK_UNHOOK,NULL,0,NULL,0,&dwDummy,NULL) ;
              
              其中__SysHandle是安裝驅動的句柄
              
              
              這篇文章的思路來自regmon(regmon版權申明我保留在文件中),寫出來是方便調試那些有正版注冊號且以硬盤序列號生成注冊碼的程序,方便一下大家。
              
              附件中包含我寫的一個簡單的UI,用來與驅動通信。
              
              如果你覺得有用,希望有人能完成如下功能:
              1、進程過濾功能,只對特定程序攔截。
              2、考慮將上面的那個串匹配算法改得高效些,數據結構教材上有現成的:)
              3、那個返回值中有硬盤廠家,磁道數等信息,完成完全模擬,還有IoControlCode 的完善。
              
              若改好了希望能傳一份給我 :)
              
              
              
              
              
              
            --------------------------------------------------------------------------------
            【版權聲明】: 本文原創(chuàng)于看雪技術論壇, 轉載請注明作者并保持文章的完整, 謝謝!

                                                                   2006年11月29日 12:03:24

            posted on 2010-02-05 23:57 小默 閱讀(926) 評論(0)  編輯 收藏 引用 所屬分類: Windows

            導航

            統(tǒng)計

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            亚洲国产精品久久久久婷婷老年 | 怡红院日本一道日本久久 | 亚洲国产成人精品久久久国产成人一区二区三区综 | 无码伊人66久久大杳蕉网站谷歌| 久久精品国产免费观看三人同眠| 久久国产色av免费看| 91精品国产综合久久四虎久久无码一级| 国产精品99久久久久久董美香| 少妇熟女久久综合网色欲| 国内精品久久久久| 狠狠综合久久综合88亚洲| 99久久国产热无码精品免费久久久久 | 国产情侣久久久久aⅴ免费| 日本加勒比久久精品| 国产精品久久久久久福利69堂| 性做久久久久久久久老女人| 久久亚洲国产欧洲精品一| 人妻少妇久久中文字幕一区二区| 久久综合九色综合久99| 久久Av无码精品人妻系列| 污污内射久久一区二区欧美日韩| 国产成人综合久久久久久| 精品乱码久久久久久久| 97久久婷婷五月综合色d啪蜜芽 | 亚洲日本va午夜中文字幕久久| …久久精品99久久香蕉国产| 97精品国产97久久久久久免费| 久久精品成人影院| 久久久久久久99精品免费观看| 午夜不卡久久精品无码免费| 久久亚洲国产精品成人AV秋霞| 很黄很污的网站久久mimi色| 久久国产高清字幕中文| 99久久国语露脸精品国产| 久久香蕉国产线看观看精品yw| 模特私拍国产精品久久| 亚洲伊人久久综合中文成人网| 久久只有这精品99| 中文字幕乱码人妻无码久久| 无码人妻久久一区二区三区免费 | 国产精品九九久久精品女同亚洲欧美日韩综合区 |