阅读:4129回复:35
winxp下hook中断的问题
缘起:在winxp下,我参考《解析Windows2000的IDT扩展机制》写了一个hook 0x2e中断的driver,可是我的NewISR始终执行不到。
问题:winxp下综合运用了sysenter和int,难道不能把win2000的hook方法照搬到winxp下来呢? |
|
最新喜欢:![]()
|
沙发#
发布于:2005-05-18 09:37
谢谢!Xp下,eax寄存器的值是 serviceID?确定吗? 可以肯定,看ntdll中语句,mov eax,服务号 |
|
|
板凳#
发布于:2005-05-18 08:48
[quote]请问,xp下int2e,用作什么?我用softice ,设置断点,发现int2e调用非常频繁!另外,RDMSR WRMSR,中操作的第的176,175,174h的地址具体指的是哪里? XP中Int 2E完全报废,我用softice ,设置断点,发现int2e调用非常频繁!这是Softice骗你的 :D [/quote] MSR 176 175 174 是把cs /esp/eip register 指向 CPL 0 |
|
地板#
发布于:2005-05-17 23:07
谢谢!Xp下,eax寄存器的值是 serviceID?确定吗?
我是了一下,好像不对? |
|
|
地下室#
发布于:2005-05-17 10:55
对,其实哪个就是TSS中RING0 ESP而已.可惜我以前那个修改WEBCRAZY的挂钩系统调用的例子找不到了,,记得当时我跟踪过,INT2E的的确不用了,但在XP SP1以前,2E所在的地址还是在SYSENTER进来的地方的必经之路上,所以你HOOK,IDT2E的对应的中断门地址,还是可以拦截的,而直接改IDT2E里的就没用了,因为系统根本不调用他,即使在核心层调函数也是直接CALL的.
但在XP SP2以后,他的地址就跑到SYSENTER进来的地方的前面了,所以必须分开HOOK,才能同时拦截来自RING3和RING0的系统调用....... 同时如果你HOOK的话还得针对SOFTICE做些处理,因为他也改了系统不少东西,嘿嘿...... |
|
|
5楼#
发布于:2005-05-17 10:48
谢谢老大!能否将详细些,另外,在xp下,拦截sysEnter后,如何获得调用者信息,如serviceID :P 其实我以前也很困惑,比如你在XP下bpint 2e,肯定会经常触发,但XP真的不再用Int 2e,那我估计是为调用Int 2E的老应用程序准备的.其实你在XP下bpint 2e,softice在KiSystemService那里写了个0xcc,这个知道吧,就是Int 3,只不过你看不到,以后有空儿我会再发个原创,验证这个事实的.至于serviceID,就更简单了,EAX传入的就是serviceID |
|
|
6楼#
发布于:2005-05-17 10:42
[quote][quote][quote]其实就两条指令 RDMSR WRMSR,其实我觉得连堆栈都不用换 用户态切换到内核态,不切换堆栈是找“死”。 [/quote] SYSENTER会自动将ESP切换到SYSENTER_ESP_MSR所指向的核心堆栈的 [/quote] 每个线程SYSENTER后EIP是相同的,所以可以预先设好; ESP呢,难道也是相同的吗? [/quote] 看看微软自己是怎么做的吧,Sysenter进入ring 0后,从fs:40处取得当前核心线程的切换CONTEXT,其中有当前核心线程的ESP值,然后才是将ESP改为这个值.但你注意到没有,在执行这些指令之前都有PUSH POP操作,如PUSH 30;POP FS.这已经是核心堆栈了,所以这就是我所说的,其实我觉得连堆栈都不用换,SYSENTER会自动将ESP切换到SYSENTER_ESP_MSR所指向的核心堆栈的 |
|
|
7楼#
发布于:2005-05-17 10:28
谢谢老大!能否将详细些,另外,在xp下,拦截sysEnter后,如何获得调用者信息,如serviceID :P
|
|
|
8楼#
发布于:2005-05-17 09:16
请问,xp下int2e,用作什么?我用softice ,设置断点,发现int2e调用非常频繁!另外,RDMSR WRMSR,中操作的第的176,175,174h的地址具体指的是哪里? XP中Int 2E完全报废,我用softice ,设置断点,发现int2e调用非常频繁!这是Softice骗你的 :D |
|
|
9楼#
发布于:2005-05-16 22:32
请问,xp下int2e,用作什么?我用softice ,设置断点,发现int2e调用非常频繁!另外,RDMSR WRMSR,中操作的第的176,175,174h的地址具体指的是哪里?
|
|
|
10楼#
发布于:2005-05-16 20:09
[quote][quote]其实就两条指令 RDMSR WRMSR,其实我觉得连堆栈都不用换 用户态切换到内核态,不切换堆栈是找“死”。 [/quote] SYSENTER会自动将ESP切换到SYSENTER_ESP_MSR所指向的核心堆栈的 [/quote] 每个线程SYSENTER后EIP是相同的,所以可以预先设好; ESP呢,难道也是相同的吗? |
|
11楼#
发布于:2005-05-16 15:43
[quote]其实就两条指令 RDMSR WRMSR,其实我觉得连堆栈都不用换 用户态切换到内核态,不切换堆栈是找“死”。 [/quote] SYSENTER会自动将ESP切换到SYSENTER_ESP_MSR所指向的核心堆栈的 |
|
|
12楼#
发布于:2005-05-16 13:11
其实就两条指令 RDMSR WRMSR,其实我觉得连堆栈都不用换 用户态切换到内核态,不切换堆栈是找“死”。 |
|
13楼#
发布于:2005-05-15 16:30
其实就两条指令 RDMSR WRMSR,其实我觉得连堆栈都不用换
|
|
|
14楼#
发布于:2005-05-14 18:46
xp下hook int2e有什么用,参考一下这个吧。
// 在XP下Hook Systerm Services的一种方法 // 通过替换MSR_SYSENTER_EIP寄存器的内容,使得系统发出SYSENTER指令后,进入 // 我们自己预设好的处理代码中,而不是系统原有的KiFastCallEntry例程。 // \\myKMD.c #include \"ntddk.h\" #include \"windef.h\" #define TIME_INTERVAL 1000 #pragma pack(1) typedef struct _GDT { WORD GdtLimit; DWORD GdtBase; } GDT,*PGDT; #pragma pack() //ULONG PTSS = 0x40; //KPCR结构中 struct _KTSS *TSS 的偏移量 ULONG RawMSR_SYSENTER_EIP; //保存原始的MSR_SYSENTER_EIP内容 ULONG NewMSR_SYSENTER_EIP; ULONG Val_1; ULONG j; GDT gdt; WORD tr; //************************************************************* // 由mySYSENTER_Proc例程调用。可以把这段代码替换,以达到我们需要的行为。 // 下面的代码只是延迟系统的反应时间。 VOID TestProc( ) { int i; for(i=0;i<10000;i++) { _asm{ inc [j] } } // DbgPrint( \" ####### Test \\n\"); return; } //************************************************************* void __declspec(naked)mySYSENTER_Proc() //系统发出SYSENTER指令后,进入mySYSENTER_Proc的入口处 { _asm { sgdt gdt //设置内核RING0堆栈 str word ptr[tr] movzx ecx,tr add ecx,gdt.GdtBase mov esp,dword ptr[ecx+2] and esp,0ffffffh mov ecx,dword ptr[ecx+4] and ecx,0ff000000h or esp,ecx //esp->tss mov esp,dword ptr[esp+4] pushad pushfd push fs mov bx,0x30 mov fs,bx push ds push es call TestProc; pop es pop ds pop fs popfd popad jmp RawMSR_SYSENTER_EIP; } } NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath); //********************************************************* // 读出MSR[ECX]的值,此处为SYSENTER_EIP_MSR //********************************************************* VOID GetMSR_EIP() { _asm { pushad mov ecx,176h // SYSENTER_EIP_MSR 176H RDMSR mov RawMSR_SYSENTER_EIP,eax popad } DbgPrint( \"MSR_SYSENTER_EIP = %x\\n\",RawMSR_SYSENTER_EIP); return; } //***************************************************** // 设置MSR[ECX]的值,此处为SYSENTER_EIP_MSR //***************************************************** VOID SetMSR_EIP(BOOL SetMyProc) { if(SetMyProc == TRUE) { _asm { pushad CLI xor edx,edx mov eax,mySYSENTER_Proc mov ecx,176h // SYSENTER_EIP_MSR 176H WRMSR STI popad } DbgPrint( \"Set new MSR_SYSENTER_EIP = %x\\n\",mySYSENTER_Proc); } else { _asm { pushad CLI xor edx,edx mov eax,RawMSR_SYSENTER_EIP mov ecx,176h // SYSENTER_EIP_MSR 176H WRMSR STI popad } DbgPrint( \"Set MSR_SYSENTER_EIP = %x\\n\",RawMSR_SYSENTER_EIP); } return; } VOID myDriverUnload ( IN PDRIVER_OBJECT pDriverObject ) { UNICODE_STRING DeviceLinkName; //*********************************************************************************** SetMSR_EIP(FALSE); MmPageEntireDriver( (PVOID) &DriverEntry); //*********************************************************************************** RtlInitUnicodeString( &DeviceLinkName,L\"\\\\DosDevices\\\\myKMD\" ); IoDeleteSymbolicLink( &DeviceLinkName ); IoDeleteDevice( pDriverObject->DeviceObject ); //#if (DBG) //{ DbgPrint( \"######### Unload ! OK!\\n\\n\" ); //} //#endif return; } NTSTATUS myDeviceIrpCreateClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp,IO_NO_INCREMENT ); return STATUS_SUCCESS; } NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) { NTSTATUS Status; UNICODE_STRING DeviceName,DeviceLinkName; PDEVICE_OBJECT DeviceObject; _asm { mov eax,1 cpuid test edx,20h //if support rdmsr jz exit test edx,800h //if support sysenter jz exit } RtlInitUnicodeString(&DeviceName,L\"\\\\Device\\\\myKMD\"); Status=IoCreateDevice( DriverObject,0,&DeviceName, FILE_DEVICE_UNKNOWN,0,FALSE,&DeviceObject); if(!NT_SUCCESS(Status)) return Status; RtlInitUnicodeString(&DeviceLinkName,L\"\\\\DosDevices\\\\myKMD\"); Status=IoCreateSymbolicLink(&DeviceLinkName,&DeviceName); if(!NT_SUCCESS(Status)) { IoDeleteDevice(DriverObject->DeviceObject); return Status; } DriverObject->DriverUnload =myDriverUnload; DriverObject->MajorFunction[IRP_MJ_CREATE ]= DriverObject->MajorFunction[IRP_MJ_CLOSE ]= DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=myDeviceIrpCreateClose; //#if (DBG) //{ DbgPrint(\"######### DriverObject=%x\\n\",DriverObject); //} //#endif //*********************************************************************************** MmLockPagableDataSection( (PVOID) &RawMSR_SYSENTER_EIP); MmLockPagableCodeSection( (PVOID) &mySYSENTER_Proc); GetMSR_EIP(); SetMSR_EIP(TRUE);//将mySYSENTER_Proc设置为SYSENTER的入口 //*********************************************************************************** exit: return STATUS_SUCCESS; } |
|
15楼#
发布于:2005-05-05 21:06
IDA PRO 有5了吗?测试版的吧
|
|
16楼#
发布于:2005-04-25 13:06
已经下载了,准备看一下。 :)
|
|
|
17楼#
发布于:2005-04-25 09:48
没有完全按你的方法做,给你试好了,我还是喜欢动态加载驱动,所以又用了我以前的unwin2k,由于arthurtu老大的E文vs2003,我正下载中,所以周六折腾了一下午,全部重装那个破中文Vs 2003,还是用那个破中文Vs 2003做的。周日作的
结果可能令你吃惊,Xp不用int2e了,绝不,int2e已如末日黄花了,我做的时候,无数次将int 2e设错,但系统丝毫未受影响 |
|
|
18楼#
发布于:2005-04-22 10:51
小狗还很善良,快救偶... 正义之狗,而且还很勇敢。 狗是动物中比较有灵气的啦。 |
|
|
19楼#
发布于:2005-04-22 10:09
[quote] 小狗狗很可爱优,只是版本降低了,从idapro5到idapro47了,偶本想克隆一个,嘻嘻,回去在偶的实验机上跑跑 小狗确实不错,健康活泼又可爱。 [/quote] 小狗还很善良,快救偶... |
|
|
上一页
下一页