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

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

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

                                                                   2006年11月29日 12:03:24

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

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            国产精品青草久久久久婷婷| 亚洲国产精品无码久久一区二区| 久久精品免费观看| 久久久久国产| 久久综合给合久久狠狠狠97色| www.久久精品| 午夜精品久久久内射近拍高清 | 精品久久人人爽天天玩人人妻| 亚洲AV无码久久精品色欲| www.久久99| 国产偷久久久精品专区| 热久久国产精品| 一本一本久久A久久综合精品 | 青草国产精品久久久久久| 国产亚州精品女人久久久久久 | 久久综合狠狠综合久久| 久久免费视频一区| 日本精品久久久中文字幕| 亚洲精品无码久久久影院相关影片| 久久久久亚洲AV成人网人人软件 | 久久久国产精华液| 久久久久香蕉视频| 精品久久久久久99人妻| 久久96国产精品久久久| 国产午夜精品久久久久免费视| 亚洲精品WWW久久久久久| 国产一区二区三精品久久久无广告 | 久久精品国产精品亚洲下载| AV色综合久久天堂AV色综合在| 久久精品无码一区二区WWW| 久久人人爽人人精品视频| 久久久久亚洲AV无码去区首| 99久久精品国产一区二区| 久久99精品久久久久久| 久久青草国产精品一区| 久久久91精品国产一区二区三区| av无码久久久久不卡免费网站| 波多野结衣中文字幕久久| 久久天天躁狠狠躁夜夜avapp | 久久久精品波多野结衣| 久久综合亚洲色HEZYO国产|