VirtualAllocEx 跨进程读写数据 代码注入
生活随笔
收集整理的這篇文章主要介紹了
VirtualAllocEx 跨进程读写数据 代码注入
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
VirtualAllocEx 函數的作用是在指定進程的虛擬空間保留或提交內存區域,除非指定MEM_RESET參數,否則將該內存區域置0。?
LPVOID?VirtualAllocEx(?
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?;?
}?
?
LPVOID?VirtualAllocEx(?
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?;?
}?
?
總結
以上是生活随笔為你收集整理的VirtualAllocEx 跨进程读写数据 代码注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3-3:类与对象中篇——默认成员函数之构
- 下一篇: Mybatis 总结