ok100fen 发表于 2010-10-5 00:24:11

请教一个关于inline hook的问题

总能看到有些朋友说inline hook做得很深,
也就是说不是从函数头开始跳的,可以从函数的中间跳
函数的中间怎么跳?有没有这样的例子?
或者经验,介绍一下
我大概做了一下,结果蓝了
还有一个,就是有些朋友总说inline hook跟堆栈有关系
我怎么不明白,inline hook就是几个跳转,跟堆栈有啥关系?

Tesla.Angela 发表于 2010-10-5 15:56:17

ok大哥你最近不是在学汇编吗?hook跟堆栈的关系可大了。。。
深层hook比较稳定的是call hook(个人觉得比jmp hook稳定),给个附件你看看。

Tesla.Angela 发表于 2010-10-5 15:57:54

另外这个月内我会公布在NT6上Hook KiFastCallEntry的完整代码,敬请期待。

ok100fen 发表于 2010-10-5 18:40:56

回复 2# Tesla.Angela




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

再次感谢

ok100fen 发表于 2010-10-5 18:41:40

回复 3# Tesla.Angela



等待你的这个代码


你的代码不错

ok100fen 发表于 2010-10-6 00:01:23

看了代码,发现一个问题
如果那个函数没有call,也就是E8,该怎么办?

Tesla.Angela 发表于 2010-10-6 00:06:09

回复 7# ok100fen


    所以说要用反汇编引擎

ok100fen 发表于 2010-10-6 08:01:43

反汇编引擎?


说说什么意思?

Tesla.Angela 发表于 2010-10-6 10:22:58

回复 9# ok100fen


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

ok100fen 发表于 2010-10-6 10:42:32

c语言不是可以嵌入汇编语言吗?
可以直接用call啊

马大哈 发表于 2010-10-6 16:13:36

c语言不是可以嵌入汇编语言吗?
可以直接用call啊
ok100fen 发表于 2010-10-6 10:42 http://www.m5home.com/bbs/images/common/back.gif


    我的理解:

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

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

ok100fen 发表于 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;
}

Tesla.Angela 发表于 2010-10-6 23:57:57

有啥好解释的。。。
比如原本是:call 88776655
我要修改为:call ddccbbaa
上面的一大段代码就是把55 66 77 88修改成aa bb cc dd

ok100fen 发表于 2010-10-7 00:02:33

尤其是这句

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

Tesla.Angela 发表于 2010-10-7 00:02:38

本帖最后由 Tesla.Angela 于 2010-10-7 01:43 编辑

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

oopww 发表于 2010-10-10 10:45:57

楼上 出神入化了!
页: [1]
查看完整版本: 请教一个关于inline hook的问题