众所周知在非 admin 用户模式下,是不允许加载驱动执行 ring 0 代码的.
本文提供了一种方法,通过修改系统 gdt,idt 来添加自己的 callgate 与 【程序编程相关:用JDOM建立XML文件】 【推荐阅读:心语——女性程序员的心声】intgate 这样便在系统中设置了一个后门.我们就可以利用这个后门 【扩展信息:递归法提升密码穷举算法性能】 在任意用户模式下执行 ring 0 代码了.为了保证我们添加的 callgate 与 int gate 永久性.可以在第一次安装时利用 service api 或 inf 文件设置成随 系统启动.不过此方法也有个缺陷,就是在第一次安装 callgate 或 intgate 时仍然需要 admin 权限.下面分别给出了添加 callgate 与 intgate 的具体 代码. 一.通过添加调用门实现 为了可以让任意用户来调用我们的 callgate 需要解决一个小问题.因为 需要知道 callgate 的 selector 后才可以调用.而在 ring 3 下除了能 得到 gdt 的 base address 与 limit 外是无法访问 gdt 内容的.我本想 在 ring 0 把 selector 保存到文件里.在 ring 3 下读取出来再调用. 后经过跟 wowocock 探讨.他提出的思路是在 ring 0 下通过 zwquerysysteminformation 得到 ntdll.dll 的 module base 然后根据 pe header 中的空闲处存放 selector.这样在 ring 3 的任意用户模式下 就很容易得到了.在这里要特别感谢 wowocock.下面的代码为了演示 方便,用了在我机器上 gdt 中第一个空闲描述符的 selector . 驱动程序: /***************************************************************** 文件名 : wssaddcallgate.c 描述 : 添加调用门 作者 : sinister 最后修改日期 : 2002-11-02 *****************************************************************/ #include "ntddk.h" #include "string.h" #ifndef dword #define dword unsigned int #endif #ifndef word #define word unsigned short #endif #define loword(l) ((unsigned short)(unsigned int)(l)) #define hiword(l) ((unsigned short)((((unsigned int)(l)) >> 16) & 0xffff)) typedef unsigned long ulong; static ntstatus mydrvdispatch (in pdevice_object deviceobject, in pirp irp); void driverunload (in pdriver_object pdriverobject); #pragma pack(push,1) typedef struct taggdtr{ word wlimit; dword *dwbase; }gdtr, *pgdtr; typedef struct taggdt_descriptor{ unsigned limit : 16; unsigned baselo : 16; unsigned basemid : 8; unsigned type : 4; unsigned system : 1; unsigned dpl : 2; unsigned present : 1; unsigned limithi : 4; unsigned available : 1; unsigned zero : 1; ... 下一页