调试笔记之雨过天晴多点还原软件MBR实例

如何在串流云桌面中实现外设的远程控制输入——HID人机接口设备驱动简介(键鼠、手写板等) HID Transport是具体的硬件设备,我们HID Transport向上提供硬件相关信息,HID Client从来不主动和HID Transport直接通信,都是通过HIDClass.sys来进行中转的,这样给我们HID Client和HID Transport的开发都带来了非常大的便利;函数来完成注册的,这个函数是HIDClass.sys提供,也就是说HIDClass.sys提供了框架,给我们MiniPort驱动的开发。对于HID的设备的虚拟,我们主要是需要实现HID Transport。 阅读详情

 BY SUDAMI

 



为了能够调试多点还原软件"雨过天晴"的启动代码,目前有2种方式:

引用:
(1) 在Bochs调试器上装Windows XP系统,然后用Bochs单步调试. 不过光安装操作系统就得花20个小时以上
(2) 用Wnhex克隆整个磁盘,配置Bochs的*.bxrc文件.用这个克隆的磁盘来调试MBR

 
方案二较简单,故我选择此方式调试. 
在一个干净的Vmvare上装上雨过天晴,用Winhex克隆整个磁盘,Bochs调起来,发现根本没有进入ygtq的MBR,而是原始的引导代码. 这才意识到ygtq在驱动中做了手脚,对MBR的读写操作进行了重定向.于是开始分析起来. 经过几小时的战斗,终于搞定. 下面是一些调试分析的细节,希望对各位有所帮助!
-----------------------------------------------------------------------
 
雨过天晴拦截了对磁盘扇区的读写操作,会重新定位MBR,使得Winhex读取的MBR是原始的.这样用Bochs就没法调试ygtq的启动过程代码了.我们在调试器中恢复掉其在disk.sys 和 atapi.sys上的HOOK,再进行磁盘克隆.
 
雨过天晴在Shdbus.sys的分发例程中会检测disk.sys上的 0x4 和 0xf号派遣函数是否被恢复.若是,则恢复disk.sys的0x4 & 0xf为自己的地址,并全部替换掉atapi.sys的分发例程.
#define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
#define IRP_MJ_WRITE 0x04
 
在Windbg中观察:
kd> !drvobj /driver/disk 3
Driver object (81b7df38) is for:
/Driver/Disk
Driver Extension List: (id , addr)
(f99e33be 81b7dd38) 
Device Object list:
81b7a7b0 81b7a030 81bc4030 
 
DriverEntry: f99d38ab    disk!GsDriverEntry
DriverStartIo: 00000000    
DriverUnload: f99e353a    CLASSPNP!ClassUnload
AddDevice: f99e4ec0    CLASSPNP!ClassAddDevice
 
Dispatch routines:
[00] IRP_MJ_CREATE f9785cd6    Shield+0x3cd6
[01] IRP_MJ_CREATE_NAMED_PIPE f9785cd6    Shield+0x3cd6
[02] IRP_MJ_CLOSE f9785cd6    Shield+0x3cd6
[03] IRP_MJ_READ f9785cd6    Shield+0x3cd6
[04] IRP_MJ_WRITE f9785cd6    Shield+0x3cd6
[05] IRP_MJ_QUERY_INFORMATION f9785cd6    Shield+0x3cd6
[06] IRP_MJ_SET_INFORMATION f9785cd6    Shield+0x3cd6
[07] IRP_MJ_QUERY_EA f9785cd6    Shield+0x3cd6
[08] IRP_MJ_SET_EA f9785cd6    Shield+0x3cd6
[09] IRP_MJ_FLUSH_BUFFERS f9785cd6    Shield+0x3cd6
[0a] IRP_MJ_QUERY_VOLUME_INFORMATION f9785cd6    Shield+0x3cd6
[0b] IRP_MJ_SET_VOLUME_INFORMATION f9785cd6    Shield+0x3cd6
[0c] IRP_MJ_DIRECTORY_CONTROL f9785cd6    Shield+0x3cd6
[0d] IRP_MJ_FILE_SYSTEM_CONTROL f9785cd6    Shield+0x3cd6
[0e] IRP_MJ_DEVICE_CONTROL f9785cd6    Shield+0x3cd6
[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL f9785cd6    Shield+0x3cd6
[10] IRP_MJ_SHUTDOWN f9785cd6    Shield+0x3cd6
[11] IRP_MJ_LOCK_CONTROL f9785cd6    Shield+0x3cd6
[12] IRP_MJ_CLEANUP f9785cd6    Shield+0x3cd6
[13] IRP_MJ_CREATE_MAILSLOT f9785cd6    Shield+0x3cd6
[14] IRP_MJ_QUERY_SECURITY f9785cd6    Shield+0x3cd6
[15] IRP_MJ_SET_SECURITY f9785cd6    Shield+0x3cd6
[16] IRP_MJ_POWER f9785cd6    Shield+0x3cd6
[17] IRP_MJ_SYSTEM_CONTROL f9785cd6    Shield+0x3cd6
[18] IRP_MJ_DEVICE_CHANGE f9785cd6    Shield+0x3cd6
[19] IRP_MJ_QUERY_QUOTA f9785cd6    Shield+0x3cd6
[1a] IRP_MJ_SET_QUOTA f9785cd6    Shield+0x3cd6
[1b] IRP_MJ_PNP f99e2d15    CLASSPNP!ClassDispatchPnp
 
而原始的地址函数名如下:
Dispatch routines:
[00] IRP_MJ_CREATE f7668c30    CLASSPNP!ClassCreateClose
[01] IRP_MJ_CREATE_NAMED_PIPE 804f5282    nt!IopInvalidDeviceRequest
[02] IRP_MJ_CLOSE f7668c30    CLASSPNP!ClassCreateClose
[03] IRP_MJ_READ f7662d9b    CLASSPNP!ClassReadWrite
[04] IRP_MJ_WRITE f7662d9b    CLASSPNP!ClassReadWrite //
[05] IRP_MJ_QUERY_INFORMATION 804f5282    nt!IopInvalidDeviceRequest
[06] IRP_MJ_SET_INFORMATION 804f5282    nt!IopInvalidDeviceRequest
[07] IRP_MJ_QUERY_EA 804f5282    nt!IopInvalidDeviceRequest
[08] IRP_MJ_SET_EA 804f5282    nt!IopInvalidDeviceRequest
[09] IRP_MJ_FLUSH_BUFFERS f7663366    CLASSPNP!ClassShutdownFlush
[0a] IRP_MJ_QUERY_VOLUME_INFORMATION 804f5282    nt!IopInvalidDeviceRequest
[0b] IRP_MJ_SET_VOLUME_INFORMATION 804f5282    nt!IopInvalidDeviceRequest
[0c] IRP_MJ_DIRECTORY_CONTROL 804f5282    nt!IopInvalidDeviceRequest
[0d] IRP_MJ_FILE_SYSTEM_CONTROL 804f5282    nt!IopInvalidDeviceRequest
[0e] IRP_MJ_DEVICE_CONTROL f766344d    CLASSPNP!ClassDeviceControlDispatch
[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL f7666fc3    CLASSPNP!ClassInternalIoControl     //    
[10] IRP_MJ_SHUTDOWN f7663366    CLASSPNP!ClassShutdownFlush
[11] IRP_MJ_LOCK_CONTROL 804f5282    nt!IopInvalidDeviceRequest
[12] IRP_MJ_CLEANUP 804f5282    nt!IopInvalidDeviceRequest
[13] IRP_MJ_CREATE_MAILSLOT 804f5282    nt!IopInvalidDeviceRequest
[14] IRP_MJ_QUERY_SECURITY 804f5282    nt!IopInvalidDeviceRequest
[15] IRP_MJ_SET_SECURITY 804f5282    nt!IopInvalidDeviceRequest
[16] IRP_MJ_POWER f7664ef3    CLASSPNP!ClassDispatchPower
[17] IRP_MJ_SYSTEM_CONTROL f7669a24    CLASSPNP!ClassSystemControl
[18] IRP_MJ_DEVICE_CHANGE 804f5282    nt!IopInvalidDeviceRequest
[19] IRP_MJ_QUERY_QUOTA 804f5282    nt!IopInvalidDeviceRequest
[1a] IRP_MJ_SET_QUOTA 804f5282    nt!IopInvalidDeviceRequest
[1b] IRP_MJ_PNP f7668d15    CLASSPNP!ClassDispatchPnp
 
现在在调试器中手工修改函数地址:
kd> ln CLASSPNP!ClassInternalIoControl
(f99e0fc3) CLASSPNP!ClassInternalIoControl | (f99e0fc3) CLASSPNP!ClassInternalIoControl
Exact matches:
CLASSPNP!ClassInternalIoControl = <no type information>
kd> ed 81b7dfac f99e0fc3
kd> !drvobj /driver/disk 3
Driver object (81b7df38) is for:
/Driver/Disk
Driver Extension List: (id , addr)
(f99e33be 81b7dd38) 
Device Object list:
81b7a7b0 81b7a030 81bc4030 
 
DriverEntry: f99d38ab    disk!GsDriverEntry
DriverStartIo: 00000000    
DriverUnload: f99e353a    CLASSPNP!ClassUnload
AddDevice: f99e4ec0    CLASSPNP!ClassAddDevice
 
Dispatch routines:
[00] IRP_MJ_CREATE f9785cd6    Shield+0x3cd6
[01] IRP_MJ_CREATE_NAMED_PIPE f9785cd6    Shield+0x3cd6
[02] IRP_MJ_CLOSE f9785cd6    Shield+0x3cd6
[03] IRP_MJ_READ f9785cd6    Shield+0x3cd6
[04] IRP_MJ_WRITE f9785cd6    Shield+0x3cd6
[05] IRP_MJ_QUERY_INFORMATION f9785cd6    Shield+0x3cd6
[06] IRP_MJ_SET_INFORMATION f9785cd6    Shield+0x3cd6
[07] IRP_MJ_QUERY_EA f9785cd6    Shield+0x3cd6
[08] IRP_MJ_SET_EA f9785cd6    Shield+0x3cd6
[09] IRP_MJ_FLUSH_BUFFERS f9785cd6    Shield+0x3cd6
[0a] IRP_MJ_QUERY_VOLUME_INFORMATION f9785cd6    Shield+0x3cd6
[0b] IRP_MJ_SET_VOLUME_INFORMATION f9785cd6    Shield+0x3cd6
[0c] IRP_MJ_DIRECTORY_CONTROL f9785cd6    Shield+0x3cd6
[0d] IRP_MJ_FILE_SYSTEM_CONTROL f9785cd6    Shield+0x3cd6
[0e] IRP_MJ_DEVICE_CONTROL f9785cd6    Shield+0x3cd6
[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL f99e0fc3    CLASSPNP!ClassInternalIoControl // 更改后
[10] IRP_MJ_SHUTDOWN f9785cd6    Shield+0x3cd6
[11] IRP_MJ_LOCK_CONTROL f9785cd6    Shield+0x3cd6
[12] IRP_MJ_CLEANUP f9785cd6    Shield+0x3cd6
[13] IRP_MJ_CREATE_MAILSLOT f9785cd6    Shield+0x3cd6
[14] IRP_MJ_QUERY_SECURITY f9785cd6    Shield+0x3cd6
[15] IRP_MJ_SET_SECURITY f9785cd6    Shield+0x3cd6
[16] IRP_MJ_POWER f9785cd6    Shield+0x3cd6
[17] IRP_MJ_SYSTEM_CONTROL f9785cd6    Shield+0x3cd6
[18] IRP_MJ_DEVICE_CHANGE f9785cd6    Shield+0x3cd6
[19] IRP_MJ_QUERY_QUOTA f9785cd6    Shield+0x3cd6
[1a] IRP_MJ_SET_QUOTA f9785cd6    Shield+0x3cd6
[1b] IRP_MJ_PNP f99e2d15    CLASSPNP!ClassDispatchPnp
 
然后下断点观察:
kd> ba w 4 81b7dfac 
kd> bl
0 e 81b7dfac w 4 0001 (0001) 
kd> g
Breakpoint 0 hit
Shdbus+0x56e:
f9ea056e a1200eeaf9 mov eax,dword ptr [Shdbus+0xe20 (f9ea0e20)]
 
kd> kvn
# ChildEBP RetAddr Args to Child
00 f9e2fb3c 804eedf9 81b7d8b8 81b7c828 81731530 Shdbus+0x56e
01 f9e2fb4c f99dd061 81bc5000 81439500 81731530 nt!IopfCallDriver+0x31 
02 81b7d8b8 00000000 81b7f888 81bd6040 81bc4030 CLASSPNP!SubmitTransferPacket+0x82
 
kd> !thread
THREAD 81bc4da8 Cid 0004.006c Teb: 00000000 Win32Thread: 00000000 RUNNING on processor 0
Not impersonating
DeviceMap e1006008
Owning Process 81bbd7c0 Image: System
Wait Start TickCount 18821 Ticks: 3 (0:00:00:00.046)
Context Switch Count 12678 
UserTime 00:00:00.000
KernelTime 00:00:02.281
Start Address Shield (0xf9782886)
Stack Init f9e30000 Current f9e2fd38 Base f9e30000 Limit f9e2d000 Call 0
Priority 16 BasePriority 8 PriorityDecrement 0 DecrementCount 0
ChildEBP RetAddr Args to Child
f9e2fb3c 804eedf9 81b7d8b8 81b7c828 81731530 Shdbus+0x56e
f9e2fb4c f99dd061 81bc5000 81439500 81731530 nt!IopfCallDriver+0x31 (FPO: [0,0,0])
81b7d8b8 00000000 81b7f888 81bd6040 81bc4030 CLASSPNP!SubmitTransferPacket+0x82 (FPO: [Non-Fpo])
 
IDA打开雨过天晴的boot0驱动shdbus.sys,定位到+0x1056e处,位于分发函数IrpInternalDeviceControl内,代码如下:
名称:  1.jpg
查看次数: 1181
文件大小:  57.3 KB
 

代码:
NTSTATUS IrpInternalDeviceControl(int DeviceObject, PIRP Irp)
{
  int DeviceExtension, srb, atapi_driver_object, disk_driver_object, srb_cdb, IoControlCode ;  
  HANDLE CurrentTID;   
  struct _IRP::$::$::$::$A02EC6A2CE86544F716F4825015773AC::_IO_STACK_LOCATION *CurrentStackLocation; 
  char OperationCode;  
 
  DeviceExtension = *(DWORD *)(DeviceObject + 0x28);
  CurrentTID = PsGetCurrentThreadId();
  PsGetCurrentProcessId();
  srb = 0;
  if ( g_disk_internal_device_control_dispatch )
  {
    disk_driver_object = *(DWORD *)(g_disk_device_object + 8);
    if ( *(DWORD *)(disk_driver_object + 0x74) != g_disk_internal_device_control_dispatch
      || *(DWORD *)(disk_driver_object + 0x48) != g_disk_internal_device_control_dispatch 
       )
    {// 
     // #define IRP_MJ_INTERNAL_DEVICE_CONTROL    0x0f
     // #define IRP_MJ_SCSI                       0x0f
     // 雨过天晴会不断检查自己的HOOK点,并恢复之.若2个程序同时在同一点
     // 循环检查并恢复自己的钩子,会导致系统启动后及其缓慢. 而且"雨过天晴"会结束
     // 掉与其竞争的系统线程,导致系统出现异常错误.BSOD.
     // 
      *(DWORD *)(disk_driver_object + 0x74) = g_disk_internal_device_control_dispatch;
      *(DWORD *)(disk_driver_object + 0x48) = g_disk_internal_device_control_dispatch;
 
// disk分发例程往下发的时候,起扩展设备偏移+0x008的地方是atapi.sys的设备对象,"雨过天晴"在此进行验证.
      if ( *(DWORD *)(DeviceExtension + 8) == g_atapi_device_object )
      {
        if ( g_allowed_TID_1_0000006c
          && CurrentTID != *(HANDLE *)g_allowed_TID_1_0000006c
          && g_allowed_TID_2_ffffffff
          && CurrentTID != *(HANDLE *)g_allowed_TID_2_ffffffff
          && g_allowed_TID_3_00000070
          && CurrentTID != *(HANDLE *)g_allowed_TID_3_00000070
          && g_allowed_TID_4_00000240
          && CurrentTID != *(HANDLE *)g_allowed_TID_4_00000240 )
        {
// 不是以上4个系统线程,便会被"雨过"结束掉,并且阻止当前IRP的下发.于是就BSOD了.
          ZwTerminateProcess((HANDLE)0xFFFFFFFF, 0);            
denny:
          Irp->IoStatus.Status = 0;
          IofCompleteRequest(Irp, 0);
          return 0;
        }
      }
    }
    atapi_driver_object = *(DWORD *)(g_atapi_device_object + 8);
if ( *(DWORD *)(atapi_driver_object + 0x74) != (DWORD)atapi_Proxy_dispatch ) // 在此处恢复对atapi.sys分发例程的HOOK
      memset((void *)(atapi_driver_object + 0x38), (int)atapi_Proxy_dispatch, 0x6Cu);
  }
 
  CurrentStackLocation = Irp->Tail.Overlay.CurrentStackLocation;
  IoControlCode = *((DWORD *)CurrentStackLocation + 3);
  srb_cdb = 0;
  if ( IoControlCode == 0x1B0012 || IoControlCode == 0x1B0011 )
  {
    srb = *((DWORD *)CurrentStackLocation + 1);
    srb_cdb = srb + 0x30;
  }
  if ( *(DWORD *)(DeviceExtension + 8) == g_atapi_device_object )
  {
    if ( g_allowed_TID_1_0000006c )
    {
      if ( CurrentTID != *(HANDLE *)g_allowed_TID_1_0000006c )
      {
        if ( !g_allowed_TID_2_ffffffff || CurrentTID != *(HANDLE *)g_allowed_TID_2_ffffffff )
        {
          if ( !g_allowed_TID_3_00000070 || CurrentTID != *(HANDLE *)g_allowed_TID_3_00000070 )
          {
            if ( !g_allowed_TID_4_00000240 || CurrentTID != *(HANDLE *)g_allowed_TID_4_00000240 )
            {
              if ( srb )
              {
                if ( !*(BYTE *)(srb + 2) )
                {
                  if ( srb_cdb )
                  {
                    OperationCode = *(BYTE *)srb_cdb;
                    if ( *(BYTE *)srb_cdb == SCSIOP_WRITE
                      || OperationCode == SCSIOP_SEND
                      || OperationCode == SCSIOP_FLUSH_BUFFER
                      || OperationCode == SCSIOP_WRITE_VERIFY
                      || OperationCode == SCSIOP_READ
                      || OperationCode == SCSIOP_RECEIVE )
                      goto denny;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
 
  return IrpReadWrite_dep(DeviceObject, Irp);
}

 
(1) 现在调试器中将jnz 改成 Jmp, 即 0F 84 à 90 E9
名称:  1.GIF
查看次数: 1177
文件大小:  14.4 KB
 
(2) 经过初步分析,雨过天晴大致在Disk.sys和Atapi.sys层做了过滤,为了验证这一想法,我恢复掉其钩子后,自己写程序不经过文件系统层,构建IRP发到DR0上读取MBR,看是否成功.现要恢复Disk.sys的IRP_MJ_READ & IRP_MJ_INTERNAL_DEVICE_CONTROL例程 和 Atapi.sys的IRP_MJ_INTERNAL_DEVICE_CONTROL例程:
 
(因为我的程序是自己构建IRP,填充0xf号控制码,即isl->MajorFunction =   IRP_MJ_SCSI,然后发送到DR0设备上, 那么IRP往下走的过程中就会调用DR0对应的驱动对象的分发例程,也就是Disk.sys的0xf号分发例程,而非IRP_MJ_READ,所以根据我的程序特性,应该恢复Disk.sys的IRP_MJ_INTERNAL_DEVICE_CONTROL历程)
 
kd> ln CLASSPNP!ClassInternalIoControl
(f99e0fc3)   CLASSPNP!ClassInternalIoControl   |  (f99e0fc3)   CLASSPNP!ClassInternalIoControl
Exact matches:
CLASSPNP!ClassInternalIoControl = <no type information>
 
kd> ln CLASSPNP!ClassReadWrite
(f99dcd9b)   CLASSPNP!ClassReadWrite   |  (f99dcd9b)   CLASSPNP!ClassReadWrite
Exact matches:
    CLASSPNP!ClassReadWrite = <no type information>
kd> ed 81b7df38+0x38+0x3c f99e0fc3
kd> ed 81b7df38+0x38+0xc f99dcd9b
kd> !drvobj /driver/disk 3
…
Dispatch routines:
[00] IRP_MJ_CREATE                      f9785cd6      Shield+0x3cd6
[01] IRP_MJ_CREATE_NAMED_PIPE           f9785cd6 Shield+0x3cd6
[02] IRP_MJ_CLOSE                       f9785cd6      Shield+0x3cd6
[03] IRP_MJ_READ                        f99dcd9b    CLASSPNP!ClassReadWrite
[04] IRP_MJ_WRITE                       f9785cd6      Shield+0x3cd6
…
[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL     f99e0fc3       CLASSPNP!ClassInternalIoControl
…
 
原始的Atapi.sys的分发例程如下:
Dispatch routines:
[00] IRP_MJ_CREATE                      bae6d572      atapi!IdePortAlwaysStatusSuccessIrp
[01] IRP_MJ_CREATE_NAMED_PIPE           804f5282 nt!IopInvalidDeviceRequest
[02] IRP_MJ_CLOSE                       bae6d572      atapi!IdePortAlwaysStatusSuccessIrp
[03] IRP_MJ_READ                        804f5282      nt!IopInvalidDeviceRequest
[04] IRP_MJ_WRITE                       804f5282      nt!IopInvalidDeviceRequest
[05] IRP_MJ_QUERY_INFORMATION           804f5282 nt!IopInvalidDeviceRequest
[06] IRP_MJ_SET_INFORMATION             804f5282   nt!IopInvalidDeviceRequest
[07] IRP_MJ_QUERY_EA                    804f5282    nt!IopInvalidDeviceRequest
[08] IRP_MJ_SET_EA                      804f5282      nt!IopInvalidDeviceRequest
[09] IRP_MJ_FLUSH_BUFFERS               804f5282   nt!IopInvalidDeviceRequest
[0a] IRP_MJ_QUERY_VOLUME_INFORMATION    804f5282    nt!IopInvalidDeviceRequest
[0b] IRP_MJ_SET_VOLUME_INFORMATION      804f5282     nt!IopInvalidDeviceRequest
[0c] IRP_MJ_DIRECTORY_CONTROL           804f5282 nt!IopInvalidDeviceRequest
[0d] IRP_MJ_FILE_SYSTEM_CONTROL         804f5282 nt!IopInvalidDeviceRequest
[0e] IRP_MJ_DEVICE_CONTROL              bae6d592  atapi!IdePortDispatchDeviceControl
[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL     bae697b4      atapi!IdePortDispatch
[10] IRP_MJ_SHUTDOWN                    804f5282  nt!IopInvalidDeviceRequest
[11] IRP_MJ_LOCK_CONTROL                804f5282   nt!IopInvalidDeviceRequest
[12] IRP_MJ_CLEANUP                     804f5282     nt!IopInvalidDeviceRequest
[13] IRP_MJ_CREATE_MAILSLOT             804f5282  nt!IopInvalidDeviceRequest
[14] IRP_MJ_QUERY_SECURITY              804f5282  nt!IopInvalidDeviceRequest
[15] IRP_MJ_SET_SECURITY                804f5282    nt!IopInvalidDeviceRequest
[16] IRP_MJ_POWER                       bae6d5bc     atapi!IdePortDispatchPower
[17] IRP_MJ_SYSTEM_CONTROL              bae74164 atapi!IdePortDispatchSystemControl
[18] IRP_MJ_DEVICE_CHANGE               804f5282  nt!IopInvalidDeviceRequest
[19] IRP_MJ_QUERY_QUOTA                 804f5282  nt!IopInvalidDeviceRequest
[1a] IRP_MJ_SET_QUOTA                   804f5282     nt!IopInvalidDeviceRequest
[1b] IRP_MJ_PNP                         bae74130       atapi!IdePortDispatchPnp
 
kd> ln atapi!IdePortDispatch
(f97d87b4)   atapi!IdePortDispatch   |  (f97d8ccc)   atapi!IdePortTickHandler
Exact matches:
    atapi!IdePortDispatch = <no type information>
kd> ed 81b87b30+0x38+0x3c f97d87b4
kd> !drvobj /driver/atapi 3
Driver object (81b87b30) is for:
 /Driver/atapi
Driver Extension List: (id , addr)
(f97e68d8 81bef140)  
Device Object list:
81b7e030  81b872f8  81b85030  81b86030
DriverEntry:   f97e75f7      atapi!GsDriverEntry
DriverStartIo: f97d97c6 atapi!IdePortStartIo
DriverUnload:  f97e3204     atapi!IdePortUnload
AddDevice:     f97e1300   atapi!ChannelAddDevice
 
Dispatch routines:
[00] IRP_MJ_CREATE                      f97dc572      atapi!IdePortAlwaysStatusSuccessIrp
[01] IRP_MJ_CREATE_NAMED_PIPE        f9ea0c14       Shdbus+0xc14
[02] IRP_MJ_CLOSE                       f9ea0c14       Shdbus+0xc14
[03] IRP_MJ_READ                        f9ea0c14      Shdbus+0xc14
[04] IRP_MJ_WRITE                       f9ea0c14       Shdbus+0xc14
[05] IRP_MJ_QUERY_INFORMATION        f9ea0c14       Shdbus+0xc14
[06] IRP_MJ_SET_INFORMATION           f9ea0c14       Shdbus+0xc14
[07] IRP_MJ_QUERY_EA                   f9ea0c14       Shdbus+0xc14
[08] IRP_MJ_SET_EA                      f9ea0c14       Shdbus+0xc14
[09] IRP_MJ_FLUSH_BUFFERS             f9ea0c14       Shdbus+0xc14
[0a] IRP_MJ_QUERY_VOLUME_INFORMATION   f9ea0c14      Shdbus+0xc14
[0b] IRP_MJ_SET_VOLUME_INFORMATION      f9ea0c14      Shdbus+0xc14
[0c] IRP_MJ_DIRECTORY_CONTROL             f9ea0c14     Shdbus+0xc14
[0d] IRP_MJ_FILE_SYSTEM_CONTROL           f9ea0c14     Shdbus+0xc14
[0e] IRP_MJ_DEVICE_CONTROL                 f9ea0c14     Shdbus+0xc14
[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL    f97d87b4    atapi!IdePortDispatch
[10] IRP_MJ_SHUTDOWN                       f9ea0c14     Shdbus+0xc14
[11] IRP_MJ_LOCK_CONTROL                   f9ea0c14     Shdbus+0xc14
[12] IRP_MJ_CLEANUP                         f9ea0c14     Shdbus+0xc14
[13] IRP_MJ_CREATE_MAILSLOT               f9ea0c14       Shdbus+0xc14
[14] IRP_MJ_QUERY_SECURITY                f9ea0c14       Shdbus+0xc14
[15] IRP_MJ_SET_SECURITY                   f9ea0c14       Shdbus+0xc14
[16] IRP_MJ_POWER                          f9ea0c14       Shdbus+0xc14
[17] IRP_MJ_SYSTEM_CONTROL               f9ea0c14       Shdbus+0xc14
[18] IRP_MJ_DEVICE_CHANGE                f9ea0c14 Shdbus+0xc14
[19] IRP_MJ_QUERY_QUOTA                  f9ea0c14 Shdbus+0xc14
[1a] IRP_MJ_SET_QUOTA                     f9ea0c14  Shdbus+0xc14
[1b] IRP_MJ_PNP                             f9ea0c14 Shdbus+0xc14
 
(3) 经过以下3步终于成功.
步骤一: 废掉ygtq对disk & atapi分发例程的循环保护
步骤二: 恢复disk.sys 和atapi.sys的0xf号分发例程
步骤三: 自己构建IRP,发送到DR0设备对象上,获取MBR
名称:  2.jpg
查看次数: 1186
文件大小:  94.9 KB
 
kd> !devstack 0x81b874e0 
  !DevObj   !DrvObj            !DevExt   ObjectName
  81bc4918  /Driver/PartMgr    81bc49d0  
  81b7d878  /Driver/Shield     81b7d930           // ß 注意这里,雨过天晴在Shildf.sys中循环恢复这个Attach在DR0上的过滤设备,
                                                                              // 用Winhex读MBR时,到这里就被重定向了.
  81bc4030  /Driver/Disk       81bc40e8  DR0  // ß 我的IRP发到此处,终于可以读到原始的MBR了
                                                                              // 若不恢复Disk.sys的0xf号分发例程,就会被ygtq拒绝掉,使得我构建的IRP完全失效,
                                                                              // 读到的MBR内容为空.见下图
  81b7d9b0  /Driver/Shdbus     81b7da68       
> 81b874e0  /Driver/atapi      81b87598  IdeDeviceP0T0L0-3
!DevNode 81b85ee8 :
  DeviceInst is "IDE/DiskVMware_Virtual_IDE_Hard_Drive___________00000001/3030303030303030303030303030303030303130"
  ServiceName is "disk"
 名称:  3.jpg
查看次数: 1180
文件大小:  44.5 KB
名称:  4.GIF
查看次数: 1180
文件大小:  8.1 KB
名称:  5.jpg
查看次数: 1181
文件大小:  87.9 KB
 
但是,这仅仅是开始,因为我们的目的是用Winhex克隆安装有”雨过天晴”(非过期; 因为过期后系统不走ygtq的MBR了)的整个系统,以便用Bochs动态调试含有雨过天晴系统的MBR.但Winhex用标准的ReadFile & WriteFile 函数来读写扇区,被ygtq在文件系统层面拦截了.
我用XueTr.exe摘掉雨过天晴的文件过滤设备(ygtq没有对其进行循环恢复),但是其附着在DR0上的过滤设备无法摘除(ygtq开了线程循环恢复),所以当我用Winhex读取MBR时,到/Driver/Shield这层就被重定向了. 
 
现在要做的工作是 找到并废除ygtq的那个循环恢复的线程,删除DR0上的Shield设备,然后就可以用Winhex克隆磁盘了.
 
kd> !object /driver/disk
Object: 81b7e360  Type: (81ba9900) Driver
    ObjectHeader: 81b7e348 (old version)
    HandleCount: 0  PointerCount: 5
    Directory Object: e12bbd10  Name: Disk
kd> dt nt!_device_object 81bc4030  
nt!_DEVICE_OBJECT
   +0x000 Type             : 3
   +0x002 Size             : 0x518
   +0x004 ReferenceCount   : 0
   +0x008 DriverObject     : 0x81b7e360 _DRIVER_OBJECT
   +0x00c NextDevice       : (null) 
   +0x010 AttachedDevice   : 0x81b7d878 _DEVICE_OBJECT
 
kd> !devstack 0x81b7d878 
  !DevObj   !DrvObj            !DevExt   ObjectName
  81bc4918  /Driver/PartMgr    81bc49d0  
> 81b7d878  /Driver/Shield     81b7d930  
  81bc4030  /Driver/Disk       81bc40e8  DR0
  81b7d9b0  /Driver/Shdbus     81b7da68  
  81b874e0  /Driver/atapi      81b87598  IdeDeviceP0T0L0-3
!DevNode 81b85ee8 :
  DeviceInst is "IDE/DiskVMware_Virtual_IDE_Hard_Drive___________00000001/3030303030303030303030303030303030303130"
  ServiceName is "disk"
kd> ba w 4 81bc4030+0x010  // 下硬件断点,然后用XueTr.exe删除这个设备,观察雨过天晴的线程是如何循环恢复的.
kd> bl
 0 e f93f1660     0001 (0001) srb!Scsi_read_file_by_sector
 1 e f93f14de     0001 (0001) srb!AtapiReadWriteDisk+0x2fe
 2 e 81bc4040 w 4 0001 (0001) 
 
kd> g            
Breakpoint 2 hit                   // 第一次断住,是因为我用XueTr.exe删除了这个设备,属于写操作
*** ERROR: Module load completed but symbols could not be loaded for XueTr.sys
XueTr+0x2b21:
f72c9b21 b301            mov     bl,1
kd> !thread
THREAD 81402020  Cid 034c.04a4  Teb: 7ffdd000 Win32Thread: e129ed00 RUNNING on processor 0
IRP List:
    814032a8: (0006,0094) Flags: 00000070  Mdl: 00000000
Not impersonating
DeviceMap                 e1859328
Owning Process            813f1020       Image:         XueTr.exe
Wait Start TickCount      106353         Ticks: 0
Context Switch Count      3482                 LargeStack
UserTime                  00:00:00.875
KernelTime                00:00:01.921
Win32 Start Address 0x00446e16
Start Address 0x7c810867
Stack Init f9460000 Current f945fcb8 Base f9460000 Limit f945a000 Call 0
Priority 10 BasePriority 8 PriorityDecrement 0 DecrementCount 16
ChildEBP RetAddr  Args to Child              
WARNING: Stack unwind information not available. Following frames may be wrong.
f945fbac f72ca325 81b7d878 0012da20 81725828 XueTr+0x2b21
f945fbec f72fe0c0 0012da20 00000008 00000000 XueTr+0x3325
f945fc34 804eedf9 81475978 814032a8 806d12d0 XueTr+0x370c0
f945fc44 80574b42 81403318 8166b660 814032a8 nt!IopfCallDriver+0x31 (FPO: [0,0,0])
f945fc58 805759d1 81475978 814032a8 8166b660 nt!IopSynchronousServiceTail+0x60 (FPO: [Non-Fpo])
f945fd00 8056e33c 00000138 00000000 00000000 nt!IopXxxControlFile+0x5e7 (FPO: [Non-Fpo])
f945fd34 8053d808 00000138 00000000 00000000 nt!NtDeviceIoControlFile+0x2a (FPO: [Non-Fpo])
f945fd34 7c92eb94 00000138 00000000 00000000 nt!KiFastCallEntry+0xf8 (FPO: [0,0] TrapFrame @ f945fd64)
0012d96c 7c92d8ef 7c801671 00000138 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
0012d970 7c801671 00000138 00000000 00000000 ntdll!ZwDeviceIoControlFile+0xc (FPO: [10,0,0])
0012d9d0 00414d7f 00000138 006e0160 0012da28 0x7c801671
0012d9d4 00000000 006e0160 0012da28 00000018 0x414d7f
 
kd> g
Breakpoint 2 hit                   // 过了大概半秒钟,系统被Windbg第二次断住,为雨过天晴的行为.观察之.
*** ERROR: Module load completed but symbols could not be loaded for Shieldf.sys
Shieldf+0x3b4:
f9c2c3b4 c9              leave
kd> !thread
THREAD 8143b520  Cid 06ec.06f0  Teb: 7ffdf000 Win32Thread: e1abc730 RUNNING on processor 0
IRP List:
    814da538: (0006,01d8) Flags: 00000884  Mdl: 00000000
Not impersonating
DeviceMap                 e1859328
Owning Process            8143b798       Image:         shieldtray.exe
Wait Start TickCount      107179         Ticks: 0
Context Switch Count      352                 LargeStack
UserTime                  00:00:00.015
KernelTime                00:00:00.140
Win32 Start Address shieldtray (0x0044a981)
Start Address kernel32!BaseProcessStartThunk (0x7c810867)
Stack Init f7ada000 Current f7ad9968 Base f7ada000 Limit f7ad7000 Call 0
Priority 8 BasePriority 8 PriorityDecrement 0 DecrementCount 0
ChildEBP RetAddr  Args to Child              
WARNING: Stack unwind information not available. Following frames may be wrong.
f7ad99fc f9c2da17 814da548 814da538 805452fe Shieldf+0x3b4
f7ad9a4c f9c2de7b 814cf368 814da548 81bd3030 Shieldf+0x1a17
f7ad9b50 805b465e 81b79a20 00000000 816f4228 Shieldf+0x1e7b       // 雨过天晴的文件过滤驱动
f7ad9bd8 805b0b3f 00000000 f7ad9c18 00000040 nt!ObpLookupObjectName+0x56a (FPO: [Non-Fpo])
f7ad9c2c 8056b133 00000000 00000000 4b31f001 nt!ObOpenObjectByName+0xeb (FPO: [Non-Fpo])
f7ad9ca8 8056baaa 0012fc04 00100001 0012fbd0 nt!IopCreateFile+0x407 (FPO: [Non-Fpo])
f7ad9d04 8056f291 0012fc04 00100001 0012fbd0 nt!IoCreateFile+0x8e (FPO: [Non-Fpo])
f7ad9d44 8053d808 0012fc04 00100001 0012fbd0 nt!NtOpenFile+0x27 (FPO: [Non-Fpo])
f7ad9d44 7c92eb94 0012fc04 00100001 0012fbd0 nt!KiFastCallEntry+0xf8 (FPO: [0,0] TrapFrame @ f7ad9d64)
0012fb80 7c92dd09 7c81e74a 0012fc04 00100001 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
0012fb84 7c81e74a 0012fc04 00100001 0012fbd0 ntdll!NtOpenFile+0xc (FPO: [6,0,0])
0012fbfc 7c82744d 00000000 0012fc34 0012fc3c kernel32!GetDiskFreeSpaceExW+0x7d (FPO: [Non-Fpo])
0012fc14 0042cbe8 0012fc74 0012fc34 0012fc3c kernel32!GetDiskFreeSpaceExA+0x2f (FPO: [Non-Fpo])
0012fc40 0041180e 0012fc74 0012fc80 0012fc84 shieldtray+0x2cbe8
00000000 00000000 00000000 00000000 00000000 shieldtray+0x1180e
 
打开IDA,载入Shiedlf.sys,定位到0x103b4处,即可看出其具体的流程:
名称:  6.jpg
查看次数: 1186
文件大小:  107.4 KB
于是在Windbg中,强行将其改成如下图所示的代码:
名称:  7.GIF
查看次数: 1176
文件大小:  19.9 KB
此时再用XueTr.exe删除雨过天晴的设备,调用Winhex成功读取到更改后的MBR.
名称:  8.jpg
查看次数: 1178
文件大小:  41.3 KB
名称:  9.jpg
查看次数: 1182
文件大小:  132.9 KB
 
若我们不做这些更改,用Winhex得到的内容如下:
名称:  10.GIF
查看次数: 1168
文件大小:  26.9 KB
现在开启Bochs,即可调试雨过天晴的启动代码了.结合IDA静态看,很容易了解它的MBR所做的工作.通过这次调试跟踪,对自己是个小小的锻炼.其实用调试器改还不如写个驱动来的容易,不过最终目的达到了, 嘿嘿. 接下来我准备写个驱动,一劳永逸….
点击图片以查看大图

名称:	Effect.jpg
查看次数:	26
文件大小:	70.5 KB
ID:	31906
 
此实例旨在告诉大家遇到问题如何一步一步跟踪解决,灵活变通,重在积累调试经验!

雨过天晴节点恢复软件:数据恢复解决方案 本文还有配套的精品资源,点击获取 简介:雨过天晴节点恢复软件是一款专为数据恢复设计的工具,旨在帮助用户找回因系统故障、误操作、硬件问题等原因丢失的非系统盘文件和分区。软件利用文件系统中标记为可重用空间的特性,通过扫描硬盘数据块重建文件结构来实现数据恢复。它包含快照扫描组件、磁盘挂载工具,并支持多语言,便于不同地区用户使用。正确使用软件,如停止写入操作、创建备份、选择安全的保... 阅读详情

相关推荐

雨过天晴绝对可用专业破解版版 (人品保证)

雨过天晴绝对可用专业破解版版 (人品保证),不会用的可以联系我 QQ 416516601 手把手教你

IRP_MJ_INTERNAL_DEVICE_CONTROL

什么时候发送这个请求: Any time after the successful completion of a create request.(任何时候完成了一个请求的创建) 作用: This I/O control code has been defined for communication between paired and layered kernel-mode drivers, such as one or more class drivers layered over a po.

hutao1101175783的专栏 862

Cursor Cloud Agent:云原生编程工作流的底层重构

编程工作流正从本地计算范式转向云原生执行范式。Cloud Agent 本质是将代码理解、生成、执行与调试等核心能力下沉至隔离、可控、按需分配的云端虚拟机,通过 Firecracker 微虚拟机实现亚秒级启动,并依托上下文快照、环境镜像化和内核级沙箱保障一致性、算力弹性与数据安全。这一范式突破了传统本地 AI 编程助手在环境依赖、调试能力与企业合规上的根本局限,使 IDE 从编辑工具升维为分布式开发指挥中心。本文深入解析其运行机制与工程落地实践。

weixin_34354173的博客 337

windows内核开发学习笔记十八:IRP 处理的标准模式

windows内核开发学习笔记十八:IRP 处理的标准模式 I/O manager ---> Dispatch routine ---> StartIo routine ---> ISR ---> DPC routine ---> I/O manager 5.2.1 建立一个 IRP IRP 的生存期从调用 I/O manager function 建立 IRP 开始,你可以使用下面 4 个 function 来建立一个新的 IRP: (1) IoBuildAsynch..

jyl_sh的专栏 1995

人工智能AI在软件测试和质量效能中的实际应用

人工智能在软件测试中应用,介绍chatGPT在测试中的应用,还有多个AI驱动的测试工具。

lindafang72的博客 1万+

告别外置电阻!揭秘MAX22201集成电流检测的5大设计优势(附PCB布局案例)

本文深入解析MAX22201集成电流检测技术在直流有刷电机驱动中的5大设计优势,包括BOM成本降低、PCB空间优化、动态性能提升等。通过与传统方案(如DRV8871+外置电阻)的实测对比,展示其在高精度电流检测、抗干扰能力和PCB布局简化方面的突破,并附有详细的PCB布局案例和配置指南。

weixin_29189377的博客 244

I/O Request Packet

第5章 I/O Request Packet 5.1 数据结构 在处理 I/O 请求上,有两个重要的数据结构:IRP(I/O request packet)和 IO_STACK_LOCATION 5.1.1 IRP 的结构 下面是在 windbg 里得到的 IRP 结构: nt!_IRP +0x000 Type : Int2B +0x002 Size

zhuo_zhibin的专栏 6094

修改Windows hosts文件的解决方案

本文主要介绍了修改Windows hosts文件解决方案,希望能对新手有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 安装软件 2.2 修改hosts文件

weixin_43178406的博客 1万+

[Win32驱动10] 派遣函数与读写方式

1. 派遣函数 在Windows中,用户态进程的各类IO请求最后都会转化成对应的IRP请求并发送给底层驱动。其流程差不多是这样的,拿WriteFile来举例: 在用户态调用WriteFile函数 WriteFile会调用NTDLL.dll中的NtWriteFile函数 NtWriteFile会陷入内核调用系统服务NtWriteFile(注意只是相同的名字,但本质完全不同) NtWriteFile会生成相应的IRP,对应IRP类型为: IRP_MJ_WRITE并将其发送给底层对应驱动 IRP会顺次

輚至消亡 993

43、FMCW雷达高度计仿真

本文介绍了FMCW雷达高度计的波形级建模与仿真过程,重点模拟了着陆和倾斜两种飞行场景以评估其性能。通过结合高程数据和飞行轨迹构建雷达场景,使用自定义信号处理器分析IQ样本并估计高度。结果表明,该高度计在多数情况下满足性能要求,但也存在误差较大的点,提出了地面检测算法优化的潜在方向。

neovim7hacker的博客 136

基于卷积神经网络的试卷手写分数自动识别系统

本文提出了一种基于卷积神经网络(CNN)的试卷手写分数自动识别系统,旨在解决传统人工录入方式效率低、易出错的问题。系统通过图像预处理、分数区域定位、CNN识别和后处理等模块,实现了对手写数字分数的端到端自动识别。针对试卷复杂背景、书写风格多样等技术挑战,系统采用中等深度的CNN架构,在构建的数据集上取得了99.5%以上的识别准确率。该系统可显著提升教育评估工作的效率和准确性,具有重要的实用价值。

huanghm88的专栏 222

使用雨过天晴还原软件实现系统还原

1.下载雨过天晴一键还原软件并进行解压安装,过程如下: 到此,雨过天晴一键还原软件就安装完成了。 2.对软件进行设置,使得每次重启计算机时系统都会还原到安装软件时的状态: 点击计划任务: 点击增加定时恢复: 设置还原的时间以及还原到哪个时

clouderpig的博客 4268

DeepSeek邮件管理全攻略

DeepSeek邮件助手是一款高效的邮件处理工具,提供智能分类、撰写、回复和任务自动化功能。通过API调用或多智能体系统,它能自动分类邮件意图、生成专业回复并优化邮件内容。核心功能包括智能过滤、会议安排和任务提醒,支持与主流邮箱服务集成。提供精准提示词模板,帮助用户快速生成得体邮件,提升工作效率。适合个人和企业使用,通过简单配置即可实现邮件处理自动化。

Genio_Wang的博客 183

驱动开发学习笔记

1、三种类型的WDM驱动程序   总线驱动程序(bus driver)   功能驱动程序(function driver)   过滤驱动程序(filter driver)2、其他分类方法   类驱动程序(class driver)   端口驱动程序(port driver)   小端口驱动程序(miniort driver)3、驱动对象(DRIVER_OBJECT)主要成员   Devic

迈克揉索芙特 3927

扣子(Coze)搭建智能体完整实战指南 —— 从零基础入门到写小说及其他需求扩展开发

随着大语言模型进入应用爆发期,我们正在经历从“寻找提示词”向“构建智能体”的范式转移。扣子(Coze)作为字节跳动推出的一站式AI智能体开发与运营平台,极大地降低了AI应用开发的门槛,让非技术人员也能快速搭建具备感知、决策、行动能力的智能体。 本文将手把手带你从零开始,在扣子平台上搭建一个功能完备的**小说创作智能体**,并基于此展示如何将同一套架构扩展到其他需求场景。无论你是写作爱好者、内容创作者,还是希望用AI赋能日常工作的职场人士,这套完整的技术方案都将帮助你快速上手。

huanghm88的专栏 638

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

文件系统Minifilter驱动(九)

六、决定一个I/O操作的Buffering方法 与设备驱动一样,文件系统负责在用户模式应用程序和一个系统的设备之间传输数据.操作系统提供了以下三种方法访问数据buffer: · 在buffered I/O方法中,I/O管理器从非分页池中为操作分配一个系统buffer.I/O管理器在发起该I/O操作的上下文中,从这个系统buffer中复制数据到应用程序的user buffer中,反之亦然.

听风 4369

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

IRP派遣操作

IRPTrace工具跟踪IRP 派遣函数(Dispathc Funtion)是windows驱动中的重要概念。驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的。用户模式下所有对驱动程序的I/O请求。全部由操作系统转化为一个叫做IRP的数据结构,不同的IRP数据会派遣到不同的派遣函数中。 IRP(I/O Request Package) 和win...

dengjiatao9832的博客 239

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Windows驱动_文件系统微小过滤驱动之三微小过滤驱动的操作

30岁左右的程序员,现在除了奋斗以外,要开始考虑下自己的身体了,到了这个年纪,不能像之前20岁左右的年轻人一样不顾一切去拼搏。现在的自己,应该更讲究效率。所以选择公司也很重要。同样,运动开始变得必需了,要开始自己的运动计划,其实也是为了自己有更好的本钱去奋斗。去努力,还有一个考虑是这个年龄的程序员,已经不是一个人,正常的情况下,有儿子有老婆了,你的身体就变得更加的重要。所以,我们要爱惜自己的身体,

Z18_28_19的专栏 4907

比较好的电脑系统_开机还原软件哪个比较好用?【软件】

冰点还原带激活码永久激活使用! 我们日常生活中在使用电脑的时候,总是会一不小心遇到各种各样的病毒或者是删除了那些不好的文件导致系统不开机或者打不开、丢失文件等,弄不好就要重装系统,非常的麻烦,很费时费力,有时候我们还需要一台一台的安装还原,非常麻烦,要是在学校很多机器更麻烦还需要一台一台安装,那很耗费时间。 当然还有其他的软件也可以使用。市面上还有一些其...

weixin_39702479的博客 1万+

计算机保护系统软件,雨过天晴电脑保护系统专业版

雨过天晴电脑保护系统是一款强大的电脑系统保护和恢复软件,一种多进度多点还原软件,一种不用预留空间的硬盘保护软件,一种一键恢复软件,一种非备份的立即恢复软件,可以迅速清除电脑中出现的软件故障,恢复电脑正常工作状态。雨过天晴电脑保护系统可以迅速恢复瘫痪的操作系统,可以恢复丢失或损坏的文件,可以保护您的电脑免受病毒的侵害,可以确保您的系统安全。主要功能和技术特色:1.增加排除目录功能,可以方便地设定某些...

weixin_32146783的博客 607

读懂常见IRP:IRP_MJ_CLEANUP/IRP_MJ_CLOSE/IRP_MJ_CREATE

IRP_MJ_CLEANUP保持进程定义上下文信息的驱动器,必须在DispatchCleanup中包含cleanup请求。何时发送: 收到IRP_MJ_CLEANUP意味着请求的目标设备与目标文件的句柄相关(也可能因为io请求后没有释放)入参: 无出参: 无操作: 该IRP在关闭 file object 句柄的进程上下文中发送。因此,驱动器应该释放进程上下文中所指

5764

内核文件管理-IRP(四)文件遍历

本文讲通过向FSD发送IRP_MJ_DIRECTORY_CONTROL消息的IRP,来获取一个目录下的文件信息。 上一篇:内核文件管理-IRP(三)文件读写 IrpQueryDirectoryFile函数参数 该函数与之前的 IrpQueryInformationFile 和 IrpSetInformationFile 类似,仅改变 IRP 和 I/O 堆栈 的设置。 NTSTATUS IrpQueryDirectoryFile( IN PFILE_OBJECT pFileObject, //

m0_48995611的博客 923

汉字转换拼音函数

汉字转换为拼音 调用ConvertPinyin()函数, 参数为你要转换的汉字 返回值就是转换后的拼音 可以只返回首字母或者首字母大写的全拼拼音 var phoneticTranscriptionObj = { "a": "\u554a\u963f\u9515", "ai": "\u57c3\u6328\u54ce\u5509\u54c0\u7691\u764c\u853c\u77...

weixin_34367257的博客 1万+
上一篇: WinXP/2k数字签名状态设置
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值