首页
社区
课程
招聘
[原创]调试笔记之雨过天晴多点还原软件MBR实例
发表于: 2009-9-22 22:49 61331

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

2009-9-22 22:49
61331

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

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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 8
支持
分享
最新回复 (79)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
123456
上传的附件:
2009-9-22 22:57
0
雪    币: 115
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
ding一个
2009-9-22 23:24
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好不懂 膜拜啊啊啊
2009-9-22 23:35
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
太强大了 看不懂啊
2009-9-22 23:55
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
没那么复杂~
根据VMW开放的代码可以直接从VMware的img文件里提取出disk.img来不多说了~
弄这么复杂干啥~

唉~
2009-9-22 23:58
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
太复杂了。。看不懂。
2009-9-23 00:02
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
坐个大沙发,顶sudami
2009-9-23 00:04
0
雪    币: 5
活跃值: (369)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
关注下六楼  等高人
2009-9-23 00:18
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
神奇的楼主...
2009-9-23 01:17
0
雪    币: 337
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
教授就是教授啊,写的东西都那么强
2009-9-23 02:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
知道的太少了
2009-9-23 08:26
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
13
学习下调试倒是可以,不过调试不是软件的核心,创造比复制更重要,调试只是一种辅助,虽然调试很重要,但仅此而已
2009-9-23 08:48
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
14
精神可嘉,要吃鸡蛋,不必从养鸡开始.
直接从虚拟机文件dump出来更省事.
2009-9-23 08:58
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
15
qemu-img.exe convert  c:\.....vmdk   e:\disk.img
2009-9-23 10:02
0
雪    币: 1407
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
膜拜大米
另外学习一下LS的做法
2009-9-23 10:43
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
17
我火星了....
2009-9-23 10:50
0
雪    币: 178
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
图文并貌,很详细,学习了
2009-9-23 11:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
就是太牛了,看不懂啊
2009-9-23 11:33
0
雪    币: 1482
活跃值: (879)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
教授啊~~~~~~~
2009-9-23 13:04
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
21
support!这玩意太高级了,放弃学习
2009-9-23 13:14
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
22
大咪太强大了,无法学习...
2009-9-23 14:26
0
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
23
强啊,收藏一份
2009-9-23 14:29
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
强贴留名,收藏
2009-9-24 11:53
0
雪    币: 768
活跃值: (530)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
25
强悍!!!!
作者收学生不?
2009-9-24 20:02
0
游客
登录 | 注册 方可回帖
返回
//