idaxsy
驱动大牛
驱动大牛
  • 注册日期2004-12-09
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望54点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:4129回复:35

winxp下hook中断的问题

楼主#
更多 发布于:2005-04-19 13:41
缘起:在winxp下,我参考《解析Windows2000的IDT扩展机制》写了一个hook 0x2e中断的driver,可是我的NewISR始终执行不到。

问题:winxp下综合运用了sysenter和int,难道不能把win2000的hook方法照搬到winxp下来呢?

最新喜欢:

cyliucyliu
[b]万水千山总是情,回个帖子行不行?[/b]
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-18 09:37
谢谢!Xp下,eax寄存器的值是 serviceID?确定吗?
我是了一下,好像不对?

可以肯定,看ntdll中语句,mov eax,服务号
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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
alexe_chen
驱动小牛
驱动小牛
  • 注册日期2002-03-21
  • 最后登录2006-07-31
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-17 23:07
谢谢!Xp下,eax寄存器的值是 serviceID?确定吗?
我是了一下,好像不对?
好好学习,天天向上...
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于: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做些处理,因为他也改了系统不少东西,嘿嘿......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
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
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
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所指向的核心堆栈的
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
alexe_chen
驱动小牛
驱动小牛
  • 注册日期2002-03-21
  • 最后登录2006-07-31
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-17 10:28
谢谢老大!能否将详细些,另外,在xp下,拦截sysEnter后,如何获得调用者信息,如serviceID :P
好好学习,天天向上...
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-05-17 09:16
请问,xp下int2e,用作什么?我用softice ,设置断点,发现int2e调用非常频繁!另外,RDMSR WRMSR,中操作的第的176,175,174h的地址具体指的是哪里?

 

XP中Int 2E完全报废,我用softice ,设置断点,发现int2e调用非常频繁!这是Softice骗你的 :D
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
alexe_chen
驱动小牛
驱动小牛
  • 注册日期2002-03-21
  • 最后登录2006-07-31
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-05-16 22:32
请问,xp下int2e,用作什么?我用softice ,设置断点,发现int2e调用非常频繁!另外,RDMSR WRMSR,中操作的第的176,175,174h的地址具体指的是哪里?

好好学习,天天向上...
freshwt
驱动牛犊
驱动牛犊
  • 注册日期2002-08-19
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-05-16 20:09
[quote][quote]其实就两条指令 RDMSR WRMSR,其实我觉得连堆栈都不用换

用户态切换到内核态,不切换堆栈是找“死”。 [/quote]
SYSENTER会自动将ESP切换到SYSENTER_ESP_MSR所指向的核心堆栈的 [/quote]
每个线程SYSENTER后EIP是相同的,所以可以预先设好;
ESP呢,难道也是相同的吗?
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-05-16 15:43
[quote]其实就两条指令 RDMSR WRMSR,其实我觉得连堆栈都不用换

用户态切换到内核态,不切换堆栈是找“死”。 [/quote]
SYSENTER会自动将ESP切换到SYSENTER_ESP_MSR所指向的核心堆栈的
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
freshwt
驱动牛犊
驱动牛犊
  • 注册日期2002-08-19
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-05-16 13:11
其实就两条指令 RDMSR WRMSR,其实我觉得连堆栈都不用换

用户态切换到内核态,不切换堆栈是找“死”。
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-05-15 16:30
其实就两条指令 RDMSR WRMSR,其实我觉得连堆栈都不用换
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
freshwt
驱动牛犊
驱动牛犊
  • 注册日期2002-08-19
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
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;
}
 
10286
驱动牛犊
驱动牛犊
  • 注册日期2005-05-05
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-05-05 21:06
IDA PRO 有5了吗?测试版的吧
idaxsy
驱动大牛
驱动大牛
  • 注册日期2004-12-09
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望54点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-04-25 13:06
已经下载了,准备看一下。 :)
[b]万水千山总是情,回个帖子行不行?[/b]
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-04-25 09:48
没有完全按你的方法做,给你试好了,我还是喜欢动态加载驱动,所以又用了我以前的unwin2k,由于arthurtu老大的E文vs2003,我正下载中,所以周六折腾了一下午,全部重装那个破中文Vs 2003,还是用那个破中文Vs 2003做的。周日作的
结果可能令你吃惊,Xp不用int2e了,绝不,int2e已如末日黄花了,我做的时候,无数次将int 2e设错,但系统丝毫未受影响
附件名称/大小 下载次数 最后更新
2005-04-25_UnWin2k_2E.rar (2885KB)  63
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
idaxsy
驱动大牛
驱动大牛
  • 注册日期2004-12-09
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望54点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-04-22 10:51
 
小狗还很善良,快救偶...

 


正义之狗,而且还很勇敢。
狗是动物中比较有灵气的啦。
[b]万水千山总是情,回个帖子行不行?[/b]
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-04-22 10:09
[quote] 小狗狗很可爱优,只是版本降低了,从idapro5到idapro47了,偶本想克隆一个,嘻嘻,回去在偶的实验机上跑跑


小狗确实不错,健康活泼又可爱。 [/quote]
小狗还很善良,快救偶...
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
上一页
游客

返回顶部