20楼#
发布于:2005-04-25 13:06
已经下载了,准备看一下。 :)
|
|
|
21楼#
发布于:2005-05-05 21:06
IDA PRO 有5了吗?测试版的吧
|
|
22楼#
发布于: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; } |
|
23楼#
发布于:2005-05-15 16:30
其实就两条指令 RDMSR WRMSR,其实我觉得连堆栈都不用换
|
|
|
24楼#
发布于:2005-05-16 13:11
其实就两条指令 RDMSR WRMSR,其实我觉得连堆栈都不用换 用户态切换到内核态,不切换堆栈是找“死”。 |
|
25楼#
发布于:2005-05-16 15:43
[quote]其实就两条指令 RDMSR WRMSR,其实我觉得连堆栈都不用换 用户态切换到内核态,不切换堆栈是找“死”。 [/quote] SYSENTER会自动将ESP切换到SYSENTER_ESP_MSR所指向的核心堆栈的 |
|
|
26楼#
发布于:2005-05-16 20:09
[quote][quote]其实就两条指令 RDMSR WRMSR,其实我觉得连堆栈都不用换 用户态切换到内核态,不切换堆栈是找“死”。 [/quote] SYSENTER会自动将ESP切换到SYSENTER_ESP_MSR所指向的核心堆栈的 [/quote] 每个线程SYSENTER后EIP是相同的,所以可以预先设好; ESP呢,难道也是相同的吗? |
|
27楼#
发布于:2005-05-16 22:32
请问,xp下int2e,用作什么?我用softice ,设置断点,发现int2e调用非常频繁!另外,RDMSR WRMSR,中操作的第的176,175,174h的地址具体指的是哪里?
|
|
|
28楼#
发布于:2005-05-17 09:16
请问,xp下int2e,用作什么?我用softice ,设置断点,发现int2e调用非常频繁!另外,RDMSR WRMSR,中操作的第的176,175,174h的地址具体指的是哪里? XP中Int 2E完全报废,我用softice ,设置断点,发现int2e调用非常频繁!这是Softice骗你的 :D |
|
|
29楼#
发布于:2005-05-17 10:28
谢谢老大!能否将详细些,另外,在xp下,拦截sysEnter后,如何获得调用者信息,如serviceID :P
|
|
|
30楼#
发布于: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所指向的核心堆栈的 |
|
|
31楼#
发布于: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 |
|
|
32楼#
发布于: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做些处理,因为他也改了系统不少东西,嘿嘿...... |
|
|
33楼#
发布于:2005-05-17 23:07
谢谢!Xp下,eax寄存器的值是 serviceID?确定吗?
我是了一下,好像不对? |
|
|
34楼#
发布于: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 |
|
35楼#
发布于:2005-05-18 09:37
谢谢!Xp下,eax寄存器的值是 serviceID?确定吗? 可以肯定,看ntdll中语句,mov eax,服务号 |
|
|
上一页
下一页