青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

春暖花開
雪化了,花開了,春天來了
posts - 149,comments - 125,trackbacks - 0
摘自: HTTP://WWW.Yonsm.NET/read.php?296

近日,由于程序設計需要,我對WincowsCE 的內存布局進行了研究,由于發現國內在這方面的文檔資料較少,于是在研究告一段落之際,形成這篇示例文檔,以望拋磚引玉,得到別的高手的指正?! ?br>一、程序實現的先決條件  
       由于windows系統的窗體消息總是投遞至一個特定進程的指定窗體消息函數中。于是在本地進程(自己的應用程序)中取得屬于其它進程的窗體的消息必須實現以下兩個部分: 
 1、將需要掛接窗體的代碼放到目標進程的地址空間中去?!?br> 2、執行這一段代碼,并獲得目標進程窗體的消息?!?br> 這兩步看起來很簡單,但在實現過程中就比較困難。由于Windows CE作為嵌入式移動設備操作系統,與windows 98/2000/XP等桌面操作系統在內核的設計理念以及API的支持上有極大的區別。這就直接導致了常規的桌面系統利用全局鼠標鉤子注入/遠程線程注入等方法在CE中完全得不通。不過可喜的是,微軟在開發工具中提供的remotexxx等遠程調試程序使我清楚這個目標并不是不可能的任務,微軟既然可以做到,那就是說在CE的內部一定有一套完整的跨進程內存訪問/代碼注入的機制?! ?br>二、程序實現的基本原理  
       經過兩天的google 搜索,在網上我發現了一個沒有在微軟文檔中聲明的有趣的API函數:PerformCallBack4,傳說中這個函數可以在自己的應用程序中執行指定的進程中的一個函數,So Cool!這好象正是我所需要的東西。雖然網上也傳聞這個函數在wm5不受支持,其實經過實踐這個傳聞只是謠傳而已!  PerformCallBack4函數的定義:
[DllImport("coredll.dll")]
public static extern uint PerformCallBack4
(ref CallBackInfo CallBackInfo,
IntPtr ni_pVoid1,
IntPtr ni_pVoid2,
IntPtr ni_pVoid3);  
其中函數的參數CallBackInfo結構定義:
[StructLayout(LayoutKind.Sequential)]
public struct CallBackInfo{public IntPtr hProc; //遠程的目標進程
                                         public IntPtr pfn; //指向遠程目標進程的函數地址的指針
                                         public IntPtr pvArg0; //函數的需要的第一個參數}
//end struct  
而PerformCallback4的 ni_pVoid1、ni_pVoid2、ni_pVoid3為傳遞到遠程目標進程執行函數的其它三個參數。  至于將代碼放到目標進程的內存空間,我們可以利用CE設計上的一個特性:  
1、為了節約內存使用,CE將所有程序調用的動態鏈接庫(DLL)都映射到同一個內存地址中?! ?br>2、CE的內存布局中劃分有一個slot0的內存位置,這個內存位置是由正在執行的進程所占有的,每一個特定的時間片,只能有一個進程可以占有這個內存空間。在進程要求執行時,系統并不直接執行進程所處內存位置的代碼,而是將該進程的執行代碼復制到slot0的內存位置中產生一個副本執行。也就是說進程在執行時內存將會有進程執行代碼的兩個完全一樣的版本:存在于slot0中正在執行的進程代碼和進程本身所處的內存中的代碼?! ≡谶@個特性下,可以得到結論:如果進程A通過LoadLibrary函數裝載Test.dll,而進程B也通過LoadLibrary函數裝載同一個Test.dll,這個Test.dll的所有函數在進程A和進程B中執行時,相對于slot0中的進程執行代碼都會得到同一地址?! ?br>3、在CE中,系統在內存中劃分出33個slot,slot0保留給正在執行的進程,然后在進程啟動時將所有的代碼放到除slot0以外的一個slot中(這就是臭名昭著的CE系統中內存最多只能有不多于32個程序執行的限制的來由)。在進程執行時,每個應用程序的內存訪問默認只能訪問slot0內存空間中的地址以及進程所處的slot內存空間的地址。 但為使設備驅動程序可以訪問到它們所需的其它應用程序數據,CE提供了兩個函數以打破這個限制,SetKmode和SetProcPermission,SetKmode函數告訴系統,當前運行的進程是否需要在內核模式中執行;SetProcPermission函數可以接受一個位掩碼,每一位代碼一個slot的訪問控制,1代表可以訪問該slot的內存內容。0表示不能訪問該slot的內存內容。這兩個函數在msdn中有幫助文檔,可參閱msdn的文檔說明?! ?br>        本文我們對實現的原理進行了剖析,在下一篇文章中我們將以一個小示例程序演示實現的全過程。 在文章《淺析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<HWND,HWND,DEFUDT_AttachWinInfo,DEFUDT_AttachWinInfo> 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
而在C#的主程序中,我們使用這個DLL掛接explore類的程序窗體,以下給出掛接部分的代碼:
      int m_hTargetWindow;//要掛接的目標窗體句柄I
      ntPtr m_hTargetProcess;//目標窗體所屬的進程
      IntPtr m_hModule; //掛接DLL的句柄
      private void Form1_Load(object sender, EventArgs e)
{ 
      IntPtr tpTemp = IntPtr.Zero, tpTempa = IntPtr.Zero; 
      uint tuntApiRet;
    m_hTargetWindow = (int)clsCECoreAPI.FindWindow("Explore", null ); //資源管理器 0x0013e800;
    //掛接指定的進程窗體消息 
        IntPtr thCurrentProcess = clsCECoreAPI.GetCurrentProcess(); 
         m_hTargetProcess=IntPtr.Zero ;// (IntPtr) (unchecked((int)0xedd84e4a)); 
         tuntApiRet= clsCECoreAPI.GetWindowThreadProcessId(new IntPtr(unchecked((int) m_hTargetWindow)),ref m_hTargetProcess);
    string tstrArgument; 
         tstrArgument = "\\Program Files\\processinject\\HookWindowsProcMFCDLL.dll";
         // HookWindowsProcMFCDLL.dll"; 
         IntPtr tpArg0;
       int tintOriginalKMode = clsCECoreAPI.SetKMode(1); 
         int tintOriginalProcPermission = (int)clsCECoreAPI.SetProcPermissions(0xffffffff);
       IntPtr tpFuncProc = clsCECoreAPI.GetProcAddress(clsCECoreAPI.GetModuleHandle("coredll.dll"), "LoadLibraryW");
       CallBackInfo tudtCALLBACKINFO;
       tpArg0 = clsCECoreAPI.MapPtrToProcess(tstrArgument, thCurrentProcess);
       tudtCALLBACKINFO.hProc = m_hTargetProcess;// Proc; 
         tudtCALLBACKINFO.pfn = clsCECoreAPI.MapPtrToProcess(tpFuncProc, m_hTargetProcess);          tudtCALLBACKINFO.pvArg0 = tpArg0; 
         m_hModule =new IntPtr(unchecked((int) clsCECoreAPI.PerformCallBack4(reftudtCALLBACKINFO,IntPtr.Zero,IntPtr.Zero,IntPtr.Zero ))); 
         //clsCECoreAPI.Sleep(1000);
       IntPtr thModule = clsCECoreAPI.LoadLibrary("HookWindowsProcMFCDLL.dll"); 
         tpFuncProc = clsCECoreAPI.GetProcAddress(thModule, "fnAttachWinProc");
       tpArg0 = (IntPtr) m_hTargetWindow;
         // clsCECoreAPI.MapPtrToProcess(ref thTargetWindow, thCurrentProcess);
       tudtCALLBACKINFO.hProc = m_hTargetProcess; 
            tudtCALLBACKINFO.pfn = clsCECoreAPI.MapPtrToProcess(tpFuncProc, m_hTargetProcess);          tudtCALLBACKINFO.pvArg0 = tpArg0 ; 
         tuntApiRet = clsCECoreAPI.PerformCallBack4(reftudtCALLBACKINFO,IntPtr.Zero,IntPtr.Zero,IntPtr.Zero ); 
         //clsCECoreAPI.Sleep(5000);
}
   [DllImport("HookWindowsProcMFCDLL.dll")]
   public static extern int fnAttachWinProc(IntPtr ni_hAttatchWin);
   [DllImport("HookWindowsProcMFCDLL.dll")]
   public static extern int fnDetachWinMsgProc(IntPtr ni_hDetachWin);
取消掛接的代碼根據上述代碼很容易就可以建立,不再細敘。
注:clsCECoreAPI的函數全是封裝的標準CE API,由于這些API在msdn 中都有詳細的文檔注釋,因篇幅所限,不再將代碼一一列舉.
在執行這個程序時,將模擬器的共享路徑設為PC機的桌面,這樣模擬器的storage card目錄就等同桌面了,點模擬器的開始菜單,選程序,你就可以看到explore窗體的消息都輸出到桌面的WinProcInfo.txt文件中了,運行結果如下:    
目前本程序只在PPC2003/wm5 for PPC測試通過,由于smartphone系統在編譯時使用了和ppc系統不同的機制,內存運作不明,本程序在smartphone上無法正確運行,有好的建議的話請指教一二,謝謝.
作者:莫藝潛轉自:http://cqreview.yesky.com/dev/185/2590685.shtml

一個令我好奇的領域.
posted on 2009-07-16 16:11 Sandy 閱讀(496) 評論(0)  編輯 收藏 引用 所屬分類: Windows Mobile
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线一区二区三区做爰视频网站 | 亚洲三级国产| 国产欧美日韩不卡| 久久九九全国免费精品观看| 一本一道久久综合狠狠老精东影业| 尤物在线观看一区| 亚洲欧洲一区二区在线观看 | 狠狠色狠狠色综合日日五| 一区在线视频| 日韩系列欧美系列| 亚洲欧美成人一区二区在线电影| 午夜精品短视频| 久久国产日韩| 欧美成人免费va影院高清| 亚洲第一区在线| 亚洲黄色在线| 亚洲素人在线| 久久久久久成人| 欧美韩国在线| 国产精品一区二区三区四区五区| 国产午夜亚洲精品不卡| 亚洲国产一区二区三区高清| 亚洲社区在线观看| 麻豆视频一区二区| 一区二区成人精品 | 国产精品色午夜在线观看| 国产一在线精品一区在线观看| 最新日韩av| 久久综合五月天婷婷伊人| 欧美α欧美αv大片| 一区二区欧美激情| 亚洲欧美日韩视频二区| 免费日韩av电影| 国产麻豆日韩| 亚洲美女黄色片| 久久九九热免费视频| 亚洲日本欧美在线| 欧美一级欧美一级在线播放| 欧美日韩亚洲一区二区三区四区| 国产偷自视频区视频一区二区| 日韩视频永久免费| 久热综合在线亚洲精品| 夜夜狂射影院欧美极品| 免费在线看一区| 国产真实久久| 亚洲欧美变态国产另类| 亚洲高清电影| 久久精品国产精品亚洲精品| 欧美激情一区二区三区 | 亚洲女人天堂成人av在线| 久久综合给合| 国产啪精品视频| 中文精品视频一区二区在线观看| 亚洲一区二区四区| 欧美激情区在线播放| 久久偷窥视频| 国产欧美日韩一区二区三区在线观看 | 国产精品日韩欧美一区二区三区 | 欧美在线免费观看亚洲| 亚洲精品日韩一| 欧美国产日韩精品| 国产一区二区中文字幕免费看| 午夜精品久久一牛影视| 一区二区av在线| 欧美激情精品久久久久久黑人 | 欧美日韩中文字幕日韩欧美| 狠狠干综合网| 麻豆成人在线| 欧美一区二区三区久久精品茉莉花| 欧美日一区二区在线观看 | 黄网动漫久久久| 国产日韩欧美中文在线播放| 一本久道综合久久精品| 欧美成人首页| 免费高清在线视频一区·| 亚洲国产成人一区| 免费的成人av| 欧美电影免费| 99riav1国产精品视频| 亚洲欧洲在线视频| 欧美日精品一区视频| 亚洲图片欧洲图片日韩av| 亚洲午夜av在线| 欧美日韩一卡二卡| 性欧美大战久久久久久久免费观看| 亚洲网站在线| 国产一区二区三区高清| 久久婷婷综合激情| 欧美一区精品| 91久久午夜| 亚洲狼人精品一区二区三区| 欧美日韩网址| 亚洲欧美另类久久久精品2019| 一区二区三区|亚洲午夜| 国产精品久久久久久久久| 性欧美xxxx大乳国产app| 欧美一站二站| 亚洲精品永久免费| 野花国产精品入口| 国产精品一区二区a| 欧美一区二视频| 久久综合电影| 一本一道久久综合狠狠老精东影业| 亚洲一区影院| 亚洲精品国产精品国自产观看| 日韩视频在线观看免费| 国产一区视频在线观看免费| 亚洲区一区二区三区| 国产精品入口66mio| 欧美成人一区在线| 国产精品激情电影| 久久久免费精品| 欧美午夜一区二区三区免费大片| 久久久久久久国产| 欧美日韩国产限制| 久久久欧美精品| 国产精品久久久久久亚洲调教| 美女久久一区| 国产欧美视频一区二区| 亚洲黄色一区| 韩国女主播一区二区三区| 一区二区av在线| 在线免费一区三区| 亚洲午夜伦理| 亚洲尤物在线视频观看| 欧美不卡三区| 欧美电影免费观看| 狠狠干综合网| 欧美在线观看天堂一区二区三区 | 99精品欧美一区| 久久综合狠狠| 免费观看30秒视频久久| 国产在线视频欧美| 欧美在线在线| 久久精品成人欧美大片古装| 亚洲精品午夜精品| 久久免费国产精品| 亚洲国产专区| 欧美在线www| 欧美在线一级视频| 国产精品萝li| 亚洲少妇在线| 亚洲影院在线| 欧美午夜宅男影院| 99re66热这里只有精品4 | 欧美自拍偷拍午夜视频| 亚洲欧美制服中文字幕| 欧美大尺度在线| 亚洲高清视频的网址| 亚洲精品一区二区三区在线观看| 久久尤物视频| 欧美顶级大胆免费视频| 在线日韩av| 欧美大胆成人| 中文日韩在线| 午夜精品久久久久久| 国产精品av免费在线观看| 亚洲一区二区欧美日韩| 久久精品在线观看| 亚洲高清视频在线观看| 欧美激情小视频| 亚洲深夜福利| 久久亚洲综合色| 亚洲人成7777| 国产精品久久久久久久久久免费看| 亚洲欧美国产77777| 女人香蕉久久**毛片精品| 一本久久综合| 国产亚洲精品资源在线26u| 麻豆av福利av久久av| 亚洲国产精品美女| 欧美日韩日本国产亚洲在线| 亚洲欧美日韩综合| 欧美gay视频| 亚洲一区精品视频| 伊人狠狠色j香婷婷综合| 欧美精品午夜| 亚洲男人的天堂在线| 欧美黄色大片网站| 亚洲免费在线精品一区| 亚洲成色精品| 国产精品美女一区二区| 蜜臀va亚洲va欧美va天堂| 亚洲一二三区精品| 欧美成人69| 欧美伊人久久| 一区二区毛片| 在线国产精品一区| 国产久一道中文一区| 欧美1级日本1级| 欧美伊人久久大香线蕉综合69| 亚洲精品一区二区三区av| 玖玖精品视频| 久久se精品一区精品二区| 亚洲人成高清| 亚洲国产精品成人va在线观看| 国产欧美一区二区色老头| 欧美日韩一区二| 欧美黄色网络| 久久夜色精品一区|