请教一个关于inline hook的问题
总能看到有些朋友说inline hook做得很深,也就是说不是从函数头开始跳的,可以从函数的中间跳
函数的中间怎么跳?有没有这样的例子?
或者经验,介绍一下
我大概做了一下,结果蓝了
还有一个,就是有些朋友总说inline hook跟堆栈有关系
我怎么不明白,inline hook就是几个跳转,跟堆栈有啥关系? ok大哥你最近不是在学汇编吗?hook跟堆栈的关系可大了。。。
深层hook比较稳定的是call hook(个人觉得比jmp hook稳定),给个附件你看看。 另外这个月内我会公布在NT6上Hook KiFastCallEntry的完整代码,敬请期待。 回复 2# Tesla.Angela
谢谢兄弟,我看看关于深层hook的代码
再次感谢 回复 3# Tesla.Angela
等待你的这个代码
你的代码不错 看了代码,发现一个问题
如果那个函数没有call,也就是E8,该怎么办? 回复 7# ok100fen
所以说要用反汇编引擎 反汇编引擎?
说说什么意思? 回复 9# ok100fen
就是把机器码转换成汇编代码的功能模块。
比如把
E8 AA BB CC DD
转换为
call DDCCBBAA c语言不是可以嵌入汇编语言吗?
可以直接用call啊 c语言不是可以嵌入汇编语言吗?
可以直接用call啊
ok100fen 发表于 2010-10-6 10:42 http://www.m5home.com/bbs/images/common/back.gif
我的理解:
C语言嵌入汇编,是指能在源代码里进行混合编程,最后编译为固定的代码.
而这里的汇编的意思,应该是动态写入到内存中的汇编代码,这部分并不是编译时就能确定的. 麻烦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;
} 有啥好解释的。。。
比如原本是:call 88776655
我要修改为:call ddccbbaa
上面的一大段代码就是把55 66 77 88修改成aa bb cc dd 尤其是这句
Length = SizeOfCode(cPtr, &pOpcode);//计算当前指令长度 本帖最后由 Tesla.Angela 于 2010-10-7 01:43 编辑
我对hook基本已经厌烦了,很多东西都忘记了。
驱动开发没什么前途,玩玩而已,研究驱动还不如研究化肥呢,全国八亿农民都用得上。 楼上 出神入化了!
页:
[1]