亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種遍歷和訪問被測應用程序中對象的方法

文檔序號:6421166閱讀:120來源:國知局
專利名稱:一種遍歷和訪問被測應用程序中對象的方法
技術領域
本發(fā)明涉及通信或電子領域中的測試技術,尤其涉及一種遍歷和訪問被測應用程序中對象的方法。
背景技術
在測試過程中經(jīng)常需要獲取被測應用程序一些對象的各種信息,典型的如行自動測試時,需要自動獲取界面對象的各種信息,比如界面對象表面的文字,該對象的位置、大小、顏色等等。由于源程序在編譯生成可執(zhí)行程序之后,原先在源代碼中可見的各種符號,比如函數(shù)名稱、類的內(nèi)部變量等都被替換成了內(nèi)存地址等數(shù)字,這使得訪問運行階段的對象信息變得困難。
Windows等操作系統(tǒng)為每個位應用程序提供獨立的內(nèi)存地址空間,并且對這些空間加以保護,不允許一個進程隨便訪問其它進程空間的信息,因此使得傳統(tǒng)的獨立運行的測試工具無法直接訪問被測應用程序內(nèi)部的各種所需信息。
現(xiàn)有技術中主要有兩種方案來訪問被測應用程序的內(nèi)部信息方案一、在訪問界面對象方面,通過windows提供的應用編程接口(API)來訪問界面對象的部分信息,比如標題大小位置等??梢姷慕缑鎸ο笠话愣祭^承自window對象,windows提供了一組函數(shù)用以訪問這些window的一些基本屬性。比如首先設法獲取界面對象的句柄(handle),比如可以通過window的WindowFromPoint函數(shù)獲取指定位置的一個可見界面對象的handle。然后根據(jù)該handle可以獲得一系列的信息,比如窗口的標題、位置、大小風格等。
雖然采用方案一能夠獲得對象的部分信息,但存在以下缺點1、windows僅僅提供了最基本的一些對象的識別和獲取這些對象屬性的方法,對于各種自定義的對象,則無法或者極難獲得必須的信息。
2、對于一些特殊的可見對象無法識別。
方案二、通過在源代碼中加入一些額外的代碼,由這些代碼作為一個橋梁,把程序內(nèi)部的信息傳遞出來,并響應外部的控制。比如Rational公司為了能夠使其測試工具Rebot能夠識別更多的Delphi開發(fā)的應用程序的界面對象,編寫了一個叫做《SQASrvr.pas》的模塊,把該模塊和被測應用程序一同編譯,就能夠?qū)崿F(xiàn)對被測應用程序各種界面對象的識別。其基本原理是通過對Delphi界面對象的修改,向外提供Com接口用來訪問這些界面對象的重要的信息。
雖然方案二理論上可以實現(xiàn)對所有種類對象的所有信息的訪問,但仍存在以下缺點1、對于已編譯的可執(zhí)行程序,不能發(fā)揮作用;對不許修改源程序的應用也不能發(fā)揮作用,因而該方法的使用受到限制。
2、若訪問的對象種類很多,訪問的信息很多,則試圖通過該通用模塊達到目的的做法將使實現(xiàn)復雜度增加。
3、若不通過獨立通用的模塊,而是采用在被測試程序代碼內(nèi)部各部分增加接口代碼的方法來達到目的,則使得代碼的維護工作量劇增。

發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種遍歷和訪問被測應用程序中對象的方法,以解決采用現(xiàn)有技術訪問被測應用程序內(nèi)部信息存在復雜性高和使用受限制的問題。
解決上述問題,本發(fā)明提供下述技術方案一種遍歷和訪問被測應用程序中對象的方法,該方法包括步驟將測試工具注入被測應用程序,使測試工具和被測應用程序運行于相同的進程空間;由測試工具對被測應用程序占用的實際內(nèi)存空間進行搜索,查找到用于生成特定對象的類的內(nèi)存地址,其中該特定對象包含有被測應用程序所有已創(chuàng)建窗口對象的信息并指向所述類;
根據(jù)所述類的內(nèi)存地址和所述特定對象的存放格式及特征找到該特定對象的內(nèi)存地址;遍歷存放所述特定對象占用的內(nèi)存區(qū)域,根據(jù)各對象的特征和存放格式查找和訪問各窗口對象以及窗口對象包含的其他對象的內(nèi)容。
根據(jù)上述方法將測試工具注入被測應用程序由被測應用程序通過插件接口主動調(diào)用測試工具來實現(xiàn),或者通過將測試工具強行插入被測試對象來實現(xiàn)。
測試工具查找用于生成特定對象的類的內(nèi)存地址包括步驟(1)判斷一定長度的內(nèi)存區(qū)是否能找到一塊保存有自身地址的內(nèi)存,如果是則進行步驟(2),否則進行步驟(4);(2)取所述一塊內(nèi)存的前一段存放的內(nèi)容,并判斷該內(nèi)容是否是一個記錄了類名稱的字符串的地址,如果是則進行步驟(3),否則進行步驟(4);(3)從所述內(nèi)存區(qū)內(nèi)的指定偏移位置取記錄該類的實例所占內(nèi)存大小的值,并判斷是否與實際類的大小相符,如果是則查找到用于生成特定對象的類,結束該次查找,否則進行步驟(4);(4)繼續(xù)在下一內(nèi)存區(qū)進行查找,并進行步驟(1)。
測試工具訪問對象內(nèi)容至少包括訪問對象內(nèi)部屬性變量和對象內(nèi)部函數(shù)。
訪問對象內(nèi)部屬性變量包括步驟根據(jù)該對象的內(nèi)存中的地址和內(nèi)部屬性變量的地址偏移得到該內(nèi)部屬性變量的實際內(nèi)存地址;調(diào)用接口函數(shù)從所述實際內(nèi)存地址獲取內(nèi)部屬性變量的值或向所述實際內(nèi)存賦值。
訪問對象內(nèi)部函數(shù)包括步驟從被測應用程序的MAP文件中獲取對象內(nèi)部函數(shù)的地址偏移;根據(jù)所述地址偏移和被測應用程序的代碼段在內(nèi)存中的實際地址得到所述內(nèi)部函數(shù)的實際地址;調(diào)用所述內(nèi)部函數(shù)并將參數(shù)傳遞給該函數(shù);以及獲取返回結果。
本發(fā)明具有以下有益效果1、把測試工具注入到被測試程序,使得訪問被測試程序內(nèi)部信息相對于獨立運行的工具而言簡單很多,由于避過了操作系統(tǒng)的限制,因此訪問這些信息十分方便,也更加安全可靠。
2、通過根據(jù)類和對象特征進行搜索的方法,能夠遍歷所有的對象,借助于Map文件等手段,使得訪問和控制這些對象效率更高,也更加可靠。
3、由于不對源程序進行修改,因此減少了測試程序代碼和源程序代碼共同維護協(xié)調(diào)的工作量,也避免了工具代碼對被測試程序在源代碼一級的影響。


圖1為實施本發(fā)明的計算機裝置結構圖;圖2為本發(fā)明的主流程圖;圖3為查找類的內(nèi)存地址的流程圖。
具體實施例方式
在面向?qū)ο蟮睦碚撝校惡蛯ο笫莾蓚€重要的概念。類可以形象的理解為提供生成對象的模塊子,而對象則是由類生成的實體。軟件由源代碼編譯成可執(zhí)行程序后,類被以某種確定的格式存放在內(nèi)存中,類實例化后成為一個對象。
本發(fā)明根據(jù)對象的格式以及存放位置,通過內(nèi)存映射來訪問該對象的內(nèi)部變量,通過調(diào)用對象的內(nèi)部函數(shù)來獲取所需信息。其中,所述對象的內(nèi)部變量是指僅用于存放數(shù)據(jù)的變量,與一些面向?qū)ο竺枋鲋械念惖膶傩韵嗨?,但那些讀寫過程將引發(fā)相應的動作的屬性不在此列;所述類的內(nèi)部函數(shù)指類的方法。
圖1顯示了一臺計算機,用它來實施描述的方法。計算機具有一個處理器,它通過總線和存儲器相連接,同時還通過總線連接輸入輸出接口。
存儲器儲存了計算機運行所需基本的計算機程序,如視窗操作系統(tǒng)(Windows)等,以及測試工具和被測應用程序。輸入輸出接口連接鍵盤、外部存儲器和顯示器,測試工具對被測應用程序的測試信息等通過顯示器顯示出來。
應用程序在計算機中運行時,由于操作系統(tǒng)為每一個應用程序建立一個進程空間并對進程空間進行足夠的保護,使不同的應用程序運行于不同的進程空間。因此,使得不同的應用之間信息訪問變得困難。為了繞過操作系統(tǒng)的限制,本發(fā)明將測試工具注入被測應用程序。
測試工具注入被測應用程序的方法有很多,一種最簡單的方法是被測試應用提供插件接口,測試工具編譯成動態(tài)庫,由被測試應用主動調(diào)用測試工具;這種方法對于測試工具而言是被動侵入被測試應用,依賴于被測試對象必須實現(xiàn)提供這樣的接口。主動侵入到被測試對象的方法現(xiàn)有技術中有多種,如通過全局系統(tǒng)鉤子(system hook)來實現(xiàn)。系統(tǒng)鉤子是指通過操作系統(tǒng)的鉤子API函數(shù)(比如Windows的SetWindowsHookEx函數(shù)),通過調(diào)用SetWindowsHookEx(WH_mouse,HookHandler,HInstance,0)函數(shù)可以為鼠標操作設置一個鉤子,也就是當應用程序接受到鼠標操作時,會因為這個鉤子而自動觸發(fā)HookHandler指向的函數(shù),該函數(shù)是通過動態(tài)庫實現(xiàn)的一個回調(diào)函數(shù),也就是應用程序遇到鼠標操作時會檢查是否已經(jīng)裝入該實現(xiàn)了回調(diào)函數(shù)的動態(tài)庫,如果沒有就會把該動態(tài)庫加載起來,如果已經(jīng)加載過該動態(tài)庫了就可以直接調(diào)用函數(shù)了;因此,通過系統(tǒng)鉤子來實現(xiàn)利用的只是被測試應用自動加載動態(tài)庫這樣一個屬性,一旦測試工具被加載到被測試應用程序空間,讓工具與被測試應用運行在同一空間的目標就實現(xiàn)了。又如通過Windows提供的創(chuàng)建遠程線程的方式,通過觸發(fā)程序在被測應用程序中動態(tài)創(chuàng)建一個線程,該線程則完成裝入指定動態(tài)庫的方法,通常的方法是調(diào)用CreateRemoteProcess(),在被測試應用中創(chuàng)建一個線程,該線程負責的工作就是執(zhí)行LoadLibrary函數(shù),而LoadLibrary函數(shù)的參數(shù)就是我們的測試工具的動態(tài)庫,比如工具的動態(tài)庫叫做“testtool.dll”,通過下面一組調(diào)用即可實現(xiàn)dllspace=VirtualAllocEx(process,nil,length(dllname),MEM_COMMIT,PAGE_readwrite);WriteProcessMemory(process,dllspace,’testtool.dll’,length(‘testtool.dll’),count);
proc=getprocaddress(getmodulehandle(′Kernel32.dll′),′LoadLibraryA′);newthread=CreateRemoteThread(process,nil,0,proc,dllspace,0,threadid);VirtualFreeEx(process,nil,length(dllname),MEM_COMMIT)。
本發(fā)明搜索對象的基本方法是在被測應用進程的內(nèi)存空間對滿足指定特征的內(nèi)存塊進行搜索,把滿足特征的內(nèi)存地址記錄下來,映射成一個對象。
源程序被編譯成可執(zhí)行程序之后,會把所有的類(模子)按照一定的順序和結構組織存放在可執(zhí)行程序中,當可執(zhí)行程序執(zhí)行起來之后,類會被裝入到內(nèi)存中,也就是類會被按照一定的格式和順序存放到內(nèi)存的某位置。對象則是被測試應用執(zhí)行起來之后,通過調(diào)用類的構造函數(shù)生成的類的一個實例,對象的構造函數(shù)一般只是完成對象的空間分配和初始設置,對象被創(chuàng)建出來之后也只是一段存放在特定位置、存放了一些特定信息的特定大小內(nèi)存。對象的內(nèi)部屬性變量則就是對象所占有的特定內(nèi)存塊中的特定區(qū)域。對象的內(nèi)部函數(shù),則無論對應于幾個對象,都只有一個函數(shù)實體,區(qū)分不同的對象是通過把對象所指的地址作為對象函數(shù)的第一參數(shù)來實現(xiàn)的(當然這個參數(shù)在實際編寫源代碼時是不用顯式給出的,編譯器幫助完成了此項工作)。
在窗口應用程序中,有一個特定的對象,該對在程序運行一開始即被創(chuàng)建,并存放該應用程序所有已建的窗口,而每個窗口對象中則又存放了所有界面控件,每個界面控件則又存放了所有的子控件,同時該對象的相應指針指向生成的該對象的類。因此可以通過遍歷該對象在內(nèi)存中的存放結構取出所有的界面對象。
參閱圖2所示,本發(fā)明的主要流程如下步驟10將測試工具注入被測應用程序,并啟動程序進行測試。
步驟20由測試工具對被測應用程序占用的實際內(nèi)存空間進行搜索,查找到用于生成特定對象的類的內(nèi)存地址,其中該特定對象包含有被測應用程序所有已創(chuàng)建窗口對象的信息并指向所述類。
步驟30根據(jù)所述類的內(nèi)存地址和所述特定對象的存放格式及特征找到該特定對象的內(nèi)存地址。
步驟40遍歷存放所述特定對象占用的內(nèi)存區(qū)域,根據(jù)各對象的特征和存放格式查找和訪問各窗口對象以及窗口對象包含的其他對象的內(nèi)容。
參閱圖3所示,步驟20的具體處理過程如下步驟100開始遍歷一定長度的內(nèi)存區(qū);步驟120判斷是否能找到一塊內(nèi)存(32位操作系統(tǒng)對應4字節(jié)),其中存放這段內(nèi)存自身的地址,比如在地址段0xaaaaaaaa中存放內(nèi)容為0xaaaaaaaa,如果是則進行步驟130,否則進行步驟160;步驟130取所述內(nèi)存區(qū)前一段存放的內(nèi)容,如步驟120中0xaaaaaaaa地址前的4個字節(jié)空間0xaaaaaaa6,并判斷該內(nèi)容是否是一個記錄了類名稱的字符串的地址,如果是則進行步驟140,否則進行步驟160;步驟140從所述內(nèi)存區(qū)內(nèi)的指定偏移位置取記錄該類的實例所占內(nèi)存大小的值,并判斷是否與實際類的大小相符,如果是則進行步驟150,否則進行步驟160;步驟150查找到用于生成特定對象的類的地址并結束該次查找;步驟160繼續(xù)在下一內(nèi)存區(qū)進行查找,并進行步驟120。
測試工具訪問對象內(nèi)容至少包括訪問對象內(nèi)部屬性變量和對象內(nèi)部函數(shù)。
訪問對象內(nèi)部屬性變量是根據(jù)該對象的內(nèi)存中的地址和內(nèi)部屬性變量的地址偏移得到該內(nèi)部屬性變量的實際內(nèi)存地址,然后調(diào)用接口函數(shù)從所述實際內(nèi)存地址獲取內(nèi)部屬性變量的值或向所述實際內(nèi)存賦值。
訪問對象內(nèi)部函數(shù)是從被測應用程序的MAP文件中獲取對象內(nèi)部函數(shù)的地址偏移,然后根據(jù)所述地址偏移和被測應用程序的代碼段在內(nèi)存中的實際地址得到所述內(nèi)部函數(shù)的實際地址,最后調(diào)用所述內(nèi)部函數(shù)并將參數(shù)傳遞給該函數(shù)并獲取返回結果。
為了更清楚的描述本發(fā)明的方法,下面以Delphi5.0實現(xiàn)的應用程序為例進行詳細說明1、對象的搜索在Delphi5.0中,編譯后的應用程序,所有類(class)被以固定格式存放在一定連續(xù)的空間,其格式為

由此,若要通過遍厲內(nèi)存的方式來查找類的存放位置,當知道一個類的名稱、實例大小、父類等信息時,就可以利用上述規(guī)則。首先通過vmtSelfPtr指針判斷目標指針是否指向合法的類,然后可通過對象名稱、對象實例大小、父類等信息進一步確認。
一個對象在內(nèi)存中的結構則相對簡單,前四個字節(jié)存放該對象所屬的類的指針,隨后則存放所有的內(nèi)部變量。例如這樣一個類classa=classa,b,cinteger;end;
另一個類如下classb=class(classa)aa,ainteger;procudure proca;functionfuncb(a,b,cinteger)integer;end;若創(chuàng)建一個classb類的實例objb,內(nèi)存中對應存儲的數(shù)據(jù)應為

若了解一個對象設計實現(xiàn)的有關信息,再搜索這個對象的實例,就比較簡單。,首先,判斷某指定的內(nèi)存前四個字節(jié)是否指向正確的類的地址,然后根據(jù)所了解的某些內(nèi)部變量的值進行進一步確認。
在delphi5.0的窗口應用程序中有兩個預定義好的對象非常重要,一個是TScreen類的screen對象,一個是TApplication類的application對象,這兩個對象在程序運行一開始即被自動創(chuàng)建,存放了非常重要的信息,其中在Screen對象中,存放了該應用程序所有已經(jīng)創(chuàng)建的窗口,而每個窗口對象中則又存放了所有界面控件,每個界面控件中則存放了所有的子控件。由此在界面測試中,可以通過該結構遍歷取出所有的界面對象。以此為例進一步介紹搜索對象的過程。
首先檢索出TScreen類在內(nèi)存中的位置,檢索方法對指定一塊的內(nèi)存進行遍歷,判斷是否有一內(nèi)存前76字節(jié)出連續(xù)4個字節(jié)存放著該內(nèi)存所對應的地址值,若是則表明可能是一段類的數(shù)據(jù),在將其前44個字節(jié)存放的內(nèi)容取出,判斷指向的是否是一段記錄了類名稱的字符串。若是基本可以確定是存放TScreen類的內(nèi)存塊了,可以通過實例大小做進一步確認。
找到Tscreen類的位置后,記錄該地址,然后搜索screen的位置,搜索方法是遍歷內(nèi)存,找到前四字節(jié)值等于Tscreen位置值的內(nèi)存,該位置可能存放的就是一個Screen實例,然后,再根據(jù)對Screen對象細節(jié)的一些了解進行進一步確認,Tscreen繼承自Tcomponent對象,通過分析可以知道,Screen對象的父對象為空,對象中的名稱屬性為空,由此可以得到進一步確認依據(jù)該內(nèi)存第四字節(jié)往后連續(xù)四字節(jié)值為0,再接著的4個字節(jié)存放一個指針,指向一個內(nèi)容為空的字符串。滿足這些特性的內(nèi)存一定指向Screen對象。
Delphi中的Tscreen對象中有一個屬性叫做FormList,其中存放了被測試應用中的所有已經(jīng)創(chuàng)建的窗口的實例指針,窗口都繼承自Tcomponent,每個窗口都有一個屬性叫做Components,還有一個屬性叫做Controls,分別存放著窗口中包含的所有不可見的控件(比如一個定時器,或者Socket控件)以及所有的可見控件(比如Button,EditBox,Label等)。
2、對象內(nèi)部屬性變量的映射找到了對象實例的地址,若工具本身就是通過delphi5.0寫的,則在實現(xiàn)工具的源代碼一級已經(jīng)可以訪問對象的各項內(nèi)容了。但是為了在工具運行階段實現(xiàn)對各種對象方面的訪問,需要使用以下描述的方法。
根據(jù)前文描述,對象實例中存放著包括對象所屬類以及所有祖先類的所有內(nèi)部變量。據(jù)此,可以抽象成統(tǒng)一的接口函數(shù)供工具中腳本引擎模塊使用,測試工具使用的是python的引擎,在工具運行階段,通過調(diào)用接口函數(shù)訪問對象內(nèi)部指定偏移處的信息,并對各指定偏移進行命名(在設計時對象各個內(nèi)部變量是有名稱、類型以及具體含義的,但是經(jīng)過編譯后這些信息都被丟掉了,只能通過設計實現(xiàn)時定義的結構推算各字段也就是對象的內(nèi)部變量的偏移,然后根據(jù)偏移量獲取這些字段的值,可以在腳本中重新給這些偏移定義名稱)。
仍然以前面的例子為例,獲知對象objb在內(nèi)存中的位置,并且想要獲得objb內(nèi)部變量aa,經(jīng)推算,可以知道該字段在對象中的偏移為16,大小為4個字節(jié),因此只要從對象objb對應地址偏移16的位置開始取4個字節(jié),即為aa的值,要想取從classa繼承過來的字段a,可以從偏移4的位置取4個字節(jié),即為對象objb從classa繼承過來的a字段的值。接口函數(shù)可以實現(xiàn)如下function GetObjKeyValue(objpointer;offsetinteger;sizeinteger)integer;beginresult=0;move((obj+offset)^,result,size);end;//pascal中result表示返回值然后通過python提供的api將該函數(shù)轉(zhuǎn)換為python可以調(diào)用的函數(shù)(具體方法為現(xiàn)有技術,不在此列出)。
3、對象內(nèi)部方法的映射獲取對象的內(nèi)部變量是相對比較容易的,只要能夠算出具體的偏移,并獲得對象的地址,即可按照上述方法進行。
調(diào)用對象的方法則相對困難一些,在工具的源程序一級對已經(jīng)搜索出來的對象進行函數(shù)調(diào)用是直接而簡單的,和調(diào)用通常的對象的方法沒有什么區(qū)別。但是若試圖在腳本中調(diào)用對象的方法,則需要使用下面方法由于源代碼在編譯成執(zhí)行程序之后,類和對象內(nèi)部的很多信息都丟失了,比如對象內(nèi)部變量的名稱、對象內(nèi)部函數(shù)方法的名稱、這些函數(shù)方法的調(diào)用原形返回值等都在編譯成執(zhí)行文件的過程中丟失了。因此若想在運行階段獲取對象的內(nèi)部函數(shù)方法的位置并正確的調(diào)用他們基本上是不可能的,必須借用編譯過程生成的一些附件,并根據(jù)這些信息實現(xiàn)對對象內(nèi)部函數(shù)的訪問。
(1)獲取對象內(nèi)部函數(shù)的位置(地址)的方法在編譯過程中可以把生成Map的開關設置為detail級別,這樣編譯過程中,編譯器將會把源代碼所有變量、函數(shù)、類型等符號對應在執(zhí)行程序中的偏移位置記錄下來,然后根據(jù)這個偏移計算出執(zhí)行期間的各符號在內(nèi)存中的位置。
比如delphi5.0編譯生成Map文件后,有類似如下的記錄000100032638 classb.proca0001000326aa classb.funcb
冒號前面的一個數(shù)字,表示在哪個段,通常0001表示代碼段,00002表示數(shù)據(jù)段,具體情況可以查看map文件開頭的段定義部分,冒號后面的數(shù)字是表示在段中的偏移,空格后面的標識符是源代碼中的符號。上面一段的文字含義為classb的proca函數(shù)在代碼段的032638位置。classb的funcb在代碼段的0326aa位置。實際運行階段需要把該偏移位置信息轉(zhuǎn)換成內(nèi)存地址信息。
代碼段中的偏移轉(zhuǎn)換成地址信息方法為代碼段裝入內(nèi)存的實際位置加上述偏移。而代碼段裝入內(nèi)存時的實際位置寫在可執(zhí)行程序的pehead部分,通過對pehead進行分析,可以獲得該偏移(具體方法為現(xiàn)有技術,可參見pehead結構描述和分析的有關文獻,有一個win32的api函數(shù)MapAndLoad可以將pehead的信息,并且有預定義好的結構PImageNtHeaders描述了pehead的結構,該結構中有BaseOfData以及BaseOfCode兩個字段,分別記錄了裝入內(nèi)存后數(shù)據(jù)段和代碼段在內(nèi)存中的實際位置)。把代碼段的實際位置加上函數(shù)在代碼段中的偏移,就能夠獲得函數(shù)的入口地址。
(2)在腳本中調(diào)用函數(shù)有了函數(shù)的入口地址,還要能夠調(diào)用函數(shù),本實施例提供一種通過匯編實現(xiàn)函數(shù)調(diào)用的方法。
很多編程工具都提供了匯編接口,通過匯編接口調(diào)用函數(shù)需要正確的把參數(shù)傳遞給被調(diào)用者,否則將產(chǎn)生異常,函數(shù)的參數(shù)傳遞通常有兩種方法,一種是從左到右的壓棧傳遞,另一種是從右到左的壓棧傳遞方法。不同的工具可能還會定義其它的參數(shù)傳遞方法,比如在delphi中還通過寄存器eax、ecx、edx傳遞前三個參數(shù)的方法以提高函數(shù)調(diào)用時參數(shù)傳遞的速度。據(jù)此可以設計調(diào)用函數(shù)的方法,比如計算得知classb的funcb函數(shù)在內(nèi)存中的地址為01234567,對象objb在內(nèi)存中的位置為7654321,如果想獲得funcb(1,2,3)的值,可以用下面代碼完成asmmov eax,7654321//第1個參數(shù)mov ecx,1 //第2個參數(shù)
mov edx,2//第3個參數(shù)push 3//第4個參數(shù)call 1234567 //執(zhí)行函數(shù)funcbmov result,eax //獲得結果end共傳遞了4個參數(shù),其中第一個參數(shù)定義時未曾看到,這是隱含的,在通過原碼調(diào)用funb(1,2,3)時,編譯器會自動把所在的對象作為第一個參數(shù)傳給該函數(shù),用以傳遞具體的對象。
(3)獲取返回結果通過匯編的方法調(diào)用函數(shù)后,eax中存放的為函數(shù)的返回結果,取之即可。
本發(fā)明把測試工具注入到被測試程序,使得訪問被測試程序內(nèi)部信息相對于獨立運行的工具而言簡單很多,由于避過了操作系統(tǒng)的限制,因此訪問這些信息十分方便,也更加安全可靠。由于采用本發(fā)明的方法不需要對源程序進行修改,因此減少了測試程序代碼和源程序代碼共同維護協(xié)調(diào)的工作量,也避免了工具代碼對被測試程序在源代碼一級的影響。
權利要求
1.一種遍歷和訪問被測應用程序中對象的方法,其特征在于該方法包括步驟將測試工具注入被測應用程序,使測試工具和被測應用程序運行于相同的進程空間;由測試工具對被測應用程序占用的實際內(nèi)存空間進行搜索,查找到用于生成特定對象的類的內(nèi)存地址,其中該特定對象包含有被測應用程序所有已創(chuàng)建窗口對象的信息并指向所述類;根據(jù)所述類的內(nèi)存地址和所述特定對象的存放格式及特征找到該特定對象的內(nèi)存地址;遍歷存放所述特定對象占用的內(nèi)存區(qū)域,根據(jù)各對象的特征和存放格式查找和訪問各窗口對象以及窗口對象包含的其他對象的內(nèi)容。
2.如權利要求1所述的方法,其特征在于,將測試工具注入被測應用程序,由被測應用程序通過插件接口主動調(diào)用測試工具來實現(xiàn),或者用測試工具強行插入被測試對象的方法實現(xiàn)。
3.如權利要求1所述的方法,其特征在于,測試工具查找用于生成特定對象的類的內(nèi)存地址包括步驟(1)判斷一定長度的內(nèi)存區(qū)是否能找到一塊保存有自身地址的內(nèi)存,如果是則進行步驟(2),否則進行步驟(4);(2)取所述一塊內(nèi)存的前一段存放的內(nèi)容,并判斷該內(nèi)容是否是一個記錄了類名稱的字符串的地址,如果是則進行步驟(3),否則進行步驟(4);(3)從所述內(nèi)存區(qū)內(nèi)的指定偏移位置取記錄該類的實例所占內(nèi)存大小的值,并判斷是否與實際類的大小相符,如果是則查找到用于生成特定對象的類,結束該次查找,否則進行步驟(4);(4)繼續(xù)在下一內(nèi)存區(qū)進行查找,并進行步驟(1)。
4.如權利要求1所述的方法,其特征在于,測試工具訪問對象內(nèi)容至少包括訪問對象內(nèi)部屬性變量和對象內(nèi)部函數(shù)。
5.如權利要求4所述的方法,其特征在于,訪問對象內(nèi)部屬性變量包括步驟根據(jù)該對象的內(nèi)存中的地址和內(nèi)部屬性變量的地址偏移得到該內(nèi)部屬性變量的實際內(nèi)存地址;調(diào)用接口函數(shù)從所述實際內(nèi)存地址獲取內(nèi)部屬性變量的值或向所述實際內(nèi)存賦值。
6.如權利要求4所述的方法,其特征在于訪問對象內(nèi)部函數(shù)包括步驟從被測應用程序的MAP文件中獲取對象內(nèi)部函數(shù)的地址偏移;根據(jù)所述地址偏移和被測應用程序的代碼段在內(nèi)存中的實際地址得到所述內(nèi)部函數(shù)的實際地址;調(diào)用所述內(nèi)部函數(shù)并將參數(shù)傳遞給該函數(shù);以及獲取返回結果。
全文摘要
本發(fā)明公開了一種遍歷和訪問被測應用程序中對象的方法,該方法為將測試工具注入被測應用程序,使測試工具和被測應用程序運行于相同的進程空間;由測試工具對被測應用程序占用的實際內(nèi)存空間進行搜索,查找到用于生成特定對象的類的內(nèi)存地址,其中該特定對象包含有被測應用程序所有已創(chuàng)建窗口對象的信息并指向所述類;根據(jù)所述類的內(nèi)存地址和所述特定對象的存放格式及特征找到該特定對象的內(nèi)存地址;遍歷存放所述特定對象占用的內(nèi)存區(qū)域,根據(jù)各對象的特征和存放格式查找和訪問各窗口對象以及窗口對象包含的其他對象的內(nèi)容。
文檔編號G06F9/44GK1632761SQ20031012107
公開日2005年6月29日 申請日期2003年12月24日 優(yōu)先權日2003年12月24日
發(fā)明者劉金虎 申請人:華為技術有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1