内核文件加载执行控制方案实现(xp和win 7 32)
2017-03-17 19:51
639 查看
文件加载执行控制是程序白名单安全系统的技术基础,即在可执行文件(exe),库文件(dll)加载入内存前的一种监控机制,为安全软件提供了一种对系统允许加载运行的程序进行白名单定制的机会。在windows平台下,该方案可以实现在应用层,也可以以设备驱动的形式实现在内核层。若实现在应用层,则需要对explorer.exe和cmd.exe两个系统进程进行运行时代码注入,以分别监控由图形界面和命令行启动的程序进行拦截。由于这两个程序的内在运行逻辑未知,无法确定其创建新进程的行为的hook点,因此实现难度大,部署在应用层的监控模块安全性也无法得到保证。
因此选择在内核层完成对系统的进程创建和dll文件加载事件进行监控。对于xp和32位win7系统,这主要是通过对系统服务描述符表(SSDT)进行hook来实现。SSDT 的全称是 System Services Descriptor Table,系统服务描述符表。这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来。SSDT 并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。通过修改此表的函数地址可以对常用Windows
函数及 API 进行 Hook,从而实现对一些关心的系统动作进行过滤、监控的目的。一些 HIPS、防毒软件、系统监控、注册表监控软件往往会采用此接口来实现自己的监控模块。
windows平台下,进程创建和dll加载都要调用NtCreateSection函数,该函数在目标进程地址空间内部为指定文件(exe,dll,bat)创建一个内存映射对象,功能类似于Linux下的mmap系统调用。因此该函数可作为标识进程创建和dll加载的入口点。我们需要hook SSDT中该函数的调用地址。
Windows API OpenProcess是从Kernel32导出的,所以调用首先转到了Kernel32的CreateSection函数。在CreateSection中又调用了ntdll!NtCreateSection函数。然后通过快速系统调用进入内核,根据传进来的索引在SSDT中得到函数的地址,然后调用函数。在 NT 4.0 以上的 Windows 操作系统中,默认就存在两个系统服务描述表,这两个调度表对应了两类不同的系统服务,这两个调度表为:KeServiceDescriptorTable 和 KeServiceDescriptorTableShadow,其中
KeServiceDescriptorTable 主要是处理来自 Ring3 层得 Kernel32.dll中的系统调用,而 KeServiceDescriptorTableShadow 则主要处理来自 User32.dll 和 GDI32.dll 中的系统调用,并且 KeServiceDescriptorTable 在ntoskrnl.exe(Windows 操作系统内核文件,包括内核和执行体层)是导出的,而 KeServiceDescriptorTableShadow 则是没有被 Windows 操作系统所导出,而关于
SSDT 的全部内容则都是通过 KeServiceDescriptorTable 来完成的。
在驱动代码中,直接通过extern关键字引用KeServiceDescriptorTable变量即可获得SSDT表基址。
得到SSDT表地址后,即可根据windows版本信息获取不同版本NtCreateSection的函数地址:
因此选择在内核层完成对系统的进程创建和dll文件加载事件进行监控。对于xp和32位win7系统,这主要是通过对系统服务描述符表(SSDT)进行hook来实现。SSDT 的全称是 System Services Descriptor Table,系统服务描述符表。这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来。SSDT 并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。通过修改此表的函数地址可以对常用Windows
函数及 API 进行 Hook,从而实现对一些关心的系统动作进行过滤、监控的目的。一些 HIPS、防毒软件、系统监控、注册表监控软件往往会采用此接口来实现自己的监控模块。
windows平台下,进程创建和dll加载都要调用NtCreateSection函数,该函数在目标进程地址空间内部为指定文件(exe,dll,bat)创建一个内存映射对象,功能类似于Linux下的mmap系统调用。因此该函数可作为标识进程创建和dll加载的入口点。我们需要hook SSDT中该函数的调用地址。
Windows API OpenProcess是从Kernel32导出的,所以调用首先转到了Kernel32的CreateSection函数。在CreateSection中又调用了ntdll!NtCreateSection函数。然后通过快速系统调用进入内核,根据传进来的索引在SSDT中得到函数的地址,然后调用函数。在 NT 4.0 以上的 Windows 操作系统中,默认就存在两个系统服务描述表,这两个调度表对应了两类不同的系统服务,这两个调度表为:KeServiceDescriptorTable 和 KeServiceDescriptorTableShadow,其中
KeServiceDescriptorTable 主要是处理来自 Ring3 层得 Kernel32.dll中的系统调用,而 KeServiceDescriptorTableShadow 则主要处理来自 User32.dll 和 GDI32.dll 中的系统调用,并且 KeServiceDescriptorTable 在ntoskrnl.exe(Windows 操作系统内核文件,包括内核和执行体层)是导出的,而 KeServiceDescriptorTableShadow 则是没有被 Windows 操作系统所导出,而关于
SSDT 的全部内容则都是通过 KeServiceDescriptorTable 来完成的。
在驱动代码中,直接通过extern关键字引用KeServiceDescriptorTable变量即可获得SSDT表基址。
得到SSDT表地址后,即可根据windows版本信息获取不同版本NtCreateSection的函数地址:
相关文章推荐
- 内核文件加载执行控制方案实现(win7, win8 64位)--windows内核安全策略的演变
- Linux0.11内核--加载可执行二进制文件之1.copy_strings
- 实现ibatis手动控制加载sqlmap文件,终于不用重启应用了
- VC++通过动态生成并加载DLL,实现可执行文件的自删除
- 异步加载js文件并执行js方法:实现异步处理网页的复杂效果
- 实现一个可以加载资源中隐藏的.exe可执行文件的程序
- VC++通过动态生成并加载DLL,实现可执行文件的自删除
- 原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
- 异步加载js文件并执行js方法:实现异步处理网页的复杂效果(转)
- WPF 加载exe执行文件 | WPF c#实现窗口全屏
- VC++通过动态生成并加载DLL,实现可执行文件的自删除
- 动态加载资源属性文件实现方案
- 异步加载js文件并执行js方法:实现异步处理网页的复杂效果
- TreeView加载不同sitemap文件实现简单权限控制
- GridView 72般绝技,Javascript与asp.net 实现Ajax多文件无刷新上传,在ASP.NET中执行URL重写经典方案
- 自行控制loadrunner的socket协议性能测试 (转) 一前言 二任务的提出 三实现方案讨论 四技术要点讲解 如何开始录制一个最简单的收发数据包脚本 写日志文件 一行一行读数据包文件 字
- 腾讯开源手游热更新方案Xlua尝鲜(二)——执行Lua字符串和Lua文件加载
- Linux0.11内核--加载可执行二进制文件之2.change_ldt
- 在批处理文件里面如何控制延时执行指令(也就是实现sleep)
- Linux0.11内核--加载可执行二进制文件之3.exec