找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 8837|回复: 6

恢复 shadow ssdt hook

 火.. [复制链接]

40

主题

324

回帖

0

精华

铂金会员

Eax=0

积分
1575
发表于 2011-8-18 15:51:23 | 显示全部楼层 |阅读模式
本帖最后由 Xor 于 2011-8-18 17:48 编辑

代码见4楼。
Do my best.

40

主题

324

回帖

0

精华

铂金会员

Eax=0

积分
1575
 楼主| 发表于 2011-8-18 16:41:20 | 显示全部楼层
本帖最后由 Xor 于 2011-8-18 17:49 编辑

主要问题:如何获取原shadow ssdt地址?问题已解决,代码见http://www.m5home.com/bbs/forum. ... =5836&pid=27959
Do my best.

857

主题

2632

回帖

2

精华

管理员

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

积分
36130
发表于 2011-8-18 16:57:54 | 显示全部楼层
Xor 发表于 2011-8-18 16:41
主要问题:如何获取原shadow ssdt地址?


干嘛要用“赐”,“高抬贵手”,“小弟”之类的词语?
纯爷们为了一份代码用这些词语,值得吗?!
如果你在10年1月之前你这么问,我不怪你;
可是你在10年1月之后你这么问,只能怪你不会用搜索引擎了。。。
去看看PsNull 3的代码(VB写的,本站有下载),您就能得到满意的答案。。。
不过话也说回来,我当年为了解决同样的问题,花钱,求人,也是费了不少周章,才把代码弄到手的。。。

点评

Xor
所以我才用“赐”之类的词语。巧的是,刚发完贴我就想起了psnull,不过对我没什么帮助,我想要自动的  发表于 2011-8-18 17:36

40

主题

324

回帖

0

精华

铂金会员

Eax=0

积分
1575
 楼主| 发表于 2011-8-18 17:31:41 | 显示全部楼层
Tesla.Angela 发表于 2011-8-18 16:57
干嘛要用“赐”,“高抬贵手”,“小弟”之类的词语?
纯爷们为了一份代码用这些词语,值得吗?!
如 ...

谢谢,不过已经找到了
  1. NTSTATUS RestoreShadow()
  2. {
  3.         NTSTATUS status;
  4.         HANDLE hFile;//文件句柄
  5.         OBJECT_ATTRIBUTES ObjAttr;
  6.         UNICODE_STRING ustrWin32k;
  7.         IO_STATUS_BLOCK ioStatus;
  8.         ULONG ulShadowRaw = 0;
  9.         ULONG ulShadowBase = 0;
  10.         PVOID PoolArea = NULL;
  11.         FILE_POSITION_INFORMATION fpi;
  12.         LARGE_INTEGER Offset;
  13.         ULONG OrigAddress = 0;
  14.         ULONG CurAddress = 0;
  15.         ULONG i = 0;
  16.         ULONG ulCount = 0;
  17.         PULONG pAddr;

  18.         if ( pWin32kBase == NULL ||
  19.                 KeServiceDescriptorTableShadow == NULL)
  20.         {
  21.                 dprintf("Error.");
  22.                 return STATUS_UNSUCCESSFUL;
  23.         }
  24.         //索引为1的项目?

  25.         ulCount = KeServiceDescriptorTableShadow[1].Limit;//Linit就是表中函数的个数

  26.         dprintf("Count Of Shadow : %d\n", ulCount );

  27.         ulShadowBase = *(ULONG*)&KeServiceDescriptorTableShadow[1].Base;//得到基址

  28.         dprintf("ulShadowBase = 0x%X\n",ulShadowBase);
  29.         //镜像中的偏移,file offset???
  30.         ulShadowRaw = ulShadowBase - (ULONG)pWin32kBase;
  31.         //ulShadowRaw = RVAToRaw(pWin32kBase,ulShadowBase);

  32.         dprintf("ulShadowRaw = 0x%X\n",ulShadowRaw);

  33.         RtlInitUnicodeString(&ustrWin32k, L"\\SystemRoot\\System32\\win32k.sys");
  34.         //分配空间
  35.         PoolArea = ExAllocatePool( PagedPool, sizeof(ULONG) * ulCount );
  36.         //分配空间,用于保存读取到的数据,因为每个地址的长度sizeof(ULONG),个数是ulCount,所以相乘

  37.         if (!PoolArea) {
  38.                 dprintf("PoolArea is null\n");
  39.                 return STATUS_UNSUCCESSFUL;
  40.         }

  41.         RtlZeroMemory(&ObjAttr, sizeof(ObjAttr) );
  42.         //获取Win32k.sys的属性
  43.         InitializeObjectAttributes(
  44.                 &ObjAttr,
  45.                 &ustrWin32k,
  46.                 OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
  47.                 NULL,
  48.                 NULL);
  49.         //打开文件win32K.SYS
  50.         status = IoCreateFile(
  51.                 &hFile,
  52.                 FILE_READ_ATTRIBUTES,
  53.                 &ObjAttr,
  54.                 &ioStatus,
  55.                 0,
  56.                 FILE_ATTRIBUTE_NORMAL,
  57.                 FILE_SHARE_READ,
  58.                 FILE_OPEN,
  59.                 0,
  60.                 NULL,
  61.                 0,
  62.                 0,
  63.                 NULL,
  64.                 IO_NO_PARAMETER_CHECKING);

  65.         if ( !NT_SUCCESS(status) ) {
  66.                 dprintf("IoCreateFile Error : 0x%X", status);
  67.                 goto __exit;
  68.         }

  69.         //设置文件偏移
  70.         Offset.LowPart = ulShadowRaw;
  71.         Offset.HighPart = 0;
  72.         //开始读取数据
  73.         status = ZwReadFile (
  74.                 hFile,
  75.                 NULL,
  76.                 NULL,
  77.                 NULL,
  78.                 &ioStatus,
  79.                 //从文件读出到分配空间
  80.                 PoolArea,
  81.                 ulCount*sizeof(ULONG),
  82.                 //偏移
  83.                 &Offset,
  84.                 NULL);

  85.         if ( !NT_SUCCESS(status) ) {
  86.                 dprintf("ZwReadFile Error : 0x%X");
  87.                 goto __exit;
  88.         }
  89.         //改变指针类型
  90.         pAddr = (PULONG)PoolArea;
  91.         //比较原始地址与当前的地址并且输出调试
  92.         _asm
  93.         {
  94.                 CLI
  95.                 MOV EAX,CR0
  96.                 AND EAX,NOT 10000H
  97.                 MOV CR0,EAX
  98.         }
  99.         for (i=0;i<ulCount;i++) {
  100.                 OrigAddress = *pAddr;//指向原始地址
  101.                 CurAddress = KeServiceDescriptorTableShadow[1].Base[i];//读取当前地址
  102.                 if ( OrigAddress != CurAddress ) {
  103.                         dprintf("ID:%-3d.OrigAddr : 0x%X CurAddr : 0x%X---Hooked!\n",i,OrigAddress,CurAddress);
  104.                         KeServiceDescriptorTableShadow[1].Base[i]=*pAddr;
  105.                         dprintf("Already unhook!");
  106.                 } else {
  107.                         dprintf("ID:%-3d.OrigAddr : 0x%X.CurAddr : 0x%X\n",i,OrigAddress,CurAddress);
  108.                 }
  109.                 pAddr++;//指针指向下一个函数
  110.         }
  111.         _asm
  112.         {
  113.                 MOV EAX,CR0
  114.                 OR EAX,10000h
  115.                 MOV CR0,EAX
  116.                 STI
  117.         }

  118. __exit:
  119.         if (PoolArea) {
  120.                 ExFreePool(PoolArea);
  121.                 //释放空间
  122.         }
  123.         if (hFile) {
  124.                 ZwClose(hFile);
  125.                 //关闭句柄
  126.         }
  127.         return status;
  128. }
复制代码

评分

参与人数 1水晶币 +20 +20 收起 理由
Tesla.Angela + 20 + 20 貌似是08年的代码。。。

查看全部评分

Do my best.

857

主题

2632

回帖

2

精华

管理员

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

积分
36130
发表于 2011-8-18 19:56:55 | 显示全部楼层
楼主试试用我以前发的恢复Ring 0 Inline Hook的代码恢复一下Shadow SSDT Inline Hook。。。
注意要把win32k.sys复制一次才能LoadLibraryEx。。。

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2011-8-21 22:54:43 | 显示全部楼层
不错
标记一下

2

主题

17

回帖

0

精华

初来乍到

积分
29
发表于 2011-10-19 05:36:20 | 显示全部楼层
:L
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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