尤物av无码色av无码_国产精品视频一区二区三区四_麻豆国产传媒精品视频_最近中文在线国语_久久天堂av综合合色蜜桃网_亚洲精品国产高清在线观看_精品久久久久久无码专区_精品人妻无码一区二区三区_麻豆乱码国产一区二区三区_在厨房我撕开岳的丁字裤

湖南大學論壇|先為求是

 找回密碼
 注冊(開放注冊)
查看: 10134|回復: 3
打印 上一主題 下一主題

Windows CE跨進程內存注入的原理

[復制鏈接]
跳轉到指定樓層
1#
發(fā)表于 2013-1-19 16:11:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
近日,由于程序設計需要,我對WincowsCE 的內存布局進行了研究,由于發(fā)現(xiàn)國內在這方面的文檔資料較少,于是在研究告一段落之際,形成這篇示例文檔,以望拋磚引玉,得到別的高手的指正。

  一、程序實現(xiàn)的先決條件

  由于Windows系統(tǒng)的窗體消息總是投遞至一個特定進程的指定窗體消息函數(shù)中。于是在本地進程(自己的應用程序)中取得屬于其它進程的窗體的消息必須實現(xiàn)以下兩個部分:

  1、將需要掛接窗體的代碼放到目標進程的地址空間中去。

  2、執(zhí)行這一段代碼,并獲得目標進程窗體的消息。

  這兩步看起來很簡單,但在實現(xiàn)過程中就比較困難。由于Windows CE作為嵌入式移動設備操作系統(tǒng),與Windows 98/2000/XP等桌面操作系統(tǒng)在內核的設計理念以及API的支持上有極大的區(qū)別。這就直接導致了常規(guī)的桌面系統(tǒng)利用全局鼠標鉤子注入/遠程線程注入等方法在CE中完全得不通。不過可喜的是,微軟在開發(fā)工具中提供的remotexxx等遠程調試程序使我清楚這個目標并不是不可能的任務,微軟既然可以做到,那就是說在CE的內部一定有一套完整的跨進程內存訪問/代碼注入的機制。

  二、程序實現(xiàn)的基本原理

  經過兩天的google 搜索,在網上我發(fā)現(xiàn)了一個沒有在微軟文檔中聲明的有趣的API函數(shù):PerformCallBack4,傳說中這個函數(shù)可以在自己的應用程序中執(zhí)行指定的進程中的一個函數(shù),So Cool!這好象正是我所需要的東西。雖然網上也傳聞這個函數(shù)在wm5不受支持,其實經過實踐這個傳聞只是謠傳而已!

  PerformCallBack4函數(shù)的定義:

  public static extern uint PerformCallBack4(ref CallBackInfo CallBackInfo,

  IntPtr ni_pVoid1,IntPtr ni_pVoid2,IntPtr ni_pVoid3);

  其中函數(shù)的參數(shù)CallBackInfo結構定義:

  public struct CallBackInfo

  {

  public IntPtr hProc; //遠程的目標進程

  public IntPtr pfn; //指向遠程目標進程的函數(shù)地址的指針

  public IntPtr pvArg0; //函數(shù)的需要的第一個參數(shù)

  }//end struct

  而PerformCallback4的 ni_pVoid1、ni_pVoid2、ni_pVoid3為傳遞到遠程目標進程執(zhí)行函數(shù)的其它三個參數(shù)。

  至于將代碼放到目標進程的內存空間,我們可以利用CE設計上的一個特性:

  1、為了節(jié)約內存使用,CE將所有程序調用的動態(tài)鏈接庫(DLL)都映射到同一個內存地址中。

  2、CE的內存布局中劃分有一個slot0的內存位置,這個內存位置是由正在執(zhí)行的進程所占有的,每一個特定的時間片,只能有一個進程可以占有這個內存空間。在進程要求執(zhí)行時,系統(tǒng)并不直接執(zhí)行進程所處內存位置的代碼,而是將該進程的執(zhí)行代碼復制到slot0的內存位置中產生一個副本執(zhí)行。也就是說進程在執(zhí)行時內存將會有進程執(zhí)行代碼的兩個完全一樣的版本:存在于slot0中正在執(zhí)行的進程代碼和進程本身所處的內存中的代碼。

  在這個特性下,可以得到結論:如果進程A通過LoadLibrary函數(shù)裝載Test.dll,而進程B也通過LoadLibrary函數(shù)裝載同一個Test.dll,這個Test.dll的所有函數(shù)在進程A和進程B中執(zhí)行時,相對于slot0中的進程執(zhí)行代碼都會得到同一地址。

  3、在CE中,系統(tǒng)在內存中劃分出33個slot,slot0保留給正在執(zhí)行的進程,然后在進程啟動時將所有的代碼放到除slot0以外的一個slot中(這就是臭名昭著的CE系統(tǒng)中內存最多只能有不多于32個程序執(zhí)行的限制的來由)。在進程執(zhí)行時,每個應用程序的內存訪問默認只能訪問slot0內存空間中的地址以及進程所處的slot內存空間的地址。 但為使設備驅動程序可以訪問到它們所需的其它應用程序數(shù)據(jù),CE提供了兩個函數(shù)以打破這個限制,SetKmode和SetProcPermission,SetKmode函數(shù)告訴系統(tǒng),當前運行的進程是否需要在內核模式中執(zhí)行;SetProcPermission函數(shù)可以接受一個位掩碼,每一位代碼一個slot的訪問控制,1代表可以訪問該slot的內存內容。0表示不能訪問該slot的內存內容。這兩個函數(shù)在msdn中有幫助文檔,可參閱msdn的文檔說明。
2#
發(fā)表于 2013-1-19 22:37:35 | 只看該作者
恩,我覺得值得學習啊,頂你
3#
發(fā)表于 2013-1-20 05:00:32 | 只看該作者
好的,頂你,收藏了嘻嘻
4#
發(fā)表于 2013-1-20 11:25:39 | 只看該作者
這個問題很有用,不錯
您需要登錄后才可以回帖 登錄 | 注冊(開放注冊)

本版積分規(guī)則

手機訪問本頁請
掃描左邊二維碼
本網站聲明
本網站所有內容為網友上傳,若存在版權問題或是相關責任請聯(lián)系站長!
站長電話:0898-66661599    站長聯(lián)系QQ:12726567   
站長微信:hainanok
請掃描右邊二維碼
www.myujob.com

小黑屋|手機版|Archiver|湖南大學先為求是 ( 瓊ICP備10001123號 )

GMT+8, 2025-11-10 20:01 , Processed in 2.807103 second(s), 14 queries .

Powered by 校園招聘信息

© 2001-2020 湖南大學先為求是校園招聘

快速回復 返回頂部 返回列表