• <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)初步實現(xiàn)系統(tǒng)級攔截應(yīng)用程序取硬盤物理序列號

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

            【文章標題】: 初步實現(xiàn)系統(tǒng)級攔截應(yīng)用程序取硬盤物理序列號
            【文章作者】: rockhard
            【作者郵箱】: wnh1@sohu.com
            【作者聲明】: 只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教!
            --------------------------------------------------------------------------------
            【詳細過程】
              以前想模擬某個程序取硬盤系列號,就將一個DLL注入進去,攔截DeviceIoControl的返回值,將其修改為目標硬盤的值。
              后來看到REGMON 從SSDT著手攔截注冊表操作,可以看到任何程序的讀寫操作,就仿著改了一下程序。經(jīng)測試可以欺騙相當
              一部分程序讀硬盤序列號,包括ASPROTECT及用其加密算法的子孫:)。
              
              我的思路是這樣的:
               
              1、首先用程序取自己的真正的硬盤序列號,假設(shè)為XXXX
              
              2、攔截系統(tǒng)的ZwDeviceIoControlFile,并判斷入口參數(shù)中的IoControlCode ,只有某幾個特定的值用來取序列號的,
                 目前在所有的程序中取硬盤序列號的,我只發(fā)現(xiàn)兩個值,一個是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);
              }
              
              
              目前,驅(qū)動只處理了簡單的幾個應(yīng)用層的消息,包括停止欺騙,開始欺騙,設(shè)置新的欺騙值。
              
              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;
              
                  // 告訴驅(qū)動當前自己硬盤的序列號值為多少
              
                  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;
              
                  // 設(shè)置新的欺騙的硬盤序列號
              
                  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;
              
                //返回驅(qū)動的版本號
              
                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;
              }
              
              
              ////////////////////////////////////////////////
              應(yīng)用層程序可以通過如下簡單代碼與驅(qū)動進行通信:
              
              #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
              
              //設(shè)置新的序列號模擬值
              DeviceIoControl(__SysHandle,HDHOOK_SETEMULABLEVALUE,szEmulSerial,DISK_SERIAL_BUFF_LENGTH, NULL, 0, &dwDummy, NULL) ;
              
              //告訴驅(qū)動自己的硬盤序列號
              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是安裝驅(qū)動的句柄
              
              
              這篇文章的思路來自regmon(regmon版權(quán)申明我保留在文件中),寫出來是方便調(diào)試那些有正版注冊號且以硬盤序列號生成注冊碼的程序,方便一下大家。
              
              附件中包含我寫的一個簡單的UI,用來與驅(qū)動通信。
              
              如果你覺得有用,希望有人能完成如下功能:
              1、進程過濾功能,只對特定程序攔截。
              2、考慮將上面的那個串匹配算法改得高效些,數(shù)據(jù)結(jié)構(gòu)教材上有現(xiàn)成的:)
              3、那個返回值中有硬盤廠家,磁道數(shù)等信息,完成完全模擬,還有IoControlCode 的完善。
              
              若改好了希望能傳一份給我 :)
              
              
              
              
              
              
            --------------------------------------------------------------------------------
            【版權(quán)聲明】: 本文原創(chuàng)于看雪技術(shù)論壇, 轉(zhuǎn)載請注明作者并保持文章的完整, 謝謝!

                                                                   2006年11月29日 12:03:24

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

            導(dǎo)航

            統(tǒng)計

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            国内精品久久久人妻中文字幕| 91久久精品国产91性色也| 狠狠精品干练久久久无码中文字幕| 狠狠色丁香久久婷婷综| 国产精品亚洲美女久久久| 亚洲精品乱码久久久久久蜜桃不卡 | 久久精品国产只有精品2020| 国产成人综合久久久久久| 亚洲国产成人久久笫一页| 国内精品久久久久伊人av | 久久er国产精品免费观看8| 久久这里都是精品| 精品久久久久久国产91| 久久影视综合亚洲| 韩国三级中文字幕hd久久精品| 18岁日韩内射颜射午夜久久成人| 国产激情久久久久影院老熟女免费| 亚洲天堂久久久| 久久综合一区二区无码| 国产精品日韩欧美久久综合| 一本一道久久综合狠狠老| 亚洲精品第一综合99久久| 久久综合日本熟妇| 久久久久国产一级毛片高清板| 久久久精品久久久久久 | 97久久香蕉国产线看观看| 久久久久久久久无码精品亚洲日韩 | 一本大道加勒比久久综合| 精品国产乱码久久久久久郑州公司 | 亚洲精品综合久久| 婷婷久久综合九色综合九七| 久久免费视频一区| 亚洲综合精品香蕉久久网97| 青青热久久综合网伊人| 久久毛片免费看一区二区三区| 久久久久久久亚洲Av无码| 久久99亚洲网美利坚合众国| 久久久久久九九99精品| 久久久久亚洲精品天堂| 97久久久久人妻精品专区| 国产激情久久久久影院小草|