插入DLL和挂接API

插入DLL和挂接API

在Microsoft Wi n d o w s中,每个进程都有它自己的私有地址空间。当使用指针来引用内存时,指针的值将引用你自己进程的地址空间中的一个内存地址。你的进程不能创建一个其引用属于另一个进程的内存指针。因此,如果你的进程存在一个错误,改写了一个随机地址上的内存,那么这个错误不会影响另一个进程使用的内存。本章将介绍若干种方法,可以用来将 D L L插入到另一个进程的地址空间中。一旦你的 D L L进入另一个进程的地址空间,就可以对另一个进程为所欲为。这一定会使你感到非常刺激,因此,究竟应该怎样做,要think twice。

使用注册表来插入DLL

使用Windows钩子来插入DLL

使用远程线程来插入DLL

下面让我们来看一个例子。进程 A(类似Microsoft Spy++的一个实用程序)安装了一个挂钩W N _ G E T M E S S A G E,以便查看系统中的各个窗口处理的消息。该挂钩是通过调用下面的S e t Wi n d o w s H o o k E x函数来安装的:

第一个参数W H _ G E T M E S S A G E用于指明要安装的挂钩的类型。第二个参数 G e t M s g P r o c用于指明窗口准备处理一个消息时系统应该调用的函数的地址(在你的地址空中)。第三个参数h i n s t D l l用于指明包含G e t M s g P r o c函数的D L L。在Wi n d o w s中,D L L的h i n s t D l l的值用于标识D L L被映射到的进程的地址空间中的虚拟内存地址。最后一个参数 0用于指明要挂接的线程。对于一个线程来说,它可以调用 S e t Wi n d o w s H o o k E x函数,传递系统中的另一个线程的 I D。通过为这个参数传递0,就告诉系统说,我们想要挂接系统中的所有 G U I线程。

与插入D L L的注册表方法不同,这个方法允许你在另一个进程的地址空间中不再需要 D L L时删除该D L L的映像,方法是调用下面的函数:

待续。。。。。。。。。。。。。。。。

发表评论

电子邮件地址不会被公开。 必填项已用*标注