程序目標:進程注入讀取C盤列表文件目錄(通過窗口進程內存讀取),由於代碼很少,所以不再做詳細介紹,天緣博客後續會有一些專題介紹注入技術、HOOK技術文章發表。
測試系統:Windows XP,測試通過。
程序的整體分成兩個部分:
1、主體函數部分,功能是負責查找目標程序窗口,初始化句柄和目標進程ID,然後枚舉子窗體控件,初始化目標控件句柄,注入進程並提取有用信息。
void CQQDlg::OnOK()
{
HWND hQQSearchWnd= NULL;//窗口句柄
hQQSearchWnd = ::FindWindow(NULL,"SYS (C:)");//找到查找目標窗口句柄
if(NULL==hQQSearchWnd)
{
m_Edt_str="未找到指定標題窗口";
}
else
{
EnumChildWindows(hQQSearchWnd,EnumFunc,0);//枚舉子窗口,初始化g_hListCtrl
//hQQSearchWnd=::FindWindowEx(hQQSearchWnd,0,"SysListView32",0);
if (NULL == g_hListCtrl)
{
MessageBox("列表控件查詢失敗,請檢查回調函數","錯誤!",NULL);
}
else//------
{
DWORD PID = 0; //進程ID
HANDLE hProcess = NULL; //進程句柄
GetWindowThreadProcessId(g_hListCtrl, &PID);//讀進程ID
hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);//獲取對方進程句柄
if (NULL == hProcess)
{
MessageBox("獲取進程句柄操作失敗!","錯誤!",NULL);
return;
}
else
{
LVITEM lvitem, *plvitem;
TCHAR ItemBuf[512];
TCHAR *pItem;
plvitem = NULL;
pItem = NULL;
plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
pItem=(char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);//分配虛擬內存
if ((!plvitem)||(!pItem))
{
MessageBox("無法分配內存!","錯誤!",NULL);
}
else
{
lvitem.cchTextMax=512;
lvitem.iSubItem=0; //條目ID編號
lvitem.pszText=pItem; //注意,這裡賦值
WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
for(int i=0;i<g_iRecords;i++)//循環讀在線QQ號
{
::SendMessage(g_hListCtrl, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)plvitem);
ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
m_Edt_str += ItemBuf;
m_Edt_str +="rn";
Sleep(100);
}
}
VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
//CloseHandle(hProcess);
}
}//------
CloseHandle(g_hListCtrl);
CloseHandle(hQQSearchWnd);
}
UpdateData(false);
//CDialog::OnOK();
}