在文章《浅析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对象上的代码 CMap<HWND,HWND,DEFUDT_AttachWinInfo,DEFUDT_AttachWinInfo> m_aAttachWinInfoMap; //对指定的窗口进程进行挂接 int __declspec(dllexport) WINAPI fnDetachWinMsgProc(HWND ni_hDetachWin) //取得在ncf中消息接收窗口对应的原始消息处理函数的函数指针 //将窗体的消息处理函数设为默认的处理过程 //将挂接信息消息处理映谢类中删除 return (int)tpOldWindowProc ; }//end function
}//EHD IF fclose(m_pDebugOutputFile); |
而在C#的主程序中,我们使用这个DLL挂接explore类的程序窗体,以下给出挂接部分的代码:
|
int m_hTargetWindow;//要挂接的目标窗体句柄 private void Form1_Load(object sender, EventArgs e) m_hTargetWindow = (int)clsCECoreAPI.FindWindow("Explore", null );//资源管理器 0x0013e800; //挂接指定的进程窗体消息 string tstrArgument; int tintOriginalKMode = clsCECoreAPI.SetKMode(1); IntPtr tpFuncProc = clsCECoreAPI.GetProcAddress(clsCECoreAPI.GetModuleHandle("coredll.dll"), "LoadLibraryW"); CallBackInfo tudtCALLBACKINFO; tpArg0 = clsCECoreAPI.MapPtrToProcess(tstrArgument, thCurrentProcess); tudtCALLBACKINFO.hProc = m_hTargetProcess;// Proc; IntPtr thModule = clsCECoreAPI.LoadLibrary("HookWindowsProcMFCDLL.dll"); tpArg0 = (IntPtr) m_hTargetWindow;// clsCECoreAPI.MapPtrToProcess(ref thTargetWindow, thCurrentProcess); tudtCALLBACKINFO.hProc = m_hTargetProcess; [DllImport("HookWindowsProcMFCDLL.dll")] [DllImport("HookWindowsProcMFCDLL.dll")] |
取消挂接的代码根据上述代码很容易就可以建立,不再细叙。
注:clsCECoreAPI的函数全是封装的标准CE API,由于这些API在msdn 中都有详细的文档注释,因篇幅所限,不再将代码一一列举.
在执行这个程序时,将模拟器的共享路径设为PC机的桌面,这样模拟器的storage card目录就等同桌面了,点模拟器的开始菜单,选程序,你就可以看到explore窗体的消息都输出到桌面的WinProcInfo.txt文件中了,运行结果如下:
目前本程序只在PPC2003/wm5 for PPC测试通过,由于smartphone系统在编译时使用了和ppc系统不同的机制,内存运作不明,本程序在smartphone上无法正确运行,有好的建议的话请指教一二,谢谢.

一沙一世界 一花一天堂 掌中握無……

网络编程技术、多媒体技术、PC应用技术

| 我爱研发网 | 中电华信 | 阿里西西 | JAVA爱好者 | 北京英才网 | 全球大学查询网 |
| 中国人的网站导航 | 中国电脑论坛 | 信息产业部 | 新浪科技 | 搜狐IT | 信息产业部电子教育与考试中心 |
| IT世界网 | 软件项目交易网 | 中国软件交易网 | 国信培训网 | 亚远景科技 | ....[更多] |