18

mac2026-01-13  14

白皮书中 page-fault error code:

shadowWalker 原理:

接管 指定程序 的 执行页面异常、读写页面异常;然后 调用一下正常的 使其出现在快表;然后恢复到假的pte

------ 根据白皮书中 的error code 过滤出 执行、读写异常类型

相关:

将 402000 这个页面通过修改pte 设置为不存在(直接 给 p位置为 0);这样产生异常 我们接管

然后通过 0x10 判断 是否是执行异常;是的话,就将页面给挂上去。

全程接管 读写、执行异常

读写异常 -- 不能交给系统默认处理;因为系统有虚拟地址的管理,他可能以为还没有映射该页面或者可能被置换到磁盘文件等,再次映射;但是还是不是我们想要的正确的。

所以我们接管。

只接管 402000 页面(具体根据项目//后来我的项目是 412000)

因为其他页面也会产生异常;如果想把该程序的都接收,那么得区分出来分别处理,这里我们只处理一个页面就行;原理类似。

利用 TLB 使得瞬间正常,然后又恢复异常状态;不然只接管了一次。

 

在被接管得测试程序 一进入 0环 ,就保存 需要接管的 pte ;代码如上;

异常接管后;如果不给页面的话 ;它会一直死循环 页面异常;所以 我们给他假的页面

创建一个假页面:

 

再把假页面给 内核;这样 我们在内核接管的时候;可以将这个假页面给请求者。

 

 

处理之后不能直接退出;得手动平 error code 这个栈位;因为中断系统只平默认的5个。

接管处理:

代码执行异常:

读写异常接管:

同理。。。 只是纠正后用一下;让其快表中;然后恢复到假页面

OD 有时能读出; 要完善的话得考虑OD 和内核通讯得路径

程序退出 有可能蓝屏:

原因: 退出得时候;把页面得pte 应该设置成正常得;前面遇到过重复释放问题。程序有虚拟地址管理;程序结束会回收;找pte 物理页面找不到;会出错。

所以在退出程序得时候将pte 修改回来;还可以将钩子卸掉;

还是得C 了 窗口消息函数 然后 将 pte 得修改回来!★ ---- 这个才是i正确得。。。

 

代码1 被隐藏目标程序:shadowWalker.cpp

 

 

代码2:注册和过滤处理目标页面异常消息

 

 

不知道怎么回事 搬家博客的图片这里显示不了--- 有兴趣的可查看 我博客园 原版 博文 : https://www.cnblogs.com/leibso-cy/category/1573404.html

 

最新回复(0)