首页
社区
课程
招聘
[求助]Inline Hook怎么写?
发表于: 2014-3-21 16:10 5600

[求助]Inline Hook怎么写?

2014-3-21 16:10
5600
//自己的处理函数
__declspec(naked) VOID
My_Function()
{
        xxx;
}

ULONG My_HookAddress;  //要Hook的地址

//跳转代码
UCHAR JmpAddress[6] = {0xe9, 0, 0, 0, 0, 0x90};

//开始 Hook,在要 Hook 的地址处写入跳转代码
RtlCopyMemory((PVOID)My_HookAddress, JmpAddress, 6);

//下面这句通过WinDBG调试出现错误,求教原因!或是该怎么写代码??

//在跳转代码 jmp 后4个字节写入自己的处理函数的地址
*(ULONG *)(My_HookAddress + 1) = (ULONG)My_Function;
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
贴dump图。
2014-3-21 16:21
0
雪    币: 67
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
WinDBG提示是:访问冲突, second change

加载驱动不是直接蓝屏,一开始不出错,要等个5、6秒左右就出错
我在My_Function中的最开头用KdPrint打印信息,发现根本没运行到My_Function来
2014-3-21 16:29
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
__asm
        {
                cli
                mov  eax,cr0
                and  eax,not 10000h
                mov  cr0,eax
        }

        __asm
        {
                mov  eax,cr0
                or   eax,10000h
                mov  cr0,eax
                sti
        }
2014-3-21 16:37
0
雪    币: 209
活跃值: (798)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不是这个原因吧
2014-3-21 17:05
0
雪    币: 67
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不是楼上的原因,内存开关和中断请求级都加了的!

  DisableMemoryProtect();
  irql = KeRaiseIrqlToDpcLevel();
  
  //参数:目的、来源、长度
  RtlCopyMemory((PVOID)My_HookAddress, JmpAddress, 6);  //开始 Hook,写入跳转代码到要 Hook 的地址
  
  *(ULONG *)(My_HookAddress + 1) = (ULONG)My_Function;  //在 jmp 后4个字节写入自己的处理函数的地址
  
  KeLowerIrql(irql);
  EnableMemoryProtect();
2014-3-21 17:07
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你发上来的代码似乎没啥问题……请放完整的bin或代码
顺便附上我测试通过的hook代码,你可以参考下,排除排除问题
void Hook (PVOID HookAdd,PVOID NewAdd,PVOID ProxyNewAdd)
{
        ULONG PatchSize;
        BYTE HookCode[5] = { 0xE9, 0, 0, 0, 0 };
        BYTE JmpCode[7] = { 0xEA, 0, 0, 0, 0, 0x08, 0x00 };
        PatchSize = GetPatchSize(HookAdd,5);
        RtlCopyMemory( (PBYTE)ProxyNewAdd,(PBYTE)HookAdd,PatchSize);
        *( (PULONG)(JmpCode + 1) ) = (ULONG) ( (PBYTE)HookAdd + PatchSize );
        RtlCopyMemory( (PBYTE)ProxyNewAdd+ PatchSize, JmpCode, 7);
        *( (ULONG*)(HookCode + 1) ) = (ULONG)NewAdd - (ULONG)HookAdd - 5;
        __asm
        {
                cli
                mov  eax,cr0
                and  eax,not 10000h
                mov  cr0,eax
        }
        RtlCopyMemory(HookAdd, HookCode, 5);
        __asm
        {
                mov  eax,cr0
                or   eax,10000h
                mov  cr0,eax
                sti
        }
}
2014-3-21 19:05
0
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主的是多核,还是单核,2中同步要不同的方式哦
2014-3-21 21:22
0
雪    币: 119
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
经典内联汇编,,,,,,,,,,,,,
2014-3-22 11:11
0
雪    币: 227
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
*(ULONG *)(My_HookAddress + 1) = (ULONG)My_Function; //E9 是相对跳转
2014-3-22 11:15
0
雪    币: 67
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
自己搞定了,谢谢几位大哥!
2014-3-22 11:54
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
你这个问题~真的不知道该说什么,*(ULONG *)(My_HookAddress + 1) = (ULONG)My_Function;
//写到跳转码里的是偏移,百度汇编jmp原理//顺便说一句,我写inline hook也老是蓝屏//
还有啊,那个要把页面保护关掉的,我看评论里已经有了
2014-4-7 23:05
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主求联系,扣扣1033244315。私信没KX
2014-4-7 23:22
0
雪    币: 37
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
[QUOTE=rqqeq;1269750]你发上来的代码似乎没啥问题……请放完整的bin或代码
顺便附上我测试通过的hook代码,你可以参考下,排除排除问题
void Hook (PVOID HookAdd,PVOID NewAdd,PVOID ProxyNewAdd)
{
        ULONG PatchSize;
        BYTE HookCode[...[/QUOTE]

赞一个 这代码经典 可用度高 LZ又是一个被国内的坑爹牛写的坑爹代码欺骗的可怜孩子
2014-4-7 23:57
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
等会试一试啊
2014-4-8 00:45
0
游客
登录 | 注册 方可回帖
返回
//