-
-
[原创]fuck trap0e trap03 trap01
-
发表于:
2017-1-10 15:23
7407
-
[原创]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神~
联系我:646535763@qq.com
ph.rar
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课