将线程映射到别的程序的地址空间里

I

import

Unregistered / Unconfirmed
GUEST, unregistred user!
你是问如何打破进程的边界吗?用远程线程注入DLL是一种方法,其他还有使用注册表,HOOK,以及一些WIN32函数,Jeffrey Richter的<<Windows高级编程指南>>详细讨论了这个问题,还有例子,你不妨参考一下这本书
16位WINDOWS操作系统所有进程运行在一个地址空间里,所以可以用SetWindowLong来把窗口的内存块中的窗口地址改为新的(你自己的)WndProc,但WIN32地址空间独立,SetWindowLong调用将被简单忽略,所以必须想法把你的子类代码放入另一个进程的地址空间,这种技术称之为向一个进程的地址空间注入一个DLL,然后就可以SetWindowLong了
1 最简单的方式是设置注册表:HKEY_LOCAL_MACHINENT_DLLS,将其值设为你的DLL路径,如c:.dll,重启后有效,这样每当USER32.DLL被映射到进程时,USER32.DLL检索此字符串并载入此库,这种方法只对那些也映射USER32.DLL的进程有效(好在是绝大部分),并且对WIN95无效.
2 使用HOOK来注入DLL,其原理和WINDOWS运行机制有关.在这里只说明怎么做:设置一个WM_GETMESSAGE钩子,
HOOK hHook=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hinstDll,NULL);
而后,当GetMsgProc被调用后,就SetWindowLong来派生子类
3 使用远程线程注入DLL,你需要在目标进程的地址空间中创建和执行线程并访问提交给线程的栈的物理存储,懂吗?反正我是不懂.
另外,如果你要注入的是子进程的化,CreateRemoteThread的第一个参数就可从
CreateProcess中获得了,不过如果是子进程的话,访问数据完全可以用进程通讯的方法来实现.
 
顶部