首页
社区
课程
招聘
[旧帖] [原创]x64内核编程小窥-SSDT HOOK笔记 0.00雪花
发表于: 2014-11-15 00:46 15115

[旧帖] [原创]x64内核编程小窥-SSDT HOOK笔记 0.00雪花

2014-11-15 00:46
15115
UINT64 getKeServiceDescirptorTable()
{
  UINT64 KeServiceDescirptorTable = 0;// 接收KeServiceDescirptorTable地址
  PUCHAR addrStartSearch = (PUCHAR)__readmsr(ULONG(0xC0000082));  // 读取KiSystemCall64地址

  PUCHAR addrEndSearch = addrStartSearch + 0x500;  // 搜索的结束地址
  ULONG tmpAddress = 0;// 用于保存临时地址
  int j = 0;// 用于进行索引

  //    开始搜索,从KiSystemCall64开始搜索其函数体内关于KeServiceDescriptorTable结构的信息
  for (PUCHAR i = addrStartSearch; i < addrEndSearch; i++, j++)
  {
    if (MmIsAddressValid(i) && MmIsAddressValid(i + 1) && MmIsAddressValid(i + 2))
    {
      //特征码 0x4c 0x8d 0x15
      if (addrStartSearch[j] == 0x4c &&
        addrStartSearch[j + 1] == 0x8d &&
        addrStartSearch[j + 2] == 0x15)
      {
        RtlCopyMemory(&tmpAddress, i + 3, 4);  // 保存后4个机器码
        // 得到KeServiceDescirptorTable表真实地址
        KeServiceDescirptorTable = tmpAddress + (INT64)i + 7;
      }
    }
  }
  return KeServiceDescirptorTable;
}
PSERVICES_DESCRIPTOR_TABLE pServiceDescriptorTable = (PSERVICES_DESCRIPTOR_TABLE)getKeServiceDescirptorTable();
PULONG ssdt = (PULONG)pServiceDescriptorTable->ServiceTableBase;
UINT64 getSsdtFunctionAddress(UINT index)
{
  INT64 address = 0;
  PSERVICES_DESCRIPTOR_TABLE pServiceDescriptorTable = (PSERVICES_DESCRIPTOR_TABLE)getKeServiceDescirptorTable();
  PULONG ssdt = (PULONG)pServiceDescriptorTable->ServiceTableBase;
  ULONG  dwOffset = ssdt[index];
  dwOffset >>= 4;            // get real offset
  address = (UINT64)ssdt + dwOffset;  // get real address of function in ssdt
  KdPrint(("0x%llX\n", address));
  return address;
}
VOID initKeBugCheckEx()
{
  /*
    向KeBugCheckEx头部中写入的数据
    48 B8 xxxx    mov rax,XXXh;
    FF E0      jmp rax
  */
  UCHAR jmpCode[13] = "\x48\xB8\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xE0"; //12 data
  UINT64 proxyFunction;
  proxyFunction = (UINT64)proxyNtOpenProcess;  //自己的NtOpenProess
  RtlCopyMemory(jmpCode + 2, &proxyFunction, 8);
  wpOff();  // 关保护
  memset(KeBugCheckEx, 0x90, 15);  // 初始化15个字节为 nop
  RtlCopyMemory(KeBugCheckEx, jmpCode, 12); // mov rax,XXXh;jmp rax; nop; nop;
  wpOn();    // 写保护
  return;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (64)
雪    币: 32
活跃值: (34)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
沙发留名
感谢大家啊,我转正了,非常感谢我们任老师A1Pass和b23526给的邀请码
也衷心希望大家也来15PB,我现在这里,这里真的很好。
2014-11-15 00:47
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不留名板櫈
2014-11-15 01:16
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
顶一个。
2014-11-15 07:57
0
雪    币: 122
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
顶一个……
2014-11-15 08:00
0
雪    币: 32
活跃值: (34)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
感觉没人理啊...唉,郁闷的啦,当时写得好辛苦的....
2014-11-15 08:08
0
雪    币: 32
活跃值: (34)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
大牛,你kx好多啊,送我个号呗...i really want to become regular members
2014-11-15 08:22
0
雪    币: 32
活跃值: (34)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
我擦,刚才竟突然打不出中文...........
2014-11-15 08:23
0
雪    币: 52
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感觉不错啊....为毛没加精啊......
2014-11-15 17:18
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习了啊。。
2014-11-15 22:50
0
雪    币: 0
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好厉害,膜拜
2014-11-15 23:46
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
12
鼓励一下
2014-11-16 04:01
0
雪    币: 32
活跃值: (34)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
求转正啊.....
2014-11-16 08:07
0
雪    币: 300
活跃值: (2472)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
mark
2014-11-16 08:14
0
雪    币: 349
活跃值: (125)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
15
路过留名
2014-11-16 08:37
0
雪    币: 114
活跃值: (180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
MARK,谢谢分享。
2014-11-16 09:28
0
雪    币: 4560
活跃值: (1002)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
不错的帖子,送你个邀请码
2014-11-16 09:32
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
虽然不是很懂   但是也支持下啊
2014-11-16 11:05
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
不错

名师出高徒阿
2014-11-16 11:11
0
雪    币: 1392
活跃值: (5172)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
20
如果我是SSDT hook200个函数怎么办。
应当是从代码段的末尾寻找这样的跳转空间比较好
2014-11-16 11:41
0
雪    币: 32
活跃值: (34)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
说得很好诶,我就是对ntoskrnl.exe文件不了解,没找到更好的hook点
2014-11-16 11:50
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
虽然是完全参考了[www.vbasm.com]WIN64驱动编程基础教程,但还是鼓励下吧。
2014-11-16 14:18
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
至于为什么是ssdt[nIndex]>>4而不是ssdt[nIndex],只能说通过逆向发现微软的做法就是这样的.....ssdt[nIndex]>>4才是实际偏移地址......(也是不知道该怎么解释了,希望遇到更明白的大牛告知)

IDA自己找KiSystemServiceStart。慢慢分析原理吧~
fffff800`03e73024 49c1fb04        sar     r11,4                注意这个逗比操作,右移4位,获取真正偏移
fffff800`03e73028 4d03d3          add     r10,r11  把偏移加到ssdt/shadow表的地址上,得到函数在内存中真正地址,u r10试试
2014-11-16 14:22
0
雪    币: 294
活跃值: (119)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
24
LZ是五期大牛啊~
2014-11-16 14:24
0
雪    币: 32
活跃值: (34)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
[QUOTE=一盏清茗;1331228]至于为什么是ssdt[nIndex]>>4而不是ssdt[nIndex],只能说通过逆向发现微软的做法就是这样的.....ssdt[nIndex]>>4才是实际偏移地址......(也是不知道该怎么解释了,希望遇到更明白的大牛告知)

IDA自己找KiSystemServiceStart。慢慢分...[/QUOTE]

对诶,我就是说的这个操作,微软就是这么做的,只是有些不理解.....非常感谢你
2014-11-16 15:30
0
游客
登录 | 注册 方可回帖
返回
//