VirtualAllocEx 跨进程读写数据 代码注入
来源:互联网 发布:大连市软件行业协会 编辑:程序博客网 时间:2024/05/01 11:00
VirtualAllocEx 函数的作用是在指定进程的虚拟空间保留或提交内存区域,除非指定MEM_RESET参数,否则将该内存区域置0。
flAllocationType,flProtect太多了,参数数值和意思MSDN上都有,不再赘述了.
问题描述:我要选中其他进程的一个ListView窗口中的一个Item,事实上只要发消息就可以了:
SendMessage( hWnd, LVM_SETITEMSTATE, (WPARAM)nItemIndex, (LPARAM)pLVItem );
可是其中的LPARAM要指向一个LVItem的结构,我们知道消息可以跨进程,但目标窗口收到消息时它需要寻址这个结构,而这个结构实际上存储在发送方的地址空间里;所以我们必须把LVItem的内容写入到窗口过程所在的地址空间内,于是便需要VirtualAllocEx和VirtualFreeEx了。
代码如下。
LPVOID VirtualAllocEx(
HANDLE hProcess, // 申请内存所在的进程句柄
LPVOID lpAddress, // 保留页面的内存地址;一般用NULL自动分配
SIZE_T dwSize, // 欲分配的内存大小,字节单位;注意实际分 配的内存大小是页内存大小的整数倍
DWORD flAllocationType,
DWORD flProtect
);
HANDLE hProcess, // 申请内存所在的进程句柄
LPVOID lpAddress, // 保留页面的内存地址;一般用NULL自动分配
SIZE_T dwSize, // 欲分配的内存大小,字节单位;注意实际分 配的内存大小是页内存大小的整数倍
DWORD flAllocationType,
DWORD flProtect
);
flAllocationType,flProtect太多了,参数数值和意思MSDN上都有,不再赘述了.
问题描述:我要选中其他进程的一个ListView窗口中的一个Item,事实上只要发消息就可以了:
SendMessage( hWnd, LVM_SETITEMSTATE, (WPARAM)nItemIndex, (LPARAM)pLVItem );
可是其中的LPARAM要指向一个LVItem的结构,我们知道消息可以跨进程,但目标窗口收到消息时它需要寻址这个结构,而这个结构实际上存储在发送方的地址空间里;所以我们必须把LVItem的内容写入到窗口过程所在的地址空间内,于是便需要VirtualAllocEx和VirtualFreeEx了。
代码如下。
ListViewOperator::ListViewOperator( HWND hWnd ) // 初始化函数
...{
m_hwnd = NULL; //目标窗口
m_hProcess = NULL; //目标进程
m_pLVItem = NULL; //写入目标进程的LVITEM结构
m_pTextBuffer = NULL; //其他用途
m_hwnd = hWnd;
DWORD dwProcessId;
GetWindowThreadProcessId( hWnd, &dwProcessId ); //获取进程ID
m_hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, dwProcessId ); //打开进程
THROW_EXCEPTION( (m_hProcess == NULL), "Open process failed" );
m_pLVItem = (LVITEMA *)VirtualAllocEx( m_hProcess, NULL, sizeof(LVITEMA), MEM_COMMIT, PAGE_READWRITE ); 在目标进程空间中获得内存,允许读取和写入。
THROW_EXCEPTION( (m_pLVItem == NULL), "Memory alloc failed" );
m_pTextBuffer = (char *)VirtualAllocEx( m_hProcess, NULL, MAX_TEXT_BUFFER_LENGTH, MEM_COMMIT, PAGE_READWRITE );
THROW_EXCEPTION( (m_pTextBuffer == NULL), "Memory alloc failed" );
}
void ListViewOperator::SetItemSelected( int nItemIndex ) //选中某一个ITEM
...{
LVITEMA lvitem; // 静态结构
lvitem.mask = LVIF_STATE;
lvitem.iSubItem = 0;
lvitem.state = LVIS_SELECTED|LVIS_FOCUSED;
lvitem.stateMask = LVIS_SELECTED|LVIS_FOCUSED;
int nRet = WriteProcessMemory( m_hProcess, m_pLVItem, &lvitem, sizeof(LVITEM), NULL ); // 将本地进程中的结构写入到目标进程
THROW_EXCEPTION( (nRet == 0), "Write Process memory failed" );
HRESULT hRet = SendMessage( m_hwnd, LVM_SETITEMSTATE, (WPARAM)nItemIndex, (LPARAM)m_pLVItem );//发送消息
THROW_EXCEPTION( FAILED(hRet), "Send message failed" );
return ;
}
...{
m_hwnd = NULL; //目标窗口
m_hProcess = NULL; //目标进程
m_pLVItem = NULL; //写入目标进程的LVITEM结构
m_pTextBuffer = NULL; //其他用途
m_hwnd = hWnd;
DWORD dwProcessId;
GetWindowThreadProcessId( hWnd, &dwProcessId ); //获取进程ID
m_hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, dwProcessId ); //打开进程
THROW_EXCEPTION( (m_hProcess == NULL), "Open process failed" );
m_pLVItem = (LVITEMA *)VirtualAllocEx( m_hProcess, NULL, sizeof(LVITEMA), MEM_COMMIT, PAGE_READWRITE ); 在目标进程空间中获得内存,允许读取和写入。
THROW_EXCEPTION( (m_pLVItem == NULL), "Memory alloc failed" );
m_pTextBuffer = (char *)VirtualAllocEx( m_hProcess, NULL, MAX_TEXT_BUFFER_LENGTH, MEM_COMMIT, PAGE_READWRITE );
THROW_EXCEPTION( (m_pTextBuffer == NULL), "Memory alloc failed" );
}
void ListViewOperator::SetItemSelected( int nItemIndex ) //选中某一个ITEM
...{
LVITEMA lvitem; // 静态结构
lvitem.mask = LVIF_STATE;
lvitem.iSubItem = 0;
lvitem.state = LVIS_SELECTED|LVIS_FOCUSED;
lvitem.stateMask = LVIS_SELECTED|LVIS_FOCUSED;
int nRet = WriteProcessMemory( m_hProcess, m_pLVItem, &lvitem, sizeof(LVITEM), NULL ); // 将本地进程中的结构写入到目标进程
THROW_EXCEPTION( (nRet == 0), "Write Process memory failed" );
HRESULT hRet = SendMessage( m_hwnd, LVM_SETITEMSTATE, (WPARAM)nItemIndex, (LPARAM)m_pLVItem );//发送消息
THROW_EXCEPTION( FAILED(hRet), "Send message failed" );
return ;
}
- VirtualAllocEx 跨进程读写数据 代码注入
- VirtualAllocEx
- Parcelable中List数据的跨进程读写操作
- 跨进程存取数据
- delphi7 跨进程 读写内存总结
- ContentProvider跨进程共享数据
- ContentProvider 跨进程数据读取
- Windows CE跨进程内存注入之原理
- android跨进程事件注入(程序模拟用户输入)
- android跨进程事件注入(程序模拟用户输入)
- android跨进程事件注入(程序模拟用户输入)
- android跨进程事件注入(程序模拟用户输入)
- android跨进程事件注入(程序模拟用户输入)
- android跨进程事件注入(程序模拟用户输入)
- android跨进程事件注入(程序模拟用户输入)
- android跨进程事件注入(程序模拟用户输入)
- android跨进程事件注入(程序模拟用户输入)
- android跨进程事件注入(程序模拟用户输入)
- struts2标签
- VC6下配置ACE的详细过程
- Flash破解与防破解(转载)
- How to make DIV element floating over select list.
- javacript实现TreeView中checkBox的选择
- VirtualAllocEx 跨进程读写数据 代码注入
- jsp实现文件上传
- c# 反射的用法
- Understanding MySQL Internals 3:搭建环境
- ACE环境构建笔记(Linux)
- CString如何转COleDateTime
- 通用不间断滚动JS封装类
- C-51的数据存储区域与性能
- Cool! XDialogHeader