jmp address windows hook

以下代码是sysnap早期发表的inlinehook ObReferenceObjectByHandle()的代码。大部分看懂了,但是有些看不懂,google也查了,qq群也问了。哪位高手有时间给科普下哈~ 可怜下偶们菜鸟吧。。。

__declspec(naked) T_ObReferenceObjectByHandle(
IN HANDLE Handle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_TYPE ObjectType OPTIONAL,
IN KPROCESSOR_MODE AccessMode,
OUT PVOID *Object,
OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
)
{
_asm
{
mov edi,edi //执行被修改的前5个字节
push ebp
mov ebp,esp

push [ebp+0x1c] //参数压栈
push [ebp+0x18]
push [ebp+0x14]
push [ebp+0x10]
push [ebp+0xc]
push [ebp+8] //this parameter is object handle

call MyObReferenceObjectByHandle //调用我们的功能函数 
cmp eax,1 
jz end

mov eax,ObReferenceObjectByHandle //正常运行原来的函数
add eax,5 
jmp eax 

end:
mov [ebp+8],-1 //如果不想让这个函数正常运行..无效句柄就可以
mov eax,ObReferenceObjectByHandle 
add eax,5 //protected the function can success runing 
jmp eax //start run ObReferenceObjectByHandle
}

//对原来函数是否要让其正常运行的判断由MyObReferenceObjectByHandle完成
int MyObReferenceObjectByHandle(
IN HANDLE Handle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_TYPE ObjectType OPTIONAL,
IN KPROCESSOR_MODE AccessMode,
OUT PVOID *Object,
OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
)
{
PEPROCESS Process;
KIRQL oldIrql;
int JmpOffSet;
unsigned char Code[5]={0x8b,0xff,0x55,0x8b,0xec}; //mov edi,edi push ebp mov ebp,esp
unsigned char JmpCode[5] = { 0xe9, 0x00, 0x00, 0x00, 0x00 }; //jmp address

if(*PsProcessType == ObjectType) //判断句柄所属对象类型是不是*PsProcessType
{
oldIrql = KeRaiseIrqlToDpcLevel();

__asm
{
CLI 
MOV eax, CR0 
AND eax, NOT 10000H 
MOV CR0, eax
}

RtlCopyMemory(ObReferenceObjectByHandle,Code,5);//恢复inline hook以便正确调用ObReferenceObjectByHandle 
ObReferenceObjectByHandle(Handle,DesiredAccess,ObjectType,AccessMode,&Process,NULL);

//Procee + 0x174 is this process file name
//this file is im protected
if(_stricmp((char*)((char*)Process+0x174), ProtectName) == 0 )//判断是不是我们要保护的进程
{
//JmpOffset is int type
//JmpOffset Pointer the function qian 5 byte
JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;

//get jmp address to jmp+1 - jmp+4
RtlCopyMemory ( JmpCode+1, &JmpOffSet, 4 );
RtlCopyMemory ( ObReferenceObjectByHandle, JmpCode, 5 );

__asm
{
MOV eax, CR0
OR eax, 10000H
MOV CR0, eax
STI
}

KeLowerIrql(oldIrql);
return 1;
}

//否则再次HOOK这个函数
JmpOffSet= (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
RtlCopyMemory ( JmpCode+1, &JmpOffSet, 4 );
RtlCopyMemory ( ObReferenceObjectByHandle, JmpCode, 5 );

__asm
{
MOV eax, CR0
OR eax, 10000H
MOV CR0, eax
STI
}

KeLowerIrql(oldIrql);

return 0;
}



PsProcessType
这个是什么,在哪定义?一般是用来做什么的。。。

oldIrql = KeRaiseIrqlToDpcLevel();
这条语句做什么的?并且返回值oldIrql是什么啊?

__asm
{
CLI 
MOV eax, CR0 
AND eax, NOT 10000H 
MOV CR0, eax
}



__asm
{
MOV eax, CR0
OR eax, 10000H
MOV CR0, eax
STI
}

是什么意思,大概在google上查了下,貌似和打开/管理 中断请求有关系。。。

JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
为什么最后还要减5呀?
sudami
2009-07-13, 23:27:18
多打基础,就会懂了. 比如你不清楚-5的意思,需要了解Intel指令相关...
不要一口吃个胖子. :3:
emc
2009-07-14, 00:51:49
to sudami:

好吧,我在看看,但是,希望你能帮我解释下,我提出的问题 谢谢。
xacker
2009-07-14, 14:00:47
代码写的有点复杂 中间还夹带了一些汇编 对于新手 确实不大容易理解 
建议LZ 去网上找个C写的R3的detours HOOK 单步调试一下就知道了
六月
2009-07-14, 18:26:22
PsProcessType
这个是什么,在哪定义?一般是用来做什么的。。。

进程类型咯..一般用0就行了.我也不是很清楚这个意思,你参考下就好
-------------------------------------------------------------------------------
oldIrql = KeRaiseIrqlToDpcLevel();
这条语句做什么的?并且返回值oldIrql是什么啊?

保存当前IRQL级别并提高IRQL级别,就是为了不让其他线程调度进来用的...就是提高IRQL中断级别,防止其他线程调度而产生的中断.不过我也不太明白,他这里用了cli关中断了,为什么还要提高IRQL的权限,不太明白,cli关中断的原理不太明白.他这里的IRQL提权是关了软中断,我想cli也是这个意思吧..

-------------------------------------------------------------------------
JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
为什么最后还要减5呀? 

这个我也不知道怎么解释了,自己HOOK一下,算一下应该就明白了!
轩辕小聪
2009-07-14, 18:35:08
如果楼主从没接触过inline hook,那么就如4楼所说应该从Ring3的inline hook开始学,而不是Ring0。
楼主的疑问,并不只是对怎样进行inline hook的疑问,还有一些是不熟悉驱动编程导致的。

PsProcessType是ObReferenceObjectByHandle传入的ObjectType参数,在得到进程的Object的时候使用,楼主参考DDK中关于ObReferenceObjectByHandle的描述,就会知道它是怎么回事了。

oldIrql = KeRaiseIrqlToDpcLevel();
同样参考DDK就会知道这个函数的作用,以及它的返回值(旧的IRQL)

操作CR0的那段则是暂时禁用写保护。

JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
为什么减5,这涉及到机器码jmp命令的偏移是怎么计算的,这是inline hook的基础,楼主如果搞不清楚这个,可以说楼主根本没接触过inline hook。

另外这一段代码也做得并不是很好,因为需要在替代函数中反复HOOK和UNHOOK,这是比较容易出问题的一种方式,不是inline hook提倡的方式。
emc
2009-07-14, 21:34:22
谢谢4喽和5喽的解释。

to 轩辕小聪:

我之前学习驱动,只是看了“楚狂人”所写的“windows驱动编程基础教程”,并且调试了helloworld和ioctrl的那2个代码。
之前我有参考ddk document中的ObReferenceObjectByHandle()中,但是没有找到"PsProcessType"的解释,而且参看sysnap的代码中并没有定义和解释PsProcessType,现在我只是知道用它来判断一个对象是不是一个进程。
不过谢谢大家的解释了,我自己在google下吧。
achillis
2009-07-14, 22:17:11
Hook完全可以在ring3下练习~
emc
2009-07-14, 23:05:29
to achillis:

inline hook 可以在ring3写练习?
hatling
2009-07-15, 00:20:22
to achillis:

inline hook 可以在ring3写练习?

看来你还没明白什么是inline
radarhp
2009-07-15, 00:45:44
-5 不就是因为写入了5个字节长度的跳转指令呗。。。
一个比一个神秘
六月
2009-07-15, 10:57:36
to achillis:

inline hook 可以在ring3写练习?

inline hook意思就是在函数体内hook 进入到过滤函数,比如可以通过jmp ,call,push等.实现转入过滤函数(就是你写的判断函数)...这就是inline hook 和R0 R3没关系,只是一种方式而已...

inline反正意思就是在函数体内挂钩..
achillis
2009-07-15, 17:53:03
那么多的hook教程,似乎没有一篇足够凝炼~
emc
2009-07-16, 09:09:13
to 13#:

貌似那些hook教程都直接是code....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值