作者:莫艺潜
在文章《浅析Windows CE跨进程内存注入实现窗体消息挂接(上)》中,我们已经得到了这个七巧板游戏所需要的所有小板块,剩下的事就是等待我们按一定顺序将合适的板块放到合适的位置,本章我们开始进行真刀真枪的实战演练。
程序目标:捕获explore窗体(也就是程序窗体的消息并输出到WinProcInfo.txt中)
程序的执行步骤设计如下:
1、编写一个窗体消息挂接DLL,这个DLL提供一个,函数中利用setwindowlong函数将窗体的默认消息处理过程改为这个挂接DLL中定义的一个窗体过程。
2、在C#程序中利用findwindow等API函数获得exlore类窗体的句柄及窗体所属的进程,并使用performcallback4在目标进程空间中执行coredll.dll的loadLibrary函数将我们写的挂接dll放到目标进程中。
3、在C#程序中使用performcallback4在目标进程空间中执行挂接DLL提供的导出接口函数实现跨进程窗体消息截获.
一、程序的实现如下:
在VS2005中建立一个智能设备的MFC DLL,命名为HookWindowsProcMFCDLL。
在HookWindowsProcMFCDLL.cpp中进行挂接DLL的核心编码:
LRESULT CALLBACK fnHookWindowProc(HWND hwnd,UINT msg,WPARAM wparam, LPARAM lparam);
int __declspec(dllexport) WINAPI fnAttachWinProc(HWND ni_hAttatchWin,PVOID ,PVOID,PVOID);
int __declspec(dllexport) WINAPI fnDetachWinMsgProc(HWND ni_hDetachWin);
WNDPROC tpOldWindowProc;
FILE *m_pDebugOutputFile;
//将一个窗体消息处理挂接到net精简版MessageWindow对象上的代码 typedef struct { WNDPROC OldWinProc;//保留窗体原始消息处理过程的函数指针 HWND WindowHandle;//保存net精简版中对应的窗口挂接的MessageWindow对象的句柄 } DEFUDT_AttachWinInfo; //end struct
CMap m_aAttachWinInfoMap;
//对指定的窗口进程进行挂接 int __declspec(dllexport) WINAPI fnAttachWinProc(HWND ni_hAttatchWin, PVOID ni_0, PVOID ni_1, PVOID ni_2 ) { DEFUDT_AttachWinInfo tudtAttachWinInfo; m_pDebugOutputFile = fopen("\Storage Card\WinProcInfo.txt", "w"); WNDPROC tpOldWindowProc=(WNDPROC)::SetWindowLong(ni_hAttatchWin, GWL_WNDPROC,(LONG) fnHookWindowProc ); fprintf(m_pDebugOutputFile,"Attatch successfully! OldWindowProc: %08X\n",tpOldWindowProc); tudtAttachWinInfo.OldWinProc=tpOldWindowProc ; tudtAttachWinInfo.WindowHandle=ni_hAttatchWin; m_aAttachWinInfoMap.SetAt(ni_hAttatchWin,tudtAttachWinInfo); fclose(m_pDebugOutputFile); return 77;// (int)tpOldWindowProc ; }//end function
int __declspec(dllexport) WINAPI fnDetachWinMsgProc(HWND ni_hDetachWin) { DEFUDT_AttachWinInfo tudtAttachWinInfo; WNDPROC tpOldWindowProc;
//取得在ncf中消息接收窗口对应的原始消息处理函数的函数指针 m_aAttachWinInfoMap.Lookup(ni_hDetachWin,tudtAttachWinInfo) ;
//将窗体的消息处理函数设为默认的处理过程 tpOldWindowProc =(WNDPROC) SetWindowLong(ni_hDetachWin,GWL_WNDPROC , (LONG)tudtAttachWinInfo.OldWinProc);
//将挂接信息消息处理映谢类中删除 m_aAttachWinInfoMap.RemoveKey(ni_hDetachWin);
return (int)tpOldWindowProc ;
}//end function
LRESULT CALLBACK fnHookWindowProc(HWND hwnd,UINT msg,WPARAM wparam, LPARAM lparam) { DEFUDT_AttachWinInfo tudtAttachWinInfo; m_aAttachWinInfoMap.Lookup(hwnd,tudtAttachWinInfo) ; m_pDebugOutputFile = fopen("\Storage Card\WinProcInfo.txt", "a"); if (m_pDebugOutputFile!=NULL) { fprintf(m_pDebugOutputFile,"HWND: %08X Msg: %08X Wparam %08X Lparam %08X \n", hwnd,msg,wparam,lparam);
}//EHD IF
fclose(m_pDebugOutputFile); //tudtAttachWin=maatt LRESULT tobjResult= ::CallWindowProc(tudtAttachWinInfo.OldWinProc ,hwnd,msg,wparam,lparam); return tobjResult; }//end function
[系统软件]windows下Apache+php+mysql的安装与配置图解 [操作系统]在Windows中玩转Linux操作系统 [操作系统]死马还当活马医:6种方法挽救Windows系统 [办公软件]如何实现Office工具栏、菜单以及菜单命令重命名 [办公软件]如何在Office文档(大)括号内输入多行文字 [办公软件]如何在office(PowerPoint,Word,Excel)中制作带圈的… [办公软件]批量删除Office文档(word,excle,powerpoint)中的超… [办公软件]Office(Word,Excel)密码破解软件(Office Password… [办公软件]如何让低版本的Office也能顺利编辑2007文档 [办公软件]在PowerPoint中轻松插入Excel表格
|