首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

驱动开发:内核层InlineHook挂钩函数

在上一章《驱动开发:内核LDE64引擎计算汇编长度》中,LyShark教大家如何通过LDE64引擎实现计算反汇编指令长度,本章将在此基础之上实现内联函数挂钩,内核中的InlineHook函数挂钩其实与应用层一致...,都是使用劫持执行流并跳转到我们自己的函数上来做处理,唯一的不同的是内核Hook只针对内核API函数,但由于其身处在最底层所以一旦被挂钩其整个应用层都将会受到影响,这就直接决定了在内核层挂钩的效果是应用层无法比拟的...挂钩的原理可以总结为,通过MmGetSystemRoutineAddress得到原函数地址,然后保存该函数的前15个字节的指令,将自己的MyPsLookupProcessByProcessId代理函数地址写出到原始函数上...ffffd60bc036f080 HandleCount: 159.Image: lyshark.exe*/protect_eprocess = 0xffff9a0a44ec4080;// Hook挂钩函数...;图片使用WinDBG观察,会发现挂钩后原函数已经被替换掉了,而被替换的地址就是我们自己的MyPsLookupProcessByProcessId函数

58030
您找到你想要的搜索结果了吗?
是的
没有找到

4.5 MinHook 挂钩技术

MinHook是一个轻量级的Hooking库,可以在运行时劫持函数调用。它支持钩子API函数和普通函数,并且可以运行在32位和64位Windows操作系统上。其特点包括易于使用、高性能和低内存占用。...,当程序调用MessageBoxA时,会调用MyMessageBoxA函数代替原来的MessageBoxA函数进行处理,而MyMessageBoxA函数会将调用信息改成Hook Inject。...在DllMain函数中,如果是DLL进程附加事件,则执行SetHook函数,如果是DLL进程分离事件,则执行UnHook函数禁用和释放钩子。...如下代码通过对SetWindowTextA函数进行挂钩,当读者点击设置标题是则触发自定义fpSetWindowTextA函数,该函数内部通过调用自定义标题修改函数实现了将当前软件标题替换为破解版本,并返回给用户...通过对该进程进行挂钩,即可实现监控应用层其他进程创建或销毁的目的,读者可自行使用64位库编译下方代码,并注入到explorer.exe进程中,即可实现监控进程的创建功能。

17820

4.5 MinHook 挂钩技术

MinHook是一个轻量级的Hooking库,可以在运行时劫持函数调用。它支持钩子API函数和普通函数,并且可以运行在32位和64位Windows操作系统上。其特点包括易于使用、高性能和低内存占用。...,当程序调用MessageBoxA时,会调用MyMessageBoxA函数代替原来的MessageBoxA函数进行处理,而MyMessageBoxA函数会将调用信息改成Hook Inject。...在DllMain函数中,如果是DLL进程附加事件,则执行SetHook函数,如果是DLL进程分离事件,则执行UnHook函数禁用和释放钩子。...如下代码通过对SetWindowTextA函数进行挂钩,当读者点击设置标题是则触发自定义fpSetWindowTextA函数,该函数内部通过调用自定义标题修改函数实现了将当前软件标题替换为破解版本,并返回给用户...通过对该进程进行挂钩,即可实现监控应用层其他进程创建或销毁的目的,读者可自行使用64位库编译下方代码,并注入到explorer.exe进程中,即可实现监控进程的创建功能。

33940

4.4 EAT Hook 挂钩技术

它的原理是通过修改DLL的导出函数地址,将原本要导出的函数指向另一个自定义的函数。这样,在应用程序调用DLL的导出函数时,实际上会执行自定义的函数。...定位导出函数:根据导出函数的名称或序号,在导出表中找到目标函数的位置。保存原始函数地址:将目标函数的地址保存下来,以便后续恢复。修改导出函数地址:将目标函数在导出表中对应的地址修改为自定义函数的地址。...实现自定义函数:编写自定义的函数,该函数会在被钩子函数被调用时执行。调用原始函数:在自定义函数中,可以选择是否调用原始的被钩子函数。...与IAT不同是EAT存放的不是函数地址,而是导出函数地址的偏移,使用时需要加上指定Dll的模块基地址,当Hook挂钩之后,所有试图通过导出表获取函数地址的行为都会受到影响,EATHook并不会直接生效,...循环查找导出表的导出函数是否与我们的函数名称一致,一致则取出导出函数地址。

16210

4.2 Inline Hook 挂钩技术

如下封装中实现了三个类内函数,其中Hook()用于开始Hook函数,此函数接收三个参数,参数1为需要Hook的动态链接库名,参数2为需要挂钩函数名,参数3为自定以中转函数地址,其中UnHook()用于恢复函数挂钩...,最后的ReHook()用于重新挂钩,以下是该类提供的功能的简要摘要: m_pfnRig:成员变量,在挂接之前存储原始函数地址。...Hook():成员函数,通过将函数入口代码的前5个字节替换为JMP指令,将控制流重定向到指定的钩子函数,从而在指定的模块中钩子指定的函数。此函数返回一个BOOL,指示挂钩是否成功。...UnHook():成员函数,用于删除钩子并恢复原始函数代码。此函数返回一个BOOL,指示解除挂钩是否成功。 ReHook():成员函数,它使用之前存储的钩子代码重新钩子之前未钩子的函数。...此函数返回一个BOOL,指示重新挂钩是否成功。

22630

4.3 IAT Hook 挂钩技术

IAT是一个数据结构,其中包含了应用程序在运行时使用的导入函数的地址。IAT Hook的原理是通过修改IAT中的函数指针,将原本要调用的函数指向另一个自定义的函数。...IAT Hook的步骤通常包括以下几个步骤:获取目标函数的地址:通过遍历模块的导入表,找到目标函数在DLL中的地址。保存原始函数地址:将目标函数的地址保存下来,以便后续恢复。...修改IAT表项:将目标函数在IAT中对应的函数指针修改为自定义函数的地址。实现自定义函数:编写自定义的函数,该函数会在被钩子函数被调用时执行。...调用原始函数:在自定义函数中,可以选择是否调用原始的被钩子函数。...,输出效果如下图所示;图片当有了枚举导入表功能,则下一步是寻找特定函数的导入地址,以MessageBoxA函数为例,该函数的导入地址是0x0047d3a0此时我们只需要在此处进行挂钩,并转向即可实现劫持效果

49620

4.4 EAT Hook 挂钩技术

它的原理是通过修改DLL的导出函数地址,将原本要导出的函数指向另一个自定义的函数。这样,在应用程序调用DLL的导出函数时,实际上会执行自定义的函数。...定位导出函数:根据导出函数的名称或序号,在导出表中找到目标函数的位置。 保存原始函数地址:将目标函数的地址保存下来,以便后续恢复。...修改导出函数地址:将目标函数在导出表中对应的地址修改为自定义函数的地址。 实现自定义函数:编写自定义的函数,该函数会在被钩子函数被调用时执行。...调用原始函数:在自定义函数中,可以选择是否调用原始的被钩子函数。...与IAT不同是EAT存放的不是函数地址,而是导出函数地址的偏移,使用时需要加上指定Dll的模块基地址,当Hook挂钩之后,所有试图通过导出表获取函数地址的行为都会受到影响,EATHook并不会直接生效,

14510

4.2 Inline Hook 挂钩技术

如下封装中实现了三个类内函数,其中Hook()用于开始Hook函数,此函数接收三个参数,参数1为需要Hook的动态链接库名,参数2为需要挂钩函数名,参数3为自定以中转函数地址,其中UnHook()用于恢复函数挂钩...,最后的ReHook()用于重新挂钩,以下是该类提供的功能的简要摘要:m_pfnRig:成员变量,在挂接之前存储原始函数地址。...Hook():成员函数,通过将函数入口代码的前5个字节替换为JMP指令,将控制流重定向到指定的钩子函数,从而在指定的模块中钩子指定的函数。此函数返回一个BOOL,指示挂钩是否成功。...UnHook():成员函数,用于删除钩子并恢复原始函数代码。此函数返回一个BOOL,指示解除挂钩是否成功。ReHook():成员函数,它使用之前存储的钩子代码重新钩子之前未钩子的函数。...此函数返回一个BOOL,指示重新挂钩是否成功。

39420

4.3 IAT Hook 挂钩技术

IAT是一个数据结构,其中包含了应用程序在运行时使用的导入函数的地址。 IAT Hook的原理是通过修改IAT中的函数指针,将原本要调用的函数指向另一个自定义的函数。...IAT Hook的步骤通常包括以下几个步骤: 获取目标函数的地址:通过遍历模块的导入表,找到目标函数在DLL中的地址。 保存原始函数地址:将目标函数的地址保存下来,以便后续恢复。...修改IAT表项:将目标函数在IAT中对应的函数指针修改为自定义函数的地址。 实现自定义函数:编写自定义的函数,该函数会在被钩子函数被调用时执行。...调用原始函数:在自定义函数中,可以选择是否调用原始的被钩子函数。...,输出效果如下图所示; 当有了枚举导入表功能,则下一步是寻找特定函数的导入地址,以MessageBoxA函数为例,该函数的导入地址是0x0047d3a0此时我们只需要在此处进行挂钩,并转向即可实现劫持效果

22740

挂钩图形内核子系统

当今的作弊行为主要是使用内部Directx挂钩或窗口覆盖图来可视化隐藏的游戏信息。这两种方法已被广泛记录,但其他更不起眼的方法包括在Windows内核中挂接图形例程,正如我们将在本文中演示的那样。...所述D3DKMTSubmitCommand函数传递一个参数:实例D3DKMT_SUBMITCOMMAND结构。...NtGdiDdDDISubmitCommand 数据成员的这种异常函数调用实际上是整个dxgkrnl抽象层的较大函数表的一部分,该函数表既未记录在符号中,也未导出到二进制文件中,这可能解释了作弊中这种图形使用类型的异常疏忽...要进行实际绘制,我们可以直接在内核中使用任何Gdi函数,而不会出现任何问题!...如果您不想自己尝试使用该方法,则此视频对播放器盒使用了完全相同的方法,这演示了我们前面提到的内核挂钩的完美同步。

2.9K392

4.1 应用层Hook挂钩原理分析

它使用钩子函数(也可以称为回调函数)来截获程序执行的各种事件,并在事件发生前或后进行自定义处理,从而控制或增强程序行为。Hook技术常被用于系统加速、功能增强、等领域。...本章将重点讲解Hook是如何实现的,并手动封装实现自己的Hook挂钩模板。...首先我们来探索一下Hook技术是如何实现的,如下图所示是一个简单的弹窗程序,当读者点击测试弹窗按钮时则会弹出一个MessageBox提示窗口,本次实现目标很简单,通过向目标内注入一个DLL库,实现Hook挂钩住...由于开头位置被替换为了我们自己的Transfer()函数,当程序中弹窗被调用时默认会路由到我们自己的函数内,首先执行补齐原函数的替换部分,并执行自定义功能区中的增加内容,当执行结束后则通过jmp ebx...的方式跳转回原函数的ret 0x10的位置处,从而实现增加功能的目的。

21520

5.9 Windows驱动开发:内核InlineHook挂钩技术

在上一章《内核LDE64引擎计算汇编长度》中,LyShark教大家如何通过LDE64引擎实现计算反汇编指令长度,本章将在此基础之上实现内联函数挂钩,内核中的InlineHook函数挂钩其实与应用层一致,...都是使用劫持执行流并跳转到我们自己的函数上来做处理,唯一的不同的是内核Hook只针对内核API函数,但由于其身处在最底层所以一旦被挂钩其整个应用层都将会受到影响,这就直接决定了在内核层挂钩的效果是应用层无法比拟的...内核挂钩的原理是一种劫持系统函数调用的技术,用于在运行时对系统函数进行修改或者监控。...挂钩的具体步骤如下: 1.使用MmGetSystemRoutineAddress函数获取要被劫持的函数地址。...而如果需要恢复挂钩状态,则只需要还原提前保存的机器码即可,恢复内核挂钩的原理是将先前保存的原始函数前15个字节的指令写回到原始函数地址上,从而还原原始函数的调用。

26510

linux中getchar函数用法,linux getchar函数使用

1 函数介绍 1) 函数原型 int getchar(void); 2) 函数功能 从stdin中读取一个字符。 3) 返回值 返回读取字符的ASCII值或者EOF字符或者出错值。...4) 头文件 #include 2 函数使用 2.1 getchar函数的特点 Linux下编写的一个例子: #include int main(void) { char ch; int num...重新编译并运行程序,输入字符串:hello[回车] 得第一次运行结果 当程序首次执行到while中的getchar时,getchar函数等待用户的输入,getchar函数一直等待用户输入,当用户按下回车表示用户输入完毕...getchar函数读取,因为while循环的条件已经为假)并得到以下输出界面 String输入字符串的长度为6在一次表明getchar读取了用户输入的回车。...3 额外总结 函数本身的特性与语句条件限制两者各自带来的作用需要分清楚。 Note Over。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

3K30

驱动开发:内核扫描SSDT挂钩状态

在笔者上一篇文章《驱动开发:内核实现SSDT挂钩与摘钩》中介绍了如何对SSDT函数进行Hook挂钩与摘钩的,本章将继续实现一个新功能,如何检测SSDT函数是否挂钩,要实现检测挂钩状态有两种方式,第一种方式则是类似于...《驱动开发:摘除InlineHook内核钩子》文章中所演示的通过读取函数的前16个字节与原始字节做对比来判断挂钩状态,另一种方式则是通过对比函数的当前地址与起源地址进行判断,为了提高检测准确性本章将采用两种方式混合检测...具体原理,通过解析内核文件PE结构找到导出表,依次计算出每一个内核函数的RVA相对偏移,通过与内核模块基址相加此相对偏移得到函数的原始地址,然后再动态获取函数当前地址,两者作比较即可得知指定内核函数是否被挂钩...[不相等则说明被挂钩了]if (local_address !...,并运行这段代码,观察是否可以输出被挂钩函数详情;图片

36670
领券