找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 8557|回复: 15

请教一个关于inline hook的问题

 火... [复制链接]

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-10-5 00:24:11 | 显示全部楼层 |阅读模式
总能看到有些朋友说inline hook做得很深,
也就是说不是从函数头开始跳的,可以从函数的中间跳
函数的中间怎么跳?有没有这样的例子?
或者经验,介绍一下
我大概做了一下,结果蓝了
还有一个,就是有些朋友总说inline hook跟堆栈有关系
我怎么不明白,inline hook就是几个跳转,跟堆栈有啥关系?

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-10-5 15:56:17 | 显示全部楼层
ok大哥你最近不是在学汇编吗?hook跟堆栈的关系可大了。。。
深层hook比较稳定的是call hook(个人觉得比jmp hook稳定),给个附件你看看。

calladdrhook.rar

51.08 KB, 阅读权限: 30, 下载次数: 4

售价: 1 水晶币  [记录]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-10-5 15:57:54 | 显示全部楼层
另外这个月内我会公布在NT6上Hook KiFastCallEntry的完整代码,敬请期待。

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-10-5 18:40:56 | 显示全部楼层
回复 2# Tesla.Angela




谢谢兄弟,我看看关于深层hook的代码

再次感谢

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-10-5 18:41:40 | 显示全部楼层
回复 3# Tesla.Angela



等待你的这个代码


你的代码不错

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-10-6 00:01:23 | 显示全部楼层
看了代码,发现一个问题
如果那个函数没有call,也就是E8,该怎么办?

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-10-6 00:06:09 | 显示全部楼层
回复 7# ok100fen


    所以说要用反汇编引擎

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-10-6 08:01:43 | 显示全部楼层
反汇编引擎?


说说什么意思?

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-10-6 10:22:58 | 显示全部楼层
回复 9# ok100fen


就是把机器码转换成汇编代码的功能模块。
比如把
E8 AA BB CC DD
转换为
call DDCCBBAA

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-10-6 10:42:32 | 显示全部楼层
c语言不是可以嵌入汇编语言吗?
可以直接用call啊

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-10-6 16:13:36 | 显示全部楼层
c语言不是可以嵌入汇编语言吗?
可以直接用call啊
ok100fen 发表于 2010-10-6 10:42



    我的理解:

C语言嵌入汇编,是指能在源代码里进行混合编程,最后编译为固定的代码.

而这里的汇编的意思,应该是动态写入到内存中的汇编代码,这部分并不是编译时就能确定的.

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-10-6 23:35:28 | 显示全部楼层
麻烦TA给注释一下,这几句代码不太明白
谢谢

BOOL CallAddrHook(PVOID StartAddr,PVOID OldAddr,PVOID NewAddr,ULONG Size)
{
        PUCHAR cPtr, pOpcode;
        ULONG Length,Tmp;
        for (cPtr=StartAddr;(ULONG)cPtr<(ULONG)StartAddr+Size;cPtr += Length)
        {
                Length = SizeOfCode(cPtr, &pOpcode);//计算当前指令长度
                if (!Length) break;
                if (Length ==5 && *cPtr==0xE8)// 当前长度5 且第一字节为E8
                {//因为CALL用的是相对偏移  所以我们还需要进行计算相对偏移
                        if ( (ULONG)OldAddr-(ULONG)cPtr-5 == *(PULONG)(cPtr+1)) //判断当前是否为OldAddr的CALL相对地址
                        {
                                Tmp=(ULONG)NewAddr-(ULONG)cPtr-5;//我们的CALL地址相对偏移
                                MemOpen();
                                *(PULONG)(cPtr+1)=Tmp;//直接替换为我们的FAKE函数地址 (微点在这里不是直接替换它的FAKE地址 还加了一层跳板)  
                                MemClose();
                                return TRUE;
                        }
                }
        }
        return FALSE;
}

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-10-6 23:57:57 | 显示全部楼层
有啥好解释的。。。
比如原本是:call 88776655[e8 55 66 77 88]
我要修改为:call ddccbbaa[e8 aa bb cc dd]

上面的一大段代码就是把55 66 77 88修改成aa bb cc dd

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-10-7 00:02:33 | 显示全部楼层
尤其是这句

Length = SizeOfCode(cPtr, &pOpcode);//计算当前指令长度

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-10-7 00:02:38 | 显示全部楼层
本帖最后由 Tesla.Angela 于 2010-10-7 01:43 编辑

我对hook基本已经厌烦了,很多东西都忘记了。
驱动开发没什么前途,玩玩而已,研究驱动还不如研究化肥呢,全国八亿农民都用得上。

9

主题

210

回帖

0

精华

初来乍到

积分
904
发表于 2010-10-10 10:45:57 | 显示全部楼层
楼上 出神入化了!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表