白皮书中 page-fault error code:
shadowWalker 原理:
接管 指定程序 的 执行页面异常、读写页面异常;然后 调用一下正常的 使其出现在快表;然后恢复到假的pte
------ 根据白皮书中 的error code 过滤出 执行、读写异常类型
相关:
将 402000 这个页面通过修改pte 设置为不存在(直接 给 p位置为 0);这样产生异常 我们接管
全程接管 读写、执行异常
读写异常 -- 不能交给系统默认处理;因为系统有虚拟地址的管理,他可能以为还没有映射该页面或者可能被置换到磁盘文件等,再次映射;但是还是不是我们想要的正确的。
所以我们接管。
只接管 402000 页面(具体根据项目//后来我的项目是 412000)
因为其他页面也会产生异常;如果想把该程序的都接收,那么得区分出来分别处理,这里我们只处理一个页面就行;原理类似。
利用 TLB 使得瞬间正常,然后又恢复异常状态;不然只接管了一次。
在被接管得测试程序 一进入 0环 ,就保存 需要接管的 pte ;代码如上;
异常接管后;如果不给页面的话 ;它会一直死循环 页面异常;所以 我们给他假的页面
创建一个假页面:
再把假页面给 内核;这样 我们在内核接管的时候;可以将这个假页面给请求者。
处理之后不能直接退出;得手动平 error code 这个栈位;因为中断系统只平默认的5个。
代码1 被隐藏目标程序:shadowWalker.cpp
代码2:注册和过滤处理目标页面异常消息
不知道怎么回事 搬家博客的图片这里显示不了--- 有兴趣的可查看 我博客园 原版 博文 :
https://www.cnblogs.com/leibso-cy/category/1573404.html