首页
社区
课程
招聘
[旧帖] [求助]hook一内核函数之后为啥跳转到一奇怪的地方? 0.00雪花
发表于: 2013-7-21 12:21 1600

[旧帖] [求助]hook一内核函数之后为啥跳转到一奇怪的地方? 0.00雪花

2013-7-21 12:21
1600
求助。。。最近学习hook了xp下的IofCallDriver 内核函数,windbg看内存也成功的把jmp之后的地址修改成自己的函数地址了,但是我在IofCallDriver下了断点,单步调试却跳转到一奇怪的地方。下面是具体内容

这是hook之前

kd> u IofCallDriver
nt!IofCallDriver:
804ef120 ff2500d25480    jmp     dword ptr [nt!pIofCallDriver (8054d200)]
804ef126 cc              int     3
804ef127 cc              int     3
804ef128 cc              int     3
804ef129 cc              int     3
804ef12a cc              int     3
804ef12b cc              int     3

然后hook之后

nt!IofCallDriver:
804ef120 ff2590b087f8    jmp     dword ptr ds:[0F887B090h]
804ef126 cc              int     3
804ef127 cc              int     3
804ef128 cc              int     3
804ef129 cc              int     3
804ef12a cc              int     3
804ef12b cc              int     3

查看f887b090也是自己的函数代码区

之后下断点,调试,却发现jmp到 8b55ff8b

nt!IofCallDriver:
804ef120 ff25903085f8    jmp     dword ptr [hook_iofcalldriver!MypIofCallDriver (f8853090)]
Net COM port baud is ignored
kd> p
8b55ff8b ??              ???

求大神解释啊

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
附上hook的驱动代码

#include <Ntddk.h>
#include <ntdef.h>

typedef NTSTATUS (*_MyIoCallDriver)(
  _In_     PDEVICE_OBJECT DeviceObject,
  _Inout_  PIRP Irp
);

ULONG        OldpIofCallDriver = 0;

NTSTATUS        MypIofCallDriver(_In_        PDEVICE_OBJECT DeviceObject,
                           _Inout_ PIRP Irp)
{
        DbgPrint("my hook\n");
        _asm
        {
                mov                eax,dword ptr [OldpIofCallDriver]
                add                esp,4
                jmp                eax       
        }
}
NTSTATUS MyHook(_MyIoCallDriver NewFun )
{
        UNICODE_STRING                OldFunName;       
        PVOID                                IofCallDriverAddress;

        RtlInitUnicodeString(&OldFunName , L"IofCallDriver");

        IofCallDriverAddress = MmGetSystemRoutineAddress( &OldFunName );
        if( IofCallDriverAddress == NULL)
                return        -1;

        OldpIofCallDriver = (ULONG)InterlockedExchange( ((LONG)IofCallDriverAddress+2) , (LONG)NewFun);

        if(OldpIofCallDriver)
                return STATUS_SUCCESS;
        else
                return -1;

}
NTSTATUS DriverEntry( PDRIVER_OBJECT DriverObject,
                                         PUNICODE_STRING RegistePath)
{
        NTSTATUS        Status;

        /*OldMyCallDriver = ExAllocatePoolWithTag(NonPagedPool,
                4,
                'kooh');*/
       
        Status = MyHook( MypIofCallDriver );
        return        STATUS_SUCCESS;
}
2013-7-21 12:24
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
3
曾经我以为,能否hook IofCallDriver这个函数的人不简单,现在楼主毁了我的三观。
2013-7-22 09:19
0
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
咋了。。。。。我不是故意的。。。。
2013-7-22 15:15
0
游客
登录 | 注册 方可回帖
返回
//