免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 各类编程 > 利用缺页异常中断主动拦截恶意修改(3)

利用缺页异常中断主动拦截恶意修改(3)

时间:2012-01-11 18:22来源:未知 整理:寂涯网络 点击:


    }
}

缺页异常中断的处理例程并不遵守stdcall调用方式,因此需要用汇编来编写

__declspec(naked)void hooked_trap_0e()  
 __asm
 {
  pushad  //保存现场
  mov eax,[esp+32] //错误码
  push eax 
   mov eax,cr2 //在缺页异常发生时,试图访问的内存地址保存在CR2寄存器中
  push eax
  mov eax,esp 
  add eax,32+4+4+4  //www.jybase.net 产生异常的指令地址
  push eax   
  call check_addr //调用check_addr函数进行进一步的检查
  test eax,eax
  jz normal  //check_addr返回0 时,放行并调用原始的处理例程
  xor eax,eax
  mov cr2,eax //否则,模拟一个试图访问地址0x00000000所产生的异常
normal:
   popad
  jmp origkitrap0e
 }
}

这段代码调用了 check_addr 函数进行进一步的检查,如果此函数返回 1,则拦截这次
操作,并且模拟一个访问地址 0x00000000 所产生的错误给上层应用程序(如果上层程序使
用的是 WriteProcessMemory 函数,则会返回 0 表示失败)。本文中给出了一个最简单的
check_addr函数的实现,只判断地址所在的范围。读者可以进一步扩展,增加访问者判断、
日志等功能。

ULONG check_addr(ULONG* caller,ULONG ptr,ULONG errcode)
{
  ULONG t;
 if (!(errcode & 2)) return 0; //是否为写入操作?
  if ((paddr <= ptr) && (paddr + psize > ptr)) //是否在受保护的地址范围内?
 {
  return 1;
 }
 return 0;
}

在本例中,用户层程序获取Beep 函数的地址,并通过IoControl调用驱动程序来设置。
运行 test.exe 后,可以用 ollydbg 1.10 等工具进行测试,无法修改受到保护的
kernel32.Beep函数。
由于篇幅所限,本例中假定系统中只存在一个处理器。在多处理器环境中,要注意每一
个处理器都有一个独立的IDT,应全部加以修改。此外,恶意软件还可以通过VirtualProtect
等函数修改内存的属性绕过这种保护,应在驱动中加以拦截,可以通过 SSDT Hook 挂钩
NtProtectVirtualMemory函数加以处理。

本页地址 http://www.jybase.net/biancheng/20120111747.html

百度搜索更多

谷歌搜索更多

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com