向另一进程插入dll的几种方法

向另一进程插入dll的几种方法

ID:15529107

大小:42.00 KB

页数:15页

时间:2018-08-03

向另一进程插入dll的几种方法_第1页
向另一进程插入dll的几种方法_第2页
向另一进程插入dll的几种方法_第3页
向另一进程插入dll的几种方法_第4页
向另一进程插入dll的几种方法_第5页
资源描述:

《向另一进程插入dll的几种方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、向另一进程插入DLL的几种方法向另一进程插入DLL的几种方法费琳摘要:在MicrosoftWindows中,每个进程都有它自己的私有地址空间,如果某个进程中存在一个错误,改写了一个随机地址上的内存,那么这个错误不会影响到另一个进程所使用的内存。在有些情况下,我们需要打破进程的这种界限,以便对另一个进程的地址空间进行访问。本文主要介绍几种将DLL插入到另一个进程的地址空间中的方法。关键词:DLL进程私有地址空间API独立的地址空间对于编程人员和用户来说都是非常有利的。对于编程人员而言,系统更容易捕获随意的内存读取和写入操作;对于用户而言,操作系统将变

2、得更加强壮,因为一个应用程序无法破坏另一个进程或操作系统的运行。当然,操作系统的这个健壮特性是要付出代价的,因为编写能够与其他进程进行通信、或者能够对其他进程进行操作的应用程序要困难得多。下面的几种情况,需要对另一个进程的地址空间进行访问:●当你想要为另一个进程创建的窗口建立子类时;●当你需要调试帮助时;●当你想要挂接其他进程时。一、一个插入DLL的例子假设:你想为另一个进程创建的窗口建立一个子类。你一定知道,建立子类就能够改变窗口的行为特性。当建立子类时,只需要调用SetWindowLongPtr函数,改变窗口的内存块中的窗口过程地址,使其指向一

3、个新的WndProc即可。PlatformSDK文档指出:应用程序不能为另一个进程创建的窗口建立子类,这并不完全正确。因为给另一个进程的窗口建立子类的关键问题与进程地址空间的边界有关。当调用SetWindowsLongPtr函数建立一个窗口的子类时,你应告诉系统,发送到或者显示在hwnd设定的窗口中的所有消息都应该送往MySubclassProc,而不是送往窗口的正常窗口过程:SetWindowLongPtr(hwnd,GWLP_WNDPROC,MySubclassProc)。换句话说,当系统要将消息发送到指定窗口的WndProc时,要查看它的地址

4、,然后直接调用WndProc。在这个例子中,系统发现MySubclassProc函数的地址与窗口相关联,因此就直接调用MySubclassProc函数。为另一个进程创建的窗口建立子类时所遇到的问题是:建立子类的过程位于另一个地址空间中。图1是一个说明窗口过程是如何接受消息的简化图形。图中,进程A正在运行,并且已经创建了一个窗口。文件User32.dll被映射到进程A的地址空间中。对User32.dll文件的映射是为了接收和发送在进程A中运行的任何线程创建的任何窗口中发送和显示的消息。当User32.dll的映像发现一个消息时,它首先要确定窗口的Wn

5、dProc的地址,然后调用该地址,传递窗口的句柄、消息和wParam与lParam值。当WndProc处理该消息后,User32.dll循环运行,并等待另一个窗口消息被处理。图1进程B中的线程视图为进程A中的线程创建的窗口建立子类现在假设你的进程是进程B,你想为进程A中的线程创建的窗口建立子类。你在进程B中的代码必须首先确定你想要建立子类的窗口的句柄,完成这个操作的方法很多,图1是通过调用FindWindow函数来获得所需窗口的。接着,进程B中的线程调用SetWimdowLongPtr函数,试图改变窗口的WndProc的地址。这个函数调用并不进行什

6、么操作,它只是返回NULL。SetWindowLongPtr函数中的代码要查看是否有一个进程正试图改变另一个进程创建的窗口的WndProc地址,然后忽略这个函数的调用。如果SetWindowLongPtr函数能够改变窗口的WndProc地址,那么系统将把MySubclassProc的地址与特定的窗口关联起来。之后,当有一条消息被发送到这个窗口中时,进程A中的User32代码将检索该消息,得知MySubclassProc将位于进程B的地址空间中,而进程A却是个活动进程。显然,如果User32想要调用该地址,它就要调用进程A的地址空间中的一个地址,这就

7、可能造成内存访问的违规。为了避免这个问题的产生,应该让系统知道MySubclassProc是在进程B的地址空间中,这样,在调用子类的过程之前,让系统执行一次上下文转换即可。Microsoft没有实现这个辅助函数功能,原因是:●应用程序很少需要为其他进程的线程创建的窗口建立子类,大多数应用程序只是为它们自己创建的窗口建立子类,windows的内存结构并不阻止这种创建操作;●切换活动进程需要占用很多CPU时间;●进程B中的线程必须执行MySubclassProc中的代码,而该系统还没有解决究竟应该使用现有的线程,还是使用新线程的问题;●User32.d

8、ll目前还不能说明与窗口相关的地址是用于另一个进程中的过程,还是用于同一个进程中的过程。由于没有解决上述问题的万全之策,因

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。