第4讲虚拟内存应用例子_第1页
第4讲虚拟内存应用例子_第2页
第4讲虚拟内存应用例子_第3页
第4讲虚拟内存应用例子_第4页
第4讲虚拟内存应用例子_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、如何获取如何获取PasswordPassword?苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学1 1苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学2 2WindowsWindows进程虚拟内存空间进程虚拟内存空间进程虚拟内存进程虚拟内存空间空间(32位位)u空间大小为空间大小为4GB(232) n用户用户区区:2GBn页交换区,可对换到外存页交换区,可对换到外存n系统区系统区(2GB)n在核心态可访问的存储在核心态可访问的存储区区u页面大小为页面大小为4KB(212)苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学3 3进程空间的分区进程空

2、间的分区用户区内的空闲区用户区内的空闲区(free, unallocated) 空闲区 空闲区 空闲区苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学4 4和虚拟内存操作相关的函数和虚拟内存操作相关的函数 获取获取OSOS系统信息系统信息 页面大小,分配粒度页面大小,分配粒度 uGetSystemInfo( ) ( ) 分配和释放虚拟内存分配和释放虚拟内存uVirtualAlloc( )( )和和VirtualFree( ) ( ) 获取内存状态获取内存状态【虚拟内存虚拟内存】 uGlobalMemoryStatus( ) ( ) 确定虚拟地址空间的状态确定虚拟地址空间的状态u

3、VirtualQuery( )( )或或VirtualQueryEx( ) ( ) 改变页面的保护属性改变页面的保护属性uVirtualProtect( )( )和和VirtualProtectEx( ) ( ) 虚拟内存的读写虚拟内存的读写 uReadProcessMemory( ) ( ) 和和WriteProcessMemory( ) ( ) 苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学5 5在应用程序中分配虚拟内存在应用程序中分配虚拟内存LPVOID VirtualAlloc( LPVOID lpAddress, DWORD dwSize, DWORD flAllo

4、cationType, DWORD flProtect ); 苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学6 6在应用程序中释放虚拟内存在应用程序中释放虚拟内存BOOL VirtualFree( LPVOID lpAddress, DWORD dwSize, DWORD dwFreeType );苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学7 7改变页面的保护属性改变页面的保护属性 BOOL VirtualProtect( PVOID pvAddress, DWORD dwSize, DWORD flNewProtect, PDWORD pflOldPr

5、otect ); BOOL VirtualProtectEx( HANDLE hProcess, PVOID pvAddress, DWORD dwSize, DWORD flNewProtect, PDWORD pflOldProtect );苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学8 8虚拟内存的读虚拟内存的读BOOL ReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead ); 苏曙光苏曙

6、光. .软件学院软件学院. .华中科技大学华中科技大学9 9虚拟内存的写虚拟内存的写BOOL WriteProcessMemory( HANDLE hProcess, LPVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesWritten );如何获取如何获取PasswordPassword?苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学1010 要“读取”某个控件的内容(例如编辑框编辑框)通常都是向其发送 WM_GETTEXT消息。u如果该编辑框编辑框属于远程进程(并具有 ES_P

7、ASSWORD式样,上面方法失效。u 问题:如何在远程进程的地址空间执行SendMessage( hPwdEdit, WM_GETTEXT, nMaxChars, psBuffer );苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学1111通常有三种方法来解决这个问题u1.将用户代码放入某个 DLL,然后通过 Windows 钩子映射该DLL到远程进程;u2.将用户代码放入某个 DLL,通过 CreateRemoteThread 和 LoadLibrary 技术映射该DLL到远程进程;u3.如果不写单独的 DLL,可将用户代码拷贝到远程进程(通过 WriteProcessMe

8、mory)并用 CreateRemoteThread 启动它的执行。苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学1212方法二:方法二: 方法二:将用户代码放入 DLL,通过 CreateRemoteThread 和 LoadLibrary 技术映射该DLL到远程进程; 进程通过 LoadLibrary API 动态加载DLL。 问题:如何强制一个远程进程调用这个函数呢?u答案:CreateRemoteThread创建远程线程执行该函数。苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学1313CreateThreadCreateThread函数函数 HAND

9、LE CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_ROUTINE ThreadFunction, LPVOID lpParameter, /线程函数的参数线程函数的参数DWORD dwCreationFlags, LPDWORD lpThreadId ); 线程函数的原型线程函数的原型DWORD ThreadFunction ( LPVOID lpParameter /参数参数 ) 创建远程创建远程线程线程 :CreateRemoteThreadu在远程进程地址空间创建一

10、个线程在远程进程地址空间创建一个线程 HANDLE CreateRemoteThread( HANDLE hProcess, / 目标进程目标进程 LPSECURITY_ATTRIBUTES lpThreadAttributes, / 安全属性安全属性 DWORD dwStackSize, / 堆栈大小堆栈大小 LPTHREAD_START_ROUTINE ThreadFunc , / 线程函数线程函数 LPVOID lpParameter, / 线程参数线程参数 DWORD dwCreationFlags, / 创建标志创建标志 LPDWORD lpThreadId / 线程线程ID); 把

11、LoadLibrary/FreeLibrary作为 CreateRemoteThread函数的线程例程。u问题1:LoadLibrary/FreeLibrary的函数指针?nLoadLibrary和 FreeLibray两个函数都在 kernel32.dll 中。且每个进程都加载kernel32.dll, 且LoadLibrary和 FreeLibray两个函数加载地址相同。因此,只要获取该地址然后传递到CreateRemoteThread就可以。u问题2:如果ThreadFunc 的参数lpParameter被解释为指针针,则它必须指向远程进程内的数据远程进程内的数据。如何实现?n通过Wri

12、teProcessMemory在远程进程虚拟内存虚拟内存中写入DLL模块名(LoadLibrary需要的DLL名)即可。苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学1616 实际要注入的代码(例如SendMessage代码被放在DllMain 的DLL_PROCESS_ATTACH事件中)现在已经被执行。苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学1717从目标进程中将DLL 卸载苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学1818进程间通信问题:uDLL获取了包含密码的编辑框的文本,它必须将它发送回原程序,以便能正确显示出来。方法:

13、u文件映射uWM_COPYDATAu剪贴板u#pragma data_seg 共享数据段u苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学1919总结:实现步骤总结:实现步骤 1.获取远程进程(OpenProcess)的 HANDLE; 2.为远程进程中的 DLL名分配内存(VirtualAllocEx); 3.将 DLL全路径名写入分配的内存:WriteProcessMemory; 4. CreateRemoteThread 和 LoadLibrary 将DLL映射到远程进程;u在DLL的 DLL_PROCESS_ATTACH事件中获取密码 5.等待线程终止(WaitForS

14、ingleObject),即直到 LoadLibrary 调用返回; 用合适的方法接收和处理获取的密码 6.获取远程线程的退出代码(GetExitCodeThread)并释放分配的虚拟地址(VirtualFreeEx); 7.用 CreateRemoteThread和FreeLibrary从远程进程卸载 DLL。 8. 关闭所有句柄。苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学2020新增一个大作业新增一个大作业编写一个程序,能够获取普通的第三方进程中某编写一个程序,能够获取普通的第三方进程中某个窗口上的文本编辑框(尤其是密码框)的内容。个窗口上的文本编辑框(尤其是密码框)

15、的内容。苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学2121苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学2222例子例子功能:功能:u在在指定进程指定进程中加载中加载用户用户DLL,要进行,要进行虚拟内存读写虚拟内存读写n在进程中创建一个在进程中创建一个远程线程远程线程(负责加载用户负责加载用户DLL)。n远程线程远程线程:在第三方空间运行,需要在第三方空间运行,需要参数参数,VMn线程函数:线程函数:LoadLibrary( “用户编写的用户编写的DLL模块模块” )相关函数相关函数uOpenProcess:打开目标进程;:打开目标进程;uVirtua

16、lAllocEx/VirtualFreeEx:分配:分配/释放内存;释放内存;uWriteProcessMemory:写虚拟内存;:写虚拟内存;uLoadLibrary( ) ;装载装载DLL模块模块uCreateRemoteThread 创建远程线程。创建远程线程。苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学2323OpenProcess OpenProcess /打开目标进程打开目标进程 HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRI

17、TE, FALSE, dwProcessID ); 第一个参数指定操作权限:第一个参数指定操作权限:uROCESS_CREATE_THREAD:在该进程中创建新线程:在该进程中创建新线程nCreateRemoteThreaduPROCESS_VM_OPERATION:分配:分配/释放内存释放内存nVirtualAllocEx/VirtualFreeExuPROCESS_VM_WRITE:向进程地址空间写:向进程地址空间写nWriteProcessMemory苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学2424主窗口主窗口苏曙光苏曙光. .软件学院软件学院. .华中科技大学华

18、中科技大学2525苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学2626主窗口主窗口苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学2727苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学2828主窗口主窗口苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学2929UserMonitor.dllUserMonitor.dll苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学3030苏曙光苏曙光. .软件学院软件学院. .华中科技大学华中科技大学3131主窗口主窗口查找感兴趣的目标进程szTarget准备加载 Monitor.dll准备卸载 Monitor.dll苏曙光苏曙光. .软件学院软件学院. .

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论