找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5212|回复: 2

[转]RING3直接读写磁盘扇区

[复制链接]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2015-1-15 10:30:06 | 显示全部楼层 |阅读模式
FROM: http://www.kernelmode.info/forum/viewtopic.php?f=15&t=3677
Author: EP_X0FF
  1. #include <windows.h>
  2. #include "prtl.h"

  3. #define IOCTL_SCSI_BASE                 FILE_DEVICE_CONTROLLER
  4. #define FILE_DEVICE_CONTROLLER          0x00000004
  5. #define IOCTL_ATA_PASS_THROUGH_DIRECT   CTL_CODE(IOCTL_SCSI_BASE, 0x040c, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)

  6. #define ATA_FLAGS_DRDY_REQUIRED         (1 << 0)
  7. #define ATA_FLAGS_DATA_IN               (1 << 1)
  8. #define ATA_FLAGS_DATA_OUT              (1 << 2)
  9. #define ATA_FLAGS_48BIT_COMMAND         (1 << 3)
  10. #define ATA_FLAGS_USE_DMA               (1 << 4)
  11. #define ATA_FLAGS_NO_MULTIPLE           (1 << 5)

  12. typedef struct _ATA_PASS_THROUGH_DIRECT {
  13.     USHORT Length;
  14.     USHORT AtaFlags;
  15.     UCHAR PathId;
  16.     UCHAR TargetId;
  17.     UCHAR Lun;
  18.     UCHAR ReservedAsUchar;
  19.     ULONG DataTransferLength;
  20.     ULONG TimeOutValue;
  21.     ULONG ReservedAsUlong;
  22.     PVOID DataBuffer;
  23.     UCHAR PreviousTaskFile[8];
  24.     UCHAR CurrentTaskFile[8];
  25. } ATA_PASS_THROUGH_DIRECT, *PATA_PASS_THROUGH_DIRECT;

  26. #define INBUFFER_SIZE 1024*1024

  27. int IsFileInfested(LPCTSTR FileName, LPVOID RawData, DWORD BufferSize)
  28. {
  29.    ATA_PASS_THROUGH_DIRECT      dio, dioOut;
  30.    STARTING_VCN_INPUT_BUFFER   base;
  31.    RETRIEVAL_POINTERS_BUFFER   *ptrs;
  32.    VOLUME_DISK_EXTENTS         ext;
  33.    LARGE_INTEGER            ofs, lofs;
  34.    __int64                  i, k;

  35.    HANDLE   f = INVALID_HANDLE_VALUE;
  36.    DWORD   iobytes, SectorsPerCluster = 0, BytesPerSector = 0, c, p = 0;
  37.    TCHAR   drive[8] = TEXT("\\\\.\\X:\");
  38.    WORD    DevId[256] = {0};
  39.    USHORT  AtaFlags;
  40.    UCHAR   AtaCommand;

  41.    drive[4] = FileName[0];
  42.    if ( !GetDiskFreeSpace(&drive[4], &SectorsPerCluster, &BytesPerSector, NULL, NULL) )
  43.       return -1;

  44.    ptrs = (RETRIEVAL_POINTERS_BUFFER *)VirtualAlloc(NULL, INBUFFER_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
  45.    while ( ptrs != NULL ) {
  46.       f = CreateFile(FileName, GENERIC_READ | SYNCHRONIZE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, NULL);
  47.       if ( f == INVALID_HANDLE_VALUE )
  48.          break;
  49.       base.StartingVcn.QuadPart = 0;
  50.       if ( !DeviceIoControl(f, FSCTL_GET_RETRIEVAL_POINTERS, &base, sizeof(base), ptrs, INBUFFER_SIZE, &iobytes, NULL) )
  51.          break;
  52.       CloseHandle(f);

  53.       drive[6] = 0;
  54.       f = CreateFile(drive, GENERIC_READ | SYNCHRONIZE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, NULL);
  55.       if ( f == INVALID_HANDLE_VALUE )
  56.          break;
  57.       if ( !DeviceIoControl(f, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, &ext, sizeof(ext), &iobytes, NULL) )
  58.          break;
  59.       CloseHandle(f);

  60.       f = CreateFile(TEXT("\\\\.\\PHYSICALDRIVE0"), GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
  61.       if ( f == INVALID_HANDLE_VALUE )
  62.          break;

  63.       ext.Extents[0].StartingOffset.QuadPart /= BytesPerSector;
  64.       lofs.QuadPart = 0;

  65.       memset(&DevId, 0, sizeof(DevId));
  66.       memset(&dio, 0, sizeof(dio));
  67.       dio.Length = sizeof(dio);
  68.       dio.AtaFlags = ATA_FLAGS_DRDY_REQUIRED | ATA_FLAGS_DATA_IN;
  69.       dio.DataTransferLength = 512;
  70.       dio.TimeOutValue = 1;
  71.       dio.DataBuffer = &DevId;
  72.       dio.CurrentTaskFile[6] = 0xEC;
  73.       DeviceIoControl(f, IOCTL_ATA_PASS_THROUGH_DIRECT, &dio, sizeof(dio), &dioOut, sizeof(dioOut), &iobytes, NULL);

  74.       if ((DevId[83] & 0x400) != 0) {
  75.          AtaCommand = 0x25;
  76.          AtaFlags = ATA_FLAGS_DRDY_REQUIRED | ATA_FLAGS_USE_DMA | ATA_FLAGS_DATA_IN | ATA_FLAGS_48BIT_COMMAND;
  77.       } else {
  78.          AtaCommand = 0xC8;
  79.          AtaFlags = ATA_FLAGS_DRDY_REQUIRED | ATA_FLAGS_USE_DMA | ATA_FLAGS_DATA_IN;
  80.       }


  81.       for (c=0; c<ptrs->ExtentCount; c+=1) {
  82.          ofs.QuadPart = ext.Extents[0].StartingOffset.QuadPart + (ptrs->Extents[c].Lcn.QuadPart*SectorsPerCluster);
  83.          k = ptrs->Extents[c].NextVcn.QuadPart - lofs.QuadPart;

  84.          if ( p+(BytesPerSector*SectorsPerCluster) > BufferSize )
  85.             break;

  86.          for (i=0; i<k; i+=1) {
  87.             if ( p+(BytesPerSector*SectorsPerCluster) > BufferSize )
  88.                break;
  89.             lofs.QuadPart = ofs.QuadPart + i*SectorsPerCluster;

  90.             memset(&dio, 0, sizeof(dio));
  91.             dio.Length = sizeof(dio);
  92.             dio.AtaFlags = AtaFlags;
  93.             dio.DataTransferLength = BytesPerSector*SectorsPerCluster;
  94.             dio.TimeOutValue = 1;
  95.             dio.DataBuffer = ((LPBYTE)RawData)+p;

  96.             dio.PreviousTaskFile[2] = (lofs.QuadPart >> 24) & 0xff;
  97.             dio.PreviousTaskFile[3] = (lofs.QuadPart >> 32) & 0xff;
  98.             dio.PreviousTaskFile[4] = (lofs.QuadPart >> 40) & 0xff;

  99.             dio.CurrentTaskFile[1] = (UCHAR)SectorsPerCluster;
  100.             dio.CurrentTaskFile[2] = lofs.QuadPart & 0xff;
  101.             dio.CurrentTaskFile[3] = (lofs.QuadPart >> 8) & 0xff;
  102.             dio.CurrentTaskFile[4] = (lofs.QuadPart >> 16) & 0xff;
  103.             
  104.             if (AtaCommand == 0xC8) {
  105.                dio.CurrentTaskFile[5] = 0x40 | ((lofs.QuadPart >> 24) & 0x0f);
  106.             } else {
  107.                dio.CurrentTaskFile[5] = 0x40;
  108.             }
  109.             
  110.             dio.CurrentTaskFile[5] = 0x40;

  111.             dio.CurrentTaskFile[6] = AtaCommand;
  112.             DeviceIoControl(f, IOCTL_ATA_PASS_THROUGH_DIRECT, &dio, sizeof(dio), &dioOut, sizeof(dioOut), &iobytes, NULL);
  113.             p+=(BytesPerSector*SectorsPerCluster);
  114.          }
  115.          lofs.QuadPart = ptrs->Extents[c].NextVcn.QuadPart;
  116.       }
  117.       CloseHandle(f);

  118.       VirtualFree(ptrs, 0, MEM_RELEASE);
  119.       return 0;
  120.    }

  121.    if ( f != INVALID_HANDLE_VALUE )
  122.       CloseHandle(f);
  123.    if ( ptrs != NULL )
  124.       VirtualFree(ptrs, 0, MEM_RELEASE);
  125.    return -1;
  126. }

  127. #define sFileName TEXT("C:\\WINDOWS\\system32\\drivers\\fltmgr.sys")

  128. void main()
  129. {
  130.    LPVOID buffer;
  131.    HANDLE   f;
  132.    DWORD   iobytes, fsize = 0;

  133.    

  134.    f = CreateFile(sFileName, GENERIC_READ | SYNCHRONIZE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
  135.    if ( f != INVALID_HANDLE_VALUE ) {
  136.       fsize = GetFileSize(f, NULL);
  137.       CloseHandle(f);
  138.    }

  139.    buffer = VirtualAlloc(NULL, fsize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
  140.    memset(buffer, 0xcc, fsize);

  141.    IsFileInfested(sFileName, buffer, fsize);
  142.    f = CreateFile(TEXT("Z:\\TEMP\\4321.dmp"), GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);
  143.    if (f != INVALID_HANDLE_VALUE) {
  144.       WriteFile(f, buffer, fsize, &iobytes, NULL);
  145.       CloseHandle(f);
  146.    }
  147.    Sleep(0);
  148. }
复制代码

但EP_X0FF表示:Do you understrand with current hardware + newest Windows installed in EFI mode all legacy BIOS bootkits are no longer work? And after few years computers with BIOS you can only see in the scrapyard?

0

主题

117

回帖

0

精华

银牌会员

积分
595
发表于 2015-1-15 12:10:04 | 显示全部楼层
顶。

3

主题

52

回帖

0

精华

金牌会员

积分
1043
发表于 2015-1-15 19:49:05 | 显示全部楼层
翻译过来就是:现在的硬件+最新的Windows在EFI模式下,所有的BIOS bootkit将不再有效你造吗?几年后,你只能在废料厂找到有BIOS的电脑。(他说的BIOS指的是Legacy方式引导的电脑。)

但事实上还是有无数国人在“坚持”使用XP。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表