装修验房网

您现在的位置是:网站首页>吊顶装修

吊顶装修

DLL注入学习复现一个简单的消息钩子

精装修验房注意事项及细节2024-05-03吊顶装修中介装修出租

DLL注入学习复现一个简单的消息钩子

  这篇文章开始进入DLL注入和API钩取的部分,首先来看一下什么叫做DLL注入:

  顾名思义,DLL注入是将某些DLL(梦幻西游豪宅装修)强行加载到某个程序的进程中,从而完成某些特定的功能,。DLL注入与普通的DLL 加载的区别在于,加载的目标是其自身或者其他特定程序,而注入的目标是强制在某个进程中插入自定义的DLL。

  在DLL注入的过程中,会频繁地接触到钩子这个概念,也就是Hook这个操作。

  钩子的主要作用就是将消息和进程钩取过来,对于被钩取到的消息和进程,我们可以自己写程序对其进行一些修改或者查看,这样就完成了对于程序原本功能的修改。

  本文要实现的功能主要依托于Windows中的消息钩子。Windows为用于提供了相当完备的GUI(三乡装修),而用户通过鼠标,键盘,光驱等外设与系统进行交互。在Windows中,每一次鼠标点击和键盘输入都可以被叫做是一个事件,Windows就是基于这些事件驱动的系统。

  当按下键盘上的某个键时,这个键被按下的消息传递到Windows的事件队列中等待处理,这时的键盘事件还没有进入到应用程序加以处理,而在系统消息队列和应用之间就是架设消息钩子的空间,在这里可以通过钩子钩取即将被传入应用的事件并加以处理,大概流程如下图:

  下面就对钩取键盘消息进行实际操作,开始之前先要准备一个进程查看器:Process Explorer,这个进程查看器功能相当强大,可以看到进程都加载了哪些DLL,以及某个DLL被哪些进程加载过。本次操作是基于notepad.exe(装修铺瓷砖)的DLL注入

  首先来看一下完成主要功能的动态链接库,也就是后面将注入notepad.exe的DLL文件。下面先给出源码,然后在分析源码中用到的API:

  在自己编写DLL的过程中,要注意程序的入口点函数是一个固定的模式,这个模式可以在MSDN(湖南装修工程)上查到,如下:

  fdwReason:标识调用DLL入口点函数的原因,有0、1、2、3这个四个值,对应四种不同情况。本次复现主要接触到的是值为0和1时的两种情况2和3的情况在后面学习线程注入时会接触到:

  值为1:对应 DLL-k2ROCESS-k23ATTACH ,进程使用LoadLibrary加载DLL时也就是DLL模块被加载入虚拟地址空间时,系统会接收到这个消息

  值为0:对应 DLL-k2ROCESS-k23DETACH ,当进程使用FreeLibrary卸载掉DLL时也就是DLL模块被从虚拟空间中卸载时,系统会受到这个消息

  在函数内部是一个Switch选择结构,根据fdwReason(如何装修好新房)执行相应操作,本次的复现中采用的是最简单的一种:也就是当DLL模块加载成功时将DLL的实例化句柄赋值给全局变量hInstance。这部分的代码及注释如下:

  KeyboardProc,也就是键盘消息进程的函数,它是一个回调函数,它作为参数在SetWindowsHookEx这个API中使用,这个回调函数也有一个比较固定的模板,在MSDN上可以查到:

  小于0:必须调用CallNextHookEx函数传递消息也就是传递给钩链中的下一个钩子,且不能做过多操作

  0:表示参数wParam和lParam 包含关于虚拟键值相关信息(山东全装修)

  3:在值为0的基础上,表示这个消息被某个进程用PeekMessage查看过

  lParam:这是一个组合值,它的每个不同的bit位代表不同的情况,具体可以在文档中查看,本次复现主要它的第位bit位:

  这两个函数就是后面将被导出到主程序中使用的开启Hook和卸载Hook的函数,本次的复现中写的很简单,就是调用了一个建立钩子进程的API,但是还有些地方需要注意

  在我们使用VS编写DLL时,生成的源文件后缀是.cpp,也就是C++文件,但是有些函数是只能在C语言下解析,所以我们使用C++中解析C语言的一个模式:

  当我们需要在DLL中导出函数时,要用一个前缀标识这个函数为导出函数,如下:

  这个前缀标识后面的函数为DLL的导出函数,默认的调用约定是-k23srdcall

  这个操作很简单,就是调用LoadLibraryA这个API加载DLL,它在MSDN中可以查到为:

  只有一个参数,就是需要载入的模块的名称,这里还要着重讲一下前面的一些操作:

  这个typedef看起来跟平时用到的typedef有点不一样,按照正常的理解,typedef应该是给一个什么东西“取别名”,那么这里就应该是给void取别名为*FN-k23HOOKSTART,但这样用起来就很奇怪。

  其实正确的理解与上面说到的相差不是很大。由于后面会使用GetProcAddress来获取DLL中导出函数的地址,我们要调用就需要一个指向这个的指针。而要导出的两个函数都是参数为void,返回值也是void的函数,所以这里typedef的其实就是一个返回值为void参数也是void的函数指针

  在前面的文章中调试程序时经常都会看到LoadLibrary和GetProcAddress这两个函数的联合使用,它们的功能就是在程序中导入外部DLL得函数,这GetProcAddress在MSDN上查到为:

  通过这个API获取到的函数需要使用前面定义的函数指针强转一下类型才能正常的赋值给指针使用。

  k22需要注意的就是在结束钩子进程后要将DLL从进程中卸载,也就是要使用FreeLibrary。

  由于这个钩子程序在win10和win7运行会有一点小bug(环保的装修),所以我们在XP下运行和调试这个程序

  此时在记事本中是无法输入任何内容的,打开ProcessExplorer看一下DLL的加载情况:

  很经典的VC++启动流程,一个call和一个向上的jmp跳转。我们事先知道这个程序是有一个按键提示的,所以我们直接搜索这个字符串:

  找到了函数的主要流程,其中有使用到的两次GetProcAddress,后面有卸载DLL时的FreeLibrary,跟随这个CALL进入调用的HookStart函数函数:

  先在OD中打开nootepad,更改OD的调试设置为(什么是装修房):

  设置中断于新模块,也就是当DLL加载入内存时断下程序,然后打开Hook程序运行,由于系统不同可能不会k22次就加载KeyHook,需要要在notepad中进行键盘输入,直到模块窗口出现KeyHook: