欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]fuck trap0e trap03 trap01

[原创]fuck trap0e trap03 trap01

0. 不要脸的标注一个原创
1. 抄袭V神的代码和思路 http://bbs.pediy.com/showthread.php?t=194942,改了3个重要的bug,让代码跑起来。
         1.1  解决PTE中不可执行标志位设置的bug,这个bug会导致cpu高
         1.2  解决单步逻辑bug,之前OD不能单步
         1.3  加一些和od通信的代码
2. 驱动功能:模拟int3异常。其实OD并没有真的往被调试进程里面写进0xcc,但是一切调试功能正常。
3. 使用
         3.1 xp + PAE
         3.2 加载驱动,打开od就可以用了。注意od的名字和驱动里面列出来的名字要相同。
4. 原理
         1. Int3Address = 要下断点的虚拟地址
         2. PhAddress = Int3Address所在2M页的物理地址
         3. PAE = PhAddress 的PAE表结构
         4. 设置PAT.xd位,见intel手册4.4.2  table 4-9 。这样以后这一页就不可执行了。称为pagehook
              63 (XD) If IA32_EFER.NXE = 1, execute-disable (if 1, instruction fetches are not allowed from the 2-MByte page controlled by this entry; see Section 4.6); therwise, reserved (must be 0)
         5. hook trap01 trap0e 得到mytrap01 mytrap0e
         6. 当代码读到PAE表示的虚拟内存页的时候不会触发任何异常。
         7. 当代码执行到PAE表示的虚拟内存页的时候,都会触发int0e,进入到我们的mytrap0e,具体处理分情况讨论,令ExecAddr = 代码执行的地址
               7.1 当ExeAddr 不等于Int3Address
                       7.1.1 做步骤4的反操作,取消pagehook。
                       7.1.2 转给int1处理,单步执行这条指令(通过设置eflags中单步位实现)
                       7.1.3 当执行到mytrap01的时候ExecAddr这条指令已经执行过了,
                                7.1.3.1. 取消eflags中单步位
                                7.1.3.2  执行4中的操作,pagehook
                                7.1.3.3  恢复到ExecAddr的下一条指令去执行。(这条指令的处理会重复7的处理方式)
               7.2 当ExeAddr 等于Int3Address
                       7.2.1 做步骤4的反操作,取消pagehook。
                       7.2.2 call mytrap03,模拟实现int 3中断,达到软件效果了。
         8. 其他的处理,比如区分OD设置的单步和7中使用的单步异常,具体看代码
致谢 V神~

上传的附件 ph.rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功