專利名稱:一種64位視窗操作系統(tǒng)下獲取函數(shù)參數(shù)的方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及基于視窗(WINDOWS)操作系統(tǒng)的函數(shù)執(zhí)行中參數(shù)的獲取方法,尤其是針對于64位視窗操作系統(tǒng)中函數(shù)參數(shù)的獲取方法。
背景技術(shù):
視窗操作系統(tǒng)提供了一系列的應(yīng)用程序接口(API)函數(shù),亦稱作系統(tǒng)函數(shù),供基于視窗操作系統(tǒng)的應(yīng)用程序調(diào)用,幾乎所有的運行于視窗操作系統(tǒng)的應(yīng)用程序都會調(diào)用所述的API。例如進行文字輸入操作時,相應(yīng)的文字處理軟件則調(diào)用視窗操作系統(tǒng)提供的用于文字輸出的API,實現(xiàn)在機器屏幕上進行文字顯示。
在程序執(zhí)行過程中,為了完成操作,一個程序通常還需要獲取其他正在執(zhí)行的程序的執(zhí)行參數(shù)。例如即時翻譯軟件對記事本所打開的文本文件中的某個詞進行取詞操作,要實現(xiàn)對該詞的取詞操作,即時翻譯軟件需要獲取輸出該詞時API調(diào)用的相關(guān)參數(shù),然而該文本文件中內(nèi)容的輸出是記事本應(yīng)用程序直接調(diào)用視窗操作系統(tǒng)提供的API完成的,其所傳遞的參數(shù)是所述即時翻譯軟件無法直接從記事本中獲取的。因此,某個應(yīng)用程序要獲取其他應(yīng)用程序中的某個參數(shù),就需要在這些應(yīng)用程序調(diào)用視窗操作系統(tǒng)API時執(zhí)行截獲。
現(xiàn)有技術(shù)在32位視窗操作系統(tǒng)上實現(xiàn)了上述功能,以應(yīng)用程序APP2要獲取應(yīng)用程序APP1調(diào)用系統(tǒng)函數(shù)TextOutA所傳遞的參數(shù)為例說明現(xiàn)有32位系統(tǒng)下的實現(xiàn)方法。
在應(yīng)用程序APP2中設(shè)計一個函數(shù),用于處理被攔截的參數(shù),稱其為陷阱函數(shù)(Trap);圖1為地址空間示意圖,該圖示出了在虛擬地址空間中函數(shù)的存儲結(jié)構(gòu),即通過訪問函數(shù)入口地址實現(xiàn)調(diào)用,當(dāng)APP1調(diào)用TextOutA時,修改TextOutA的入口地址所對應(yīng)的指令,修改其為跳轉(zhuǎn)指令,目的在于跳轉(zhuǎn)到陷阱函數(shù)的入口地址,從而執(zhí)行陷阱函數(shù);由于修改TextOutA函數(shù)的入口指令為一條跳轉(zhuǎn)指令,在32位視窗操作系統(tǒng)下,跳轉(zhuǎn)指令一般占有5個字節(jié),從TextOutA函數(shù)的入口開始的5個字節(jié)的指令條數(shù)N的范圍是,N>=1且N<=5,這N條指令被跳轉(zhuǎn)指令所取代,導(dǎo)致TextOutA將不能被完整執(zhí)行,基于這個原因,需要在修改TextOutA函數(shù)入口地址之前,就計算出N值,并把這N條指令復(fù)制到緩沖區(qū)中,并在這N條指令后增加一條跳轉(zhuǎn)指令(用于跳轉(zhuǎn)回TextOutA函數(shù)原入口地址開始的第N+1跳指令繼續(xù)執(zhí)行),生成樁函數(shù)(Stub)。
基于上述方法,并參照圖2所示的參數(shù)獲取流程圖可知。(1)APP1調(diào)用系統(tǒng)函數(shù)TextoutA時,(2)陷阱函數(shù)將截獲APP1發(fā)送給系統(tǒng)函數(shù)TextoutA的參數(shù),(3)并在對參數(shù)進行處理后調(diào)用樁函數(shù),依據(jù)所述參數(shù)執(zhí)行被復(fù)制的所述N條指令,(4)進而通過跳轉(zhuǎn)指令跳轉(zhuǎn)回TextoutA第N+1條指令,繼續(xù)執(zhí)行TextOutA,這樣不僅獲取了APP2傳遞給TextoutA的參數(shù),并且能保證TextoutA的正常執(zhí)行。上述過程對于APP1是透明的。
上述方法中系統(tǒng)函數(shù)入口的前N個指令將被覆蓋,由于32位操作系統(tǒng)需要由棧保存/恢復(fù)寄存器中的數(shù)據(jù),函數(shù)入口開始通常為堆棧指令,因此被覆蓋/備份的指令一般情況下都是該些堆棧指令而不會涉及地址的操作,該些指令備份到樁函數(shù)中執(zhí)行依然正常。即使在入口指令中出現(xiàn)了涉及地址操作指令,由于32位尋址空間小,因而只需進行簡單計算即可獲取所述指令所指向的正確位置。
然而64位操作系統(tǒng)不使用棧傳遞數(shù)據(jù),函數(shù)入口開始的指令就可能有是涉及地址的操作;并且,64位操作系統(tǒng)下,指令所占用字節(jié)數(shù)增大,使得所備份的指令中包含地址操作指令的可能性相應(yīng)的增大。因此將現(xiàn)有技術(shù)應(yīng)用于64位操作系統(tǒng)中時將出現(xiàn)大量地址運算的問題,并且,由于64位系統(tǒng)環(huán)境下,由于尋址空間很大,因而采用32位系統(tǒng)下簡單的計算方法無法得到正確的地址。
發(fā)明內(nèi)容
為了解決上述問題,本發(fā)明的目的是提供一種能夠?qū)崿F(xiàn)在64位視窗操作系統(tǒng)下獲取函數(shù)參數(shù)的方法。
為解決上述技術(shù)問題,本發(fā)明的目的是通過以下技術(shù)方案實現(xiàn)的一種64位視窗操作系統(tǒng)下獲取函數(shù)參數(shù)的方法,用于獲取第一應(yīng)用程序參數(shù),包括生成陷阱函數(shù)用于對獲取的參數(shù)進行處理;修改系統(tǒng)函數(shù)入口指令為第一跳轉(zhuǎn)指令指向預(yù)置的陷阱函數(shù)入口地址;生成樁函數(shù),包括將系統(tǒng)函數(shù)入口將被第一跳轉(zhuǎn)指令覆蓋的指令集合復(fù)制到確定緩沖區(qū),將其中相對地址操作變換為絕對地址操作,并在所述指令集后添加第二跳轉(zhuǎn)指令指向系統(tǒng)函數(shù)中所述第一跳轉(zhuǎn)指令后的第一條指令;在第一應(yīng)用程序調(diào)用系統(tǒng)函數(shù)時,陷阱函數(shù)通過所述第一跳轉(zhuǎn)指令調(diào)用陷阱函數(shù)獲取參數(shù)并進行處理,進而調(diào)用樁函數(shù)完成系統(tǒng)函數(shù)中被覆蓋的指令,并通過第二跳轉(zhuǎn)指令返回繼續(xù)執(zhí)行系統(tǒng)函數(shù)。
上述方法基礎(chǔ)上,通過查找預(yù)置的指令代碼表實現(xiàn)相對地址操作指令到絕對地址操作指令的變換。
上述方法基礎(chǔ)上,通過反匯編計算出第一跳轉(zhuǎn)指令在系統(tǒng)函數(shù)中占用地址空間的指令數(shù),進而確定復(fù)制到緩沖區(qū)的指令集。
上述方法基礎(chǔ)上,第一應(yīng)用程序完成系統(tǒng)函數(shù)調(diào)用后,還包括將樁函數(shù)中備份到緩沖區(qū)的指令恢復(fù)到系統(tǒng)函數(shù)中。
所述方法中的地址操作包括尋址操作。
一種64位視窗系統(tǒng)中獲取函數(shù)參數(shù)的系統(tǒng),用于在第一應(yīng)用程序調(diào)用確定系統(tǒng)函數(shù)單元時獲取其參數(shù),包括系統(tǒng)函數(shù)單元,入口地址指令為第一跳轉(zhuǎn)指令,指向所述陷阱函數(shù)入口地址;陷阱函數(shù)單元,對獲取的參數(shù)進行處理,并在完成操作后調(diào)用樁函數(shù)單元;樁函數(shù)單元,包括系統(tǒng)函數(shù)中被第一跳轉(zhuǎn)指令覆蓋的指令集,該指令集中包括絕對地址操作的指令;所述指令集后還包括第二跳轉(zhuǎn)指令指向系統(tǒng)函數(shù)單元中所述第一跳轉(zhuǎn)指令后的第一個指令地址。
其中,所述地址操作包括尋址操作。
以上技術(shù)方案可以看出,由于本發(fā)明中將樁函數(shù)中指令集中的相對地址操作指令變換為絕對地址操作指令,所述地址指向不隨該指令存儲地址的改變而改變,進而所述指令集被復(fù)制到確定緩沖區(qū)后,其中的地址操作指令(尋址操作或地址跳轉(zhuǎn))仍然可以指向正確的指令地址,保證了系統(tǒng)函數(shù)的順利執(zhí)行,使得本發(fā)明獲取函數(shù)參數(shù)的操作不會影響程序的正常執(zhí)行。
圖1為地址空間示意圖;圖2為函數(shù)參數(shù)獲取原理圖;圖3為本發(fā)明中樁函數(shù)生成流程圖;圖4為本發(fā)明完成參數(shù)獲取流程圖。
具體實施例方式
本發(fā)明所涉及64位系統(tǒng)中函數(shù)參數(shù)的獲取方法。
所述64位是指CPU通用寄存器(General-Purpose Register,GPRs)的數(shù)據(jù)寬度(位寬)為64位。64位的處理器可以一次傳輸和運算64bit即8個字節(jié)的數(shù)據(jù),相比現(xiàn)行的32位處理器一次只能處理32bit即4個字節(jié)的數(shù)據(jù),理論上在相同的時鐘周期內(nèi),64位平臺處理的數(shù)據(jù)量是32位平臺處理數(shù)據(jù)量的兩倍;并且,64位處理器的優(yōu)勢還體現(xiàn)在系統(tǒng)對內(nèi)存的控制上,現(xiàn)行32位處理器的尋址空間最大為4GB,而64位平臺的尋址空間的282TB(1TB=1024GB),使得可以進行更大范圍的數(shù)據(jù)計算以及支持更大容量的內(nèi)存。
現(xiàn)行系統(tǒng)中采用相對地址操作的方式。由于程序和函數(shù)每次加載到內(nèi)存后,系統(tǒng)所分配的地址空間都是不同的,即每次程序或函數(shù)被加載到內(nèi)存中的絕對地址都是不同的,因此程序中涉及到地址的尋址或跳轉(zhuǎn)等操作通常都使用相對地址,相對地址是在函數(shù)首地址基礎(chǔ)上進行的地址偏移;使用相對地址才能保證即使每次加載到內(nèi)存中的絕對地址不同,尋址指令依然能正常執(zhí)行。
然而,對于使用相對地址的指令來說,將相對地址操作指令備份到樁函數(shù)后,由于樁函數(shù)的首地址和函數(shù)的首地址不同,因此導(dǎo)致在樁函數(shù)的首地址基礎(chǔ)上進行偏移后的地址,并不是原先函數(shù)首地址基礎(chǔ)上進行偏移的地址,使得程序執(zhí)行出現(xiàn)錯誤。
基于上述分析,本發(fā)明主要針對于現(xiàn)有32位操作系統(tǒng)的解決方案中復(fù)制指令步驟所做的改進,使其能夠適用于64位操作系統(tǒng)之上。其核心思想在于把相對指令轉(zhuǎn)換成絕對地址。具體的,對于備份到確定緩沖區(qū)的指令進行指令分析,將所有涉及相對地址的指令,例如相對尋址方式的操作或/和相對跳轉(zhuǎn)指令,采用絕對尋址和絕對跳轉(zhuǎn)指令進行變換,由于所述過程需要生成額外的CPU指令才能完成,因而稱之為動態(tài)重匯編,動態(tài)匯編的過程通過查表完成;動態(tài)重匯編完成后,生成樁函數(shù),這個函數(shù)的最后一條指令為絕對跳轉(zhuǎn)指令,用于跳轉(zhuǎn)回系統(tǒng)函數(shù)以保證系統(tǒng)函數(shù)的正常執(zhí)行。
以下具體說明本發(fā)明所述的64位視窗操作系統(tǒng)下獲取函數(shù)參數(shù)方法的實現(xiàn)方式。
生成陷阱函數(shù),用于對所獲取參數(shù)的操作;所述陷阱函數(shù)依據(jù)業(yè)務(wù)具體需求進行生成,本發(fā)明不進行具體限定。
設(shè)應(yīng)用程序APP2需要獲取應(yīng)用程序APP1的參數(shù),則在APP2中編寫代碼注入函數(shù),當(dāng)應(yīng)用程序APP2加載到內(nèi)存后,代碼注入函數(shù)把用戶代碼加載到與應(yīng)用程序APP1以及APP1將要調(diào)用的系統(tǒng)函數(shù)的同一個地址空間中,完成對系統(tǒng)函數(shù)的修改以及樁函數(shù)的生成。
參照圖3說明本發(fā)明中樁函數(shù)的生成以及對系統(tǒng)函數(shù)的修改。
步驟31獲取系統(tǒng)函數(shù)的入口地址;步驟32修改系統(tǒng)函數(shù)入口指令為第一跳轉(zhuǎn)指令指向預(yù)置的陷阱函數(shù)入口地址;并且,計算系統(tǒng)函數(shù)入口被第一跳轉(zhuǎn)指令所占用地址空間的指令數(shù)N;指令占用至少一個字節(jié)的地址空間。處理器每次從存儲器中讀取一條指令,并在取指令完成后,根據(jù)指令類別自動將程序計數(shù)器值變成下一條指令的地址;同時,獲取的指令被放入指令寄存器中,處理器解釋并執(zhí)行該指令。64位操作系統(tǒng)下,絕對跳轉(zhuǎn)指令(jmp)通常占用14個字節(jié),因此在系統(tǒng)函數(shù)入口可能需要備份最少1條,最多14條的指令到樁函數(shù)中;如圖1所示,存儲在地址空間的為機器語言,計算機只能識別所述機器語言,即由0和1構(gòu)成的代碼;但通常在編程時,不采用機器語言,因而所有應(yīng)用程序執(zhí)行時都要由解釋器或編譯器轉(zhuǎn)換成機器語言才能運行于機器上;本步驟中采用反匯編的方法實現(xiàn)對出第一跳轉(zhuǎn)指令在系統(tǒng)函數(shù)中占用地址空間的指令數(shù)的計算;步驟33將該些N條指令進行復(fù)制,保存到緩沖區(qū);步驟34對所述N條指令構(gòu)成的指令集進行分析,將其中的相對地址操作變換為絕對地址操作;依據(jù)預(yù)置的指令代碼表實現(xiàn)所述相對地址操作指令到絕對地址操作指令的變換;步驟35在所述指令集最后添加第二跳轉(zhuǎn)指令,該跳轉(zhuǎn)指令為絕對地址跳轉(zhuǎn)指令,用于跳轉(zhuǎn)到原系統(tǒng)函數(shù)入口指令的第N+1條指令,即系統(tǒng)函數(shù)入口所述第一跳轉(zhuǎn)指令后的第一條指令;步驟36生成樁函數(shù)。
在上述方法基礎(chǔ)上,參照圖4,進一步說明上述方法基礎(chǔ)上本發(fā)明獲取函數(shù)參數(shù)的實現(xiàn)流程。
步驟41應(yīng)用程序調(diào)用系統(tǒng)函數(shù);步驟42跳轉(zhuǎn)到陷阱函數(shù),使得陷阱函數(shù)得以獲取應(yīng)用程序發(fā)出的相應(yīng)參數(shù),執(zhí)行陷阱函數(shù)對參數(shù)進行相應(yīng)的操作;步驟43調(diào)用樁函數(shù),并執(zhí)行;步驟44跳轉(zhuǎn)到系統(tǒng)函數(shù)第N+1條指令,繼續(xù)執(zhí)行系統(tǒng)函數(shù)中的后續(xù)指令;步驟45將備份到緩沖區(qū)中的指令恢復(fù)到系統(tǒng)函數(shù)中;所述恢復(fù)備份的指令的時機可依據(jù)功能的需求,如果要持續(xù)攔截參數(shù),則不進行步驟45的指令回復(fù),如果僅僅是攔截一次,則執(zhí)行本步驟。
本發(fā)明還提供了一種64位視窗系統(tǒng)中獲取函數(shù)參數(shù)的系統(tǒng),用于在第一應(yīng)用程序調(diào)用確定系統(tǒng)函數(shù)單元時獲取其參數(shù)。該系統(tǒng)包括系統(tǒng)函數(shù)單元,入口地址指令為第一跳轉(zhuǎn)指令,指向所述陷阱函數(shù)入口地址;陷阱函數(shù)單元,對獲取的參數(shù)進行處理,并在完成操作后調(diào)用樁函數(shù)單元;樁函數(shù)單元,包括系統(tǒng)函數(shù)中被第一跳轉(zhuǎn)指令覆蓋的指令集,該指令集中包括絕對地址操作的指令;所述指令集后還包括第二跳轉(zhuǎn)指令指向系統(tǒng)函數(shù)單元中所述第一跳轉(zhuǎn)指令后的第一個指令地址。
上述系統(tǒng)中各單元的生成方法可參見上文方法的相應(yīng)說明,此處不再贅述。
以上對本發(fā)明所提供的一種64位視窗操作系統(tǒng)下獲取函數(shù)參數(shù)的方法及系統(tǒng)進行了詳細介紹,本文中應(yīng)用了具體個例對本發(fā)明的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實施方式
及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本發(fā)明的限制。
權(quán)利要求
1.一種64位視窗操作系統(tǒng)下獲取函數(shù)參數(shù)的方法,用于獲取第一應(yīng)用程序參數(shù),其特征在于生成陷阱函數(shù)用于對獲取的參數(shù)進行處理;修改系統(tǒng)函數(shù)入口指令為第一跳轉(zhuǎn)指令指向預(yù)置的陷阱函數(shù)入口地址;生成樁函數(shù),包括將系統(tǒng)函數(shù)入口將被第一跳轉(zhuǎn)指令覆蓋的指令集合復(fù)制到確定緩沖區(qū),將其中相對地址操作變換為絕對地址操作,并在所述指令集后添加第二跳轉(zhuǎn)指令指向系統(tǒng)函數(shù)中所述第一跳轉(zhuǎn)指令后的第一條指令;在第一應(yīng)用程序調(diào)用系統(tǒng)函數(shù)時,陷阱函數(shù)通過所述第一跳轉(zhuǎn)指令調(diào)用陷阱函數(shù)獲取參數(shù)并進行處理,進而調(diào)用樁函數(shù)完成系統(tǒng)函數(shù)中被覆蓋的指令,并通過第二跳轉(zhuǎn)指令返回繼續(xù)執(zhí)行系統(tǒng)函數(shù)。
2.如權(quán)利要求1所述的64位視窗操作系統(tǒng)下獲取函數(shù)參數(shù)的方法,其特征在于通過查找預(yù)置的指令代碼表實現(xiàn)相對地址操作指令到絕對地址操作指令的變換。
3.如權(quán)利要求1所述的64位視窗操作系統(tǒng)下獲取函數(shù)參數(shù)的方法,其特征在于通過反匯編計算出第一跳轉(zhuǎn)指令在系統(tǒng)函數(shù)中占用地址空間的指令數(shù),進而確定復(fù)制到緩沖區(qū)的指令集。
4.如權(quán)利要求1至3其中之一所述的64位視窗操作系統(tǒng)下獲取函數(shù)參數(shù)的方法,其特征在于第一應(yīng)用程序完成系統(tǒng)函數(shù)調(diào)用后,還包括將樁函數(shù)中備份到緩沖區(qū)的指令恢復(fù)到系統(tǒng)函數(shù)中。
5.如權(quán)利要求1所述的64位視窗操作系統(tǒng)下獲取函數(shù)參數(shù)的方法,其特征在于所述地址操作包括尋址操作。
6.一種64位視窗系統(tǒng)中獲取函數(shù)參數(shù)的系統(tǒng),用于在第一應(yīng)用程序調(diào)用確定系統(tǒng)函數(shù)單元時獲取其參數(shù),其特征在于,包括系統(tǒng)函數(shù)單元,入口地址指令為第一跳轉(zhuǎn)指令,指向所述陷阱函數(shù)入口地址;陷阱函數(shù)單元,對獲取的參數(shù)進行處理,并在完成操作后調(diào)用樁函數(shù)單元;樁函數(shù)單元,包括系統(tǒng)函數(shù)中被第一跳轉(zhuǎn)指令覆蓋的指令集,該指令集中包括絕對地址操作的指令;所述指令集后還包括第二跳轉(zhuǎn)指令指向系統(tǒng)函數(shù)單元中所述第一跳轉(zhuǎn)指令后的第一個指令地址。
7.如權(quán)利要求6所述的64位視窗系統(tǒng)中獲取函數(shù)參數(shù)的系統(tǒng),其特征在于所述地址操作包括尋址操作。
全文摘要
本發(fā)明提供了一種64位視窗操作系統(tǒng)下獲取函數(shù)參數(shù)的方法及系統(tǒng)。所述方法包括生成陷阱函數(shù)用于對獲取的參數(shù)進行處理;修改系統(tǒng)函數(shù)入口指令為第一跳轉(zhuǎn)指令指向預(yù)置的陷阱函數(shù)入口地址;生成樁函數(shù),包括將系統(tǒng)函數(shù)入口將被第一跳轉(zhuǎn)指令覆蓋的指令集合復(fù)制到確定緩沖區(qū),將其中相對地址操作變換為絕對地址操作,并在所述指令集后添加第二跳轉(zhuǎn)指令指向系統(tǒng)函數(shù)中所述第一跳轉(zhuǎn)指令后的第一條指令;在第一應(yīng)用程序調(diào)用系統(tǒng)函數(shù)時,陷阱函數(shù)通過所述第一跳轉(zhuǎn)指令調(diào)用陷阱函數(shù)獲取參數(shù)并進行處理,進而調(diào)用樁函數(shù)完成系統(tǒng)函數(shù)中被覆蓋的指令,并通過第二跳轉(zhuǎn)指令返回繼續(xù)執(zhí)行系統(tǒng)函數(shù)。本發(fā)明獲取函數(shù)參數(shù)的操作保證了程序的正常執(zhí)行。
文檔編號G06F9/44GK1838074SQ20061005761
公開日2006年9月27日 申請日期2006年2月22日 優(yōu)先權(quán)日2006年2月22日
發(fā)明者朱江 申請人:北京金山軟件有限公司