搞了两三个星期,终于完成了,虽然这个重载的新内核还不能完全取代老内核,但是自己指定的进程还是没有问题的。
说说思路:
1.按照内核文件的PE结构将内核文件在内存中拉伸成可执行状态的镜像;
2.修复重定位表(重点难点);
3.修复IAT表;
4.HOOK KiFastCallEntey的某个地方,至于是什么地方老司机应该都懂得;
5.将指定进程的SSDT函数替换成新内核的SSDT函数;
我试着用新内核完全取代老内核,而不是只针对指定进程重载内核,坚持了七八分钟后还是崩了,不稳定,所以说我这种重载内核的完成度并不是100%完美,不过坚持了七八分钟已经大大超出我预期了,理论上应该是秒崩的。
把PE文件装载到内存拉伸成可执行的镜像修复IAT表相信PE基础扎实的人都没啥问题,HOOK KiFastCallEntry也是固定套路,这些都没啥好说的,关键难点是重定位,由于我们自己重载的新内核没有执行DriverEntry,数据都没有初始化,所以在重定位的时候凡是指向数据的地址都要重定位到老内核,是代码的地址就正常重定位到新内核。本来代码在上上周就写好了,就是因为我在判断需要要重定位的地址是数据还是代码的时候犯了低级错误知道今天才发现这个错误,所以今天才成功。
代码发上来,有兴趣的可以看看。