UNSSDTHOOK

这里先开一个题外话     因为我一直再看 pwn的堆溢出 然后有学弟问我 烫烫 屯屯 什么意思 我一直感觉是个中断值  当  栈或者 堆 溢出的时候  引起中断 然后 警告  后来 感觉自己  理解的有点偏差  这里 是正确的

烫烫是debug中未初始化的栈变量 屯屯是debug中未初始化的堆变量

 

然后开始今天的重点   

emmmmmm  很可惜的一点   这个东西我一直想做 但是其实这个比较难  一直对那些 知道 那个函数被hook的 那些东西比较感兴趣  一直想知道 他们是怎么 hook 然后还能知道我们 那个地方被hook了 

下面一段来自作者Tesla.Angela(GDUT.HWL)的教程

 要恢复 SSDT,首先要获得 SSDT 各个函数的原始地址,而 SSDT 各个函数的原 始地址,自然是存储在内核文件里的。于是,有了以下思路: 1.获得内核里 KiServiceTable 的地址(变量名称:KiServiceTable) 2.获得内核文件在内核里的加载地址(变量名称:NtosBase) 3.获得内核文件在 PE32+结构体里的映像基址(变量名称:NtosImageBase)  4.在自身进程里加载内核文件并取得映射地址(变量名称:NtosInProcess) 5.计算出 KiServiceTable 和 NtosBase 之间的“距离”(变量名称:RVA) 6.获得指定 INDEX 函数的地址(计算公式:*(PULONGLONG)(NtosInProcess + RVA + 8 * index) - NtosImageBase + NtosBase) 
 
  可见,从文件中的 KiServiceTable 地址开始,每 8 个字节,存储一个函数 的“理想地址”(之所以说是理想地址,是因为这个地址是基于『内核文件的映 像基址 NtosImageBase』的,而不是基于『内核文件的加载基址 NtosBase』的)。 因此,得到 8 * index。由于已经获得了 KiServiceTable 和 NtosBase 之间的 “距离”(RVA = KiServiceTable - NtosBase),也已知内核文件在自身进程里 的映射地址(NtosInProcess),所以就能算出文件中的 KiServiceTable 的地址 (NtosInProcess + RVA)。所以,存储各个函数原始地址的文件地址就是: NtosInProcess + RVA + 8 * index。把这个地址的值取出来(长度为 8),就 是:*(PULONGLONG)(NtosInProcess + RVA + 8 * index)。前面说了,由于得到 的这个函数地址是理想地址,因为它假设的加载基址是 PE32+结构体里的成员 ImageBase(映像基址)的值。而实际上,内核文件的加载基址肯定不可能是这 个值,所以还要减去内核文件的映像基址(NtosImageBase)再加上内核文件的 实际加载基址(NtosBase)。接下来,给出每一步的具体实现过程的代码。

 

这里其实到这我思路其实已经有了   但是代码实现还是有点懵  等到看懂了 再补上吧。。。。。。。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值