一个禁止任何ring3调试的驱动
来源:互联网 发布:www.java.com 编辑:程序博客网 时间:2024/05/02 22:53
#include <ntddk.h>#define MAKELONG(low, high) \((ULONG)(((USHORT)((ULONG)(low) & 0xffff)) | ((ULONG)((USHORT)((ULONG)(high) & 0xffff))) << 16))#define GET_LOW16_OF_32(data) \((USHORT)(((ULONG)data) & 0xffff))#define GET_HIGH16_OF_32(data) \((USHORT)(((ULONG)data) >> 16))#pragma pack(push,1)typedef struct IDTR_{ USHORT limit; ULONG base;} IDTR, *P_IDTR;typedef struct IDTENTRY_{ USHORT offset_low; USHORT selector; UCHAR reserved; UCHAR type:4; UCHAR always0:1; UCHAR dpl:2; UCHAR present:1; USHORT offset_high;} IDTENTRY, *P_IDTENTRY;#pragma pack(pop)ULONG Offset = 0;ULONG HOOK_IDT_INDEX[] = {0x01, 0x03};#define HOOK_IDT_NUM sizeof(HOOK_IDT_INDEX)/sizeof(ULONG)VOID *g_old_entry[HOOK_IDT_NUM] = {0};VOID *GetIdt(){ IDTR idtr; _asm sidt idtr return (VOID *)idtr.base;}VOID MyUserFilter(){ KdPrint(("Crurrent IRQL: %d\n",KeGetCurrentIrql())); if (Offset > 0) { ULONG eprocess = (ULONG)PsGetCurrentProcess(); PULONG pDebugPort = (PULONG)(eprocess+Offset); if (*pDebugPort > 0) { KdPrint(("DebugObject = %x\n", pDebugPort)); *pDebugPort = 0; //clear DebugPort } }}__declspec(naked) InterruptProc01(){ __asm { pushfd // 保存标志寄存器 pushad // 保存所有的通用寄存器 push fs __asm { mov ebx, 30H // Set FS to PCR. mov fs, bx } call MyUserFilter pop fs popad // 恢复通用寄存器 popfd // 恢复标志寄存器 jmp g_old_entry[0] // 跳到原来的中断服务程序 }}__declspec(naked) InterruptProc03(){ __asm { pushfd // 保存标志寄存器 pushad // 保存所有的通用寄存器 push fs __asm { mov ebx, 30H // Set FS to PCR. mov fs, bx } call MyUserFilter pop fs popad // 恢复通用寄存器 popfd // 恢复标志寄存器 jmp g_old_entry[4] // 跳到原来的中断服务程序 }}VOID *g_new_entry[HOOK_IDT_NUM] = {InterruptProc01, InterruptProc03};VOID ModifyInterrupt(BOOLEAN hook_or_unhook){ USHORT i; P_IDTENTRY idt_addr = (P_IDTENTRY)GetIdt(); //SetWriteProtect(FALSE, &orgcr0); for (i = 0; i < HOOK_IDT_NUM; i++) { KdPrint(("the current address for index %02x = %x\n", HOOK_IDT_INDEX[i], (VOID *)MAKELONG(idt_addr[HOOK_IDT_INDEX[i]].offset_low, idt_addr[HOOK_IDT_INDEX[i]].offset_high))); if(hook_or_unhook) { KdPrint(("try to hook this interrupt\n")); g_old_entry[i] = (VOID *)MAKELONG(idt_addr[HOOK_IDT_INDEX[i]].offset_low, idt_addr[HOOK_IDT_INDEX[i]].offset_high); idt_addr[HOOK_IDT_INDEX[i]].offset_low = GET_LOW16_OF_32(g_new_entry[i]); idt_addr[HOOK_IDT_INDEX[i]].offset_high = GET_HIGH16_OF_32(g_new_entry[i]); } else { KdPrint(("try to recovery interrupt for index %02x\n", HOOK_IDT_INDEX[i])); idt_addr[HOOK_IDT_INDEX[i]].offset_low = GET_LOW16_OF_32(g_old_entry[i]); idt_addr[HOOK_IDT_INDEX[i]].offset_high = GET_HIGH16_OF_32(g_old_entry[i]); } KdPrint(("the current address = %x\n", (VOID *)MAKELONG(idt_addr[HOOK_IDT_INDEX[i]].offset_low, idt_addr[HOOK_IDT_INDEX[i]].offset_high))); }//for //SetWriteProtect(TRUE, &orgcr0);}VOID HookIDT(BOOLEAN hook_or_unhook){ KAFFINITY ActiveProcessors, CurrentAffinity; ActiveProcessors=KeQueryActiveProcessors(); KdPrint(("KeActiveProcessors = %d\n", ActiveProcessors)); for (CurrentAffinity = 1; ActiveProcessors; CurrentAffinity <<= 1) { if (ActiveProcessors & CurrentAffinity) { ActiveProcessors &= ~CurrentAffinity; KeSetSystemAffinityThread(CurrentAffinity); KdPrint(("At %d CPU IDT:\n", CurrentAffinity)); ModifyInterrupt(hook_or_unhook); KdPrint(("\n")); } }}VOID Unload(PDRIVER_OBJECT drv){ HookIDT(FALSE); KdPrint (("Unload Driver\n")); }NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { RTL_OSVERSIONINFOEXW osverinfo = {sizeof(osverinfo)}; KdPrint (("Entering DriverEntry\n")); DriverObject->DriverUnload = Unload; RtlGetVersion((PRTL_OSVERSIONINFOW)&osverinfo); KdPrint(("OSVersion NT %d.%d:%d sp%d.%d\n", osverinfo.dwMajorVersion, osverinfo.dwMinorVersion, osverinfo.dwBuildNumber, osverinfo.wServicePackMajor, osverinfo.wServicePackMinor)); if (osverinfo.dwMajorVersion == 5 && osverinfo.dwMinorVersion == 0) Offset = 0x120; //WINDOWS_VERSION_2K else if (osverinfo.dwMajorVersion == 5 && osverinfo.dwMinorVersion == 1) Offset = 0xbc; //WINDOWS_VERSION_XP else if (osverinfo.dwMajorVersion == 5 && osverinfo.dwMinorVersion == 2) Offset = 0xcc; //WINDOWS_VERSION_2003 else if (osverinfo.dwMajorVersion == 6 && osverinfo.dwMinorVersion == 0) Offset = 0xd4; //WINDOWS_VERSION_VISTA else if (osverinfo.dwMajorVersion == 6 && osverinfo.dwMinorVersion == 1) Offset = 0xec; //WINDOWS_VERSION_WIN7 else Offset = 0; HookIDT(TRUE); return STATUS_SUCCESS; }
这个方法很简单:hook int1,int3
然后清除DebugPort,简单明了~~
代码适用于多核,多系统~~~
- 一个禁止任何ring3调试的驱动
- 一个简单的进程----跳到ring3
- Ring3调试流程
- ring3到ring0的过渡----rootkit最基本驱动
- Ring3程序控制驱动实现指定进程的键盘过滤
- 一个超简单的ring3与ring0通信的例子
- 1.ring3-反调试-IsDebuggerPresent
- 0.ring3-反调试小结
- 禁止在生产时段改动涉及到oracle的任何东西。
- 求一个最长的串使得该串不包含任何禁止串为子串 AC自动机+DP +dfs判环 UVA 1399 - Puzzle
- UVA 1399 Puzzle 求一个最长的串使得该串不包含任何禁止串为子串 AC自动机 + DP +dfs判环
- wowocock的Callback Ring3
- 在ring3下列举系统中已加载的驱动模块的信息
- 一个数据库远程访问错误及其解决办法(启用 JIT 调试后,任何无法处理的异常)
- 用Delphi在2000和XP/2003下从Ring3进入Ring0的无驱动解决方法
- 禁止destructors引发任何异常
- 禁止Windows的驱动自动安装
- windows驱动编译,禁止指定的警告
- JVM调优总结(七)-典型配置举例1
- JVM调优总结(八)-典型配置举例2
- JVM调优总结(九)-新一代的垃圾回收算法
- linux 添加环境变量
- JVM调优总结(十)-调优方法
- 一个禁止任何ring3调试的驱动
- . ZigBee节点——ZigBee协议栈Z-Stack开发指南
- postfix 中只開 localhost 網路介面或跑 Virtual Host 時, 碰到 loops back to myself 錯誤要如何解決?
- 立此存照
- #define里你所不知道的秘密
- JVM调优总结(十一)-反思
- android下面监测耳机事件
- iphone 应用程序图标、启动画面、itune图标等设置全面总结
- 冒泡排序