第4讲 虚拟内存应用-例子
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
lpszDll : 待写字符串:DLL文件名
苏曙光.软件学院.华中科技大学
33
打开进程→分配虚拟内存→写虚拟内存→创建远程线程
pFunc是LoadLibrary指针 lPBuf是LoadLibrary加载的DLL文件名
苏曙光.软件学院.华中科技大学
34
相关函数 OpenProcess:打开目标进程; VirtualAllocEx/VirtualFreeEx:分配/释放内存; WriteProcessMemory:写虚拟内存; LoadLibrary( ) ;装载DLL模块 CreateRemoteThread – 创建远程线程。
苏曙光.软件学院.华中科技大学
苏曙光.软件学院.华中科技大学
19
总结:实现步骤
1.获取远程进程(OpenProcess)的 HANDLE; 2.为远程进程中的 DLL名分配内存(VirtualAllocEx); 3.将 DLL全路径名写入分配的内存:WriteProcessMemory; 4. CreateRemoteThread 和 LoadLibrary 将DLL映射到远程进程; 在DLL的 DLL_PROCESS_ATTACH事件中获取密码 5.等待线程终止(WaitForSingleObject),即直到 LoadLibrary 调用返回; 用合适的方法接收和处理获取的密码 6.获取远程线程的退出代码(GetExitCodeThread)并释放分 配的虚拟地址(VirtualFreeEx); 7.用 CreateRemoteThread和FreeLibrary从远程进程卸载 DLL。 8. 关闭所有句柄。
苏曙光.软件学院.华中科技大学
23
主窗口
苏曙光.软件学院.华中科技大学
24
苏曙光.软件学院.华中科技大学
25
主窗口
苏曙光.软件学院.华中科技大学
26
苏曙光.软件学院.华中科技大学
27
主窗口
苏曙光.软件学院.华中科技大学
28
苏曙光.软件学院.华中科技大学
29
UserMonitor.dll
22
OpenProcess // 打开目标进程
HANDLE hProcess = OpenProcess( PROCESS_CREATE_TH READ | PROCESS_VM_OPERATION | PROCESS_VM_W RITE, FALSE, dwProcessID ); 第一个参数指定操作权限: ROCESS_CREATE_THREAD:在该进程中创建新线程 CreateRemoteThread PROCESS_VM_OPERATION:分配//释放内存 VirtualAllocEx/VirtualFreeEx PROCESS_VM_WRITE:向进程地址空间写 WriteProcessMemory
HANDLE CreateRemoteThread( HANDLE hProcess, // 目标进程 LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全属性 DWORD dwStackSize, // 堆栈大小 LPTHREAD_START_ROUTINE ThreadFunc , // 线程函数 LPVOID lpParameter, // 线程参数 DWORD dwCreationFlags, // 创建标志 LPDWORD lpThreadId // 线程ID );
BOOL VirtualFree( LPVOID lpAddress, DWORD dwSize, DWORD dwFreeType );
苏曙光.软件学院.华中科技大学
6
改变页面的保护属性
BOOL VirtualProtect( PVOID pvAddress, DWORD dwSize, DWORD flNewProtect, PDWORD pflOldProtect ); BOOL VirtualProwk.baidu.comectEx( HANDLE hProcess, PVOID pvAddress, DWORD dwSize, DWORD flNewProtect, PDWORD pflOldProtect );
苏曙光.软件学院.华中科技大学
16
实际要注入的代码(例如SendMessage代码被放在DllMain 的DLL_PROCESS_ATTACH事件中)现在已经被执行。
苏曙光.软件学院.华中科技大学
17
从目标进程中将DLL 卸载
苏曙光.软件学院.华中科技大学
18
进程间通信
问题: DLL获取了包含密码的编辑框的文本,它必须 将它发送回原程序,以便能正确显示出来。 方法: 文件映射 WM_COPYDATA 剪贴板 #pragma data_seg 共享数据段 ……
苏曙光.软件学院.华中科技大学
4
在应用程序中分配虚拟内存
LPVOID VirtualAlloc( LPVOID lpAddress, DWORD dwSize, DWORD flAllocationType, DWORD flProtect );
苏曙光.软件学院.华中科技大学
5
在应用程序中释放虚拟内存
2
进程空间的分区
用户区内的空闲区(free, unallocated)
进程标识 进程状态 进程控制 用户堆栈 用户区 代码和数据
空闲区
空闲区
共享空间
苏曙光.软件学院.华中科技大学
空闲区
3
和虚拟内存操作相关的函数
获取OS系统信息[页面大小,分配粒度] GetSystemInfo( ) 分配和释放虚拟内存 VirtualAlloc( )和VirtualFree( ) 获取内存状态【虚拟内存】 GlobalMemoryStatus( ) 确定虚拟地址空间的状态 VirtualQuery( )或VirtualQueryEx( ) 改变页面的保护属性 VirtualProtect( )和VirtualProtectEx( ) 虚拟内存的读写 ReadProcessMemory( ) 和WriteProcessMemory( )
苏曙光.软件学院.华中科技大学
30
主窗口
查找感兴趣的目标进程szTarget
准备加载 Monitor.dll
准备卸载 Monitor.dll
苏曙光.软件学院.华中科技大学
31
查找目标进程. 参数:lpszProcess,可执行程序名.exe
苏曙光.软件学院.华中科技大学
32
打开进程→分配虚拟内存→写虚拟内存→创建远程线程
苏曙光.软件学院.华中科技大学
20
新增一个大作业
编写一个程序,能够获取普通的第三方进程中某 个窗口上的文本编辑框(尤其是密码框)的内容。
苏曙光.软件学院.华中科技大学
21
例子
功能:
在指定进程中加载用户DLL,要进行虚拟内存读写
在进程中创建一个远程线程(负责加载用户DLL)。 远程线程:在第三方空间运行,需要参数,VM 线程函数:LoadLibrary( “用户编写的DLL模块” )
LPVOID lpParameter, //线程函数的参数 DWORD dwCreationFlags,
LPDWORD lpThreadId DWORD ThreadFunction (
LPVOID lpParameter )
线程函数的原型 );
//参数
创建远程线程 :CreateRemoteThread 在远程进程地址空间创建一个线程
如何获取Password?
苏曙光.软件学院.华中科技大学
1
Windows进程虚拟内存空间
进程虚拟内存空间(32位) 空间大小为4GB(232) 用户区:2GB 页交换区,可对换到外存 系统区(2GB) 在核心态可访问的存储区 页面大小为4KB(212)
苏曙光.软件学院.华中科技大学
苏曙光.软件学院.华中科技大学
7
虚拟内存的读
BOOL ReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead );
苏曙光.软件学院.华中科技大学
8
虚拟内存的写
BOOL WriteProcessMemory( HANDLE hProcess, LPVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesWritten );
苏曙光.软件学院.华中科技大学
苏曙光.软件学院.华中科技大学
13
CreateThread函数
HANDLE CreateThread (
DWORD dwStackSize,
把函数创建为线程
LPSECURITY_ATTRIBUTES lpThreadAttributes,
LPTHREAD_ROUTINE ThreadFunction, //线程函数
9
如何获取Password?
苏曙光.软件学院.华中科技大学
10
要“读取”某个控件的内容(例如编辑框)通常都是向其 发送 WM_GETTEXT消息。 如果该编辑框属于远程进程(并具有 ES_PASSWORD式 样,上面方法失效。 问题:如何在远程进程的地址空间执行 SendMessage( hPwdEdit, WM_GETTEXT, nMaxChars, psBuffer );
苏曙光.软件学院.华中科技大学
11
通常有三种方法来解决这个问题
1.将用户代码放入某个
DLL,然后通过 Windows 钩子 映射该DLL到远程进程; 2.将用户代码放入某个 DLL,通过 CreateRemoteThread 和 LoadLibrary 技术映射该DLL到远程进程; 3.如果不写单独的 DLL,可将用户代码拷贝到远程进程 (通过 WriteProcessMemory)并用 CreateRemoteThread 启动它的执行。
把LoadLibrary/FreeLibrary作为 CreateRemoteThread函数的 线程例程。 问题1:LoadLibrary/FreeLibrary的函数指针? LoadLibrary和 FreeLibray两个函数都在 kernel32.dll 中。且每个进程都加载kernel32.dll, 且LoadLibrary 和 FreeLibray两个函数加载地址相同。因此,只要 获取该地址然后传递到CreateRemoteThread就可以。 问题2:如果ThreadFunc 的参数lpParameter被解释为指 针,则它必须指向远程进程内的数据。如何实现? 通过WriteProcessMemory在远程进程虚拟内存中写 入DLL模块名(LoadLibrary需要的DLL名)即可。
苏曙光.软件学院.华中科技大学
12
方法二:
方法二:将用户代码放入 DLL,通过 CreateRemoteThread 和 LoadLibrary 技术映射该DLL到远程进程; 进程通过 LoadLibrary API 动态加载DLL。
问题:如何强制一个远程进程调用这个函数呢? 答案:CreateRemoteThread创建远程线程执行该函数。