在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置、方法以及電子設(shè)備的制作方法
【專利摘要】本發(fā)明提供了在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置、方法以及電子設(shè)備,以克服現(xiàn)有的掛鉤技術(shù)效率低和/或兼容性差的問(wèn)題。上述裝置包括:跳板函數(shù)創(chuàng)建單元,用于創(chuàng)建跳板函數(shù),使得跳板函數(shù)的前N個(gè)字節(jié)內(nèi)容為目標(biāo)函數(shù)的前N個(gè)字節(jié)內(nèi)容,并在跳板函數(shù)的前N個(gè)字節(jié)之后續(xù)之以跳轉(zhuǎn)到目標(biāo)函數(shù)的第一跳轉(zhuǎn)指令以及跳轉(zhuǎn)到新函數(shù)的第二跳轉(zhuǎn)指令,跳板函數(shù)在目標(biāo)函數(shù)的預(yù)定范圍之內(nèi);目標(biāo)函數(shù)處理單元,用于將目標(biāo)函數(shù)的前N個(gè)字節(jié)內(nèi)容替換為跳轉(zhuǎn)到跳板函數(shù)的第三跳轉(zhuǎn)指令;以及新函數(shù)處理單元,用于在新函數(shù)的末尾添加跳轉(zhuǎn)到跳板函數(shù)的第四跳轉(zhuǎn)指令。第三跳轉(zhuǎn)指令指示跳轉(zhuǎn)到跳板函數(shù)中執(zhí)行第二跳轉(zhuǎn)指令的位置處。本發(fā)明的上述技術(shù)能夠應(yīng)用于計(jì)算機(jī)【技術(shù)領(lǐng)域】。
【專利說(shuō)明】在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置、方法以及電子設(shè)備
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)【技術(shù)領(lǐng)域】,尤其涉及一種在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置、方法以及電子設(shè)備。
【背景技術(shù)】
[0002]掛鉤(Hook)是Windows中提供的一種用以替換DOS下“中斷”的系統(tǒng)機(jī)制。在對(duì)特定的系統(tǒng)事件進(jìn)行掛鉤后,一旦發(fā)生已掛鉤事件,對(duì)該事件進(jìn)行掛鉤的程序就會(huì)收到系統(tǒng)的通知,這時(shí)程序就能在第一時(shí)間對(duì)該事件做出響應(yīng)。
[0003]例如,在現(xiàn)有技術(shù)中,64位操作系統(tǒng)下掛鉤的方法通常如下:(1),找到需要掛鉤的函數(shù)地址;(2),解析從函數(shù)起始地址開始,最少6+8=14個(gè)字節(jié)的代碼,代碼不能斷開;
[3],把第14或者15,16...個(gè)字節(jié)的代碼拷貝到預(yù)先分配的跳板(trampoline)中;(4),把前6個(gè)字節(jié)改為ffl5[0],也即ffl500000000 ;(5),在隨后的8個(gè)字節(jié)中保存新函數(shù)(new_function)的起始地址;(6),修正跳板中的14字節(jié)的代碼,如果里面有jmp, call等跳轉(zhuǎn)語(yǔ)句,修改偏移量,這時(shí)候通常又需要跨4G的跳轉(zhuǎn),那么按照上面的方法修改,跳板的字節(jié)數(shù)可能會(huì)增加;(7),在跳板的代碼之后,插入fT15[0],并且在隨后的8個(gè)字節(jié)中填充old_function+14。跳板可以預(yù)先分配一個(gè)100字節(jié)的緩沖區(qū)(buffer),初始化全部填充為空指令(nop),在進(jìn)行(7)的時(shí)候,可以從跳板的底部,也即100-14的位置開始填入ff, 15,00,00,00,00,64_bit_target_function+14 (15, 16...)。由于跳板最少要復(fù)制目標(biāo)函數(shù)14個(gè)字節(jié)的代碼,所以現(xiàn)有技術(shù)中的上述方法無(wú)法對(duì)函數(shù)體小于14字節(jié)的函數(shù)進(jìn)行掛鉤。
[0004]這樣,由于64位操作系統(tǒng)最少需要復(fù)制目標(biāo)函數(shù)14個(gè)字節(jié)的代碼,而32位操作系統(tǒng)則最少需要復(fù)制目標(biāo)函數(shù)5個(gè)字節(jié)的代碼,使得32位和64位操作系統(tǒng)必須需要兩套程序才能滿足需求,從而導(dǎo)致現(xiàn)有技術(shù)的這種方式效率較低且兼容性不好。
[0005]因此,由于以上舉例所描述的32位和64位操作系統(tǒng)需要兩套程序以及現(xiàn)有技術(shù)中存在的其他限制/原因,導(dǎo)致了目前存在的掛鉤技術(shù)往往效率較低和/或兼容性較差。
【發(fā)明內(nèi)容】
[0006]在下文中給出了關(guān)于本發(fā)明的簡(jiǎn)要概述,以便提供關(guān)于本發(fā)明的某些方面的基本理解。應(yīng)當(dāng)理解,這個(gè)概述并不是關(guān)于本發(fā)明的窮舉性概述。它并不是意圖確定本發(fā)明的關(guān)鍵或重要部分,也不是意圖限定本發(fā)明的范圍。其目的僅僅是以簡(jiǎn)化的形式給出某些概念,以此作為稍后論述的更詳細(xì)描述的前序。
[0007]鑒于此,本發(fā)明提供了在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置、方法以及電子設(shè)備,以至少解決現(xiàn)有的掛鉤技術(shù)效率較低和/或兼容性較差的問(wèn)題。
[0008]根據(jù)本發(fā)明的一個(gè)方面,提供了一種在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置,該裝置包括:跳板函數(shù)創(chuàng)建單元,其被配置用于創(chuàng)建跳板函數(shù),使得跳板函數(shù)的前N個(gè)字節(jié)內(nèi)容為目標(biāo)函數(shù)的前N個(gè)字節(jié)內(nèi)容,并在跳板函數(shù)的前N個(gè)字節(jié)之后續(xù)之以跳轉(zhuǎn)到目標(biāo)函數(shù)的第一跳轉(zhuǎn)指令以及跳轉(zhuǎn)到新函數(shù)的第二跳轉(zhuǎn)指令,其中,跳板函數(shù)在目標(biāo)函數(shù)的預(yù)定范圍之內(nèi);目標(biāo)函數(shù)處理單元,其被配置用于將目標(biāo)函數(shù)的前N個(gè)字節(jié)內(nèi)容替換為跳轉(zhuǎn)到跳板函數(shù)的第三跳轉(zhuǎn)指令;以及新函數(shù)處理單元,其被配置用于在新函數(shù)的末尾添加跳轉(zhuǎn)到跳板函數(shù)的第四跳轉(zhuǎn)指令。第三跳轉(zhuǎn)指令指示跳轉(zhuǎn)到跳板函數(shù)中執(zhí)行第二跳轉(zhuǎn)指令的位置處。
[0009]根據(jù)本發(fā)明的另一個(gè)方面,還提供了一種在目標(biāo)函數(shù)中掛鉤新函數(shù)的方法,該方法包括:創(chuàng)建跳板函數(shù),跳板函數(shù)在目標(biāo)函數(shù)的預(yù)定范圍之內(nèi),在跳板函數(shù)中,前N個(gè)字節(jié)內(nèi)容為目標(biāo)函數(shù)的前N個(gè)字節(jié)內(nèi)容,并續(xù)之以跳轉(zhuǎn)到目標(biāo)函數(shù)的第一跳轉(zhuǎn)指令以及跳轉(zhuǎn)到新函數(shù)的第二跳轉(zhuǎn)指令;將目標(biāo)函數(shù)的前N個(gè)字節(jié)內(nèi)容替換為跳轉(zhuǎn)到跳板函數(shù)的第三跳轉(zhuǎn)指令;以及在新函數(shù)的末尾添加跳轉(zhuǎn)到跳板函數(shù)的第四跳轉(zhuǎn)指令。第三跳轉(zhuǎn)指令指示跳轉(zhuǎn)到跳板函數(shù)中執(zhí)行第二跳轉(zhuǎn)指令的位置處。
[0010]根據(jù)本發(fā)明的另一個(gè)方面,還提供了一種電子設(shè)備,該電子設(shè)備包括如上所述的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置。
[0011]上述根據(jù)本發(fā)明實(shí)施例的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置、方法以及電子設(shè)備,其僅需復(fù)制較少(例如5個(gè),或者5個(gè)以上)字節(jié)的代碼即可實(shí)現(xiàn)掛鉤,能夠獲得至少以下益處之一:處理效率較高;兼容性較好;靈活性好;適用于對(duì)小于14字節(jié)的目標(biāo)函數(shù)的掛鉤;能夠使用較少的字節(jié)來(lái)實(shí)現(xiàn)64位操作系統(tǒng)下的掛鉤,能夠完美支持因64位操作系統(tǒng)引出的地址空間問(wèn)題和特殊函數(shù)的掛鉤問(wèn)題;在64位操作系統(tǒng)升級(jí)到128位操作系統(tǒng)的情況下,只需將跳板函數(shù)分配的字節(jié)進(jìn)行擴(kuò)位,即可很好的支持128位操作系統(tǒng)下的掛鉤;對(duì)所有要掛鉤的函數(shù)的處理方式是一致的,能夠簡(jiǎn)化對(duì)各種不同入口指令的處理流程;以及能夠更好地支援系統(tǒng)框架的升級(jí)擴(kuò)展。
[0012]通過(guò)以下結(jié)合附圖對(duì)本發(fā)明的最佳實(shí)施例的詳細(xì)說(shuō)明,本發(fā)明的這些以及其他優(yōu)點(diǎn)將更加明顯。
【專利附圖】
【附圖說(shuō)明】
[0013]本發(fā)明可以通過(guò)參考下文中結(jié)合附圖所給出的描述而得到更好的理解,其中在所有附圖中使用了相同或相似的附圖標(biāo)記來(lái)表示相同或者相似的部件。所述附圖連同下面的詳細(xì)說(shuō)明一起包含在本說(shuō)明書中并且形成本說(shuō)明書的一部分,而且用來(lái)進(jìn)一步舉例說(shuō)明本發(fā)明的優(yōu)選實(shí)施例和解釋本發(fā)明的原理和優(yōu)點(diǎn)。在附圖中:
[0014]圖1是示意性地示出根據(jù)本發(fā)明的實(shí)施例的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置的一種示例結(jié)構(gòu)的框圖;
[0015]圖2是示意性地示出根據(jù)本發(fā)明的實(shí)施例的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置的另一種示例結(jié)構(gòu)的框圖;
[0016]圖3是示意性地示出根據(jù)本發(fā)明的實(shí)施例的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置的又一種示例結(jié)構(gòu)的框圖;
[0017]圖4是示意性地示出根據(jù)本發(fā)明的實(shí)施例的在目標(biāo)函數(shù)中掛鉤新函數(shù)的方法的一種示例性處理的流程圖;
[0018]圖5是示意性地示出根據(jù)本發(fā)明的實(shí)施例的在目標(biāo)函數(shù)中掛鉤新函數(shù)的方法的另一種示例性處理的流程圖;
[0019]圖6是示意性地示出根據(jù)本發(fā)明的實(shí)施例的在目標(biāo)函數(shù)中掛鉤新函數(shù)的方法的又一種示例性處理的流程圖;以及
[0020]圖7是示出可用來(lái)實(shí)現(xiàn)根據(jù)本發(fā)明的實(shí)施例的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置和方法的一種可能的信息處理設(shè)備的硬件配置的結(jié)構(gòu)簡(jiǎn)圖。
[0021]本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,附圖中的元件僅僅是為了簡(jiǎn)單和清楚起見(jiàn)而示出的,而且不一定是按比例繪制的。例如,附圖中某些元件的尺寸可能相對(duì)于其他元件放大了,以便有助于提高對(duì)本發(fā)明實(shí)施例的理解。
【具體實(shí)施方式】
[0022]在下文中將結(jié)合附圖對(duì)本發(fā)明的示范性實(shí)施例進(jìn)行描述。為了清楚和簡(jiǎn)明起見(jiàn),在說(shuō)明書中并未描述實(shí)際實(shí)施方式的所有特征。然而,應(yīng)該了解,在開發(fā)任何這種實(shí)際實(shí)施例的過(guò)程中必須做出很多特定于實(shí)施方式的決定,以便實(shí)現(xiàn)開發(fā)人員的具體目標(biāo),例如,符合與系統(tǒng)及業(yè)務(wù)相關(guān)的那些限制條件,并且這些限制條件可能會(huì)隨著實(shí)施方式的不同而有所改變。此外,還應(yīng)該了解,雖然開發(fā)工作有可能是非常復(fù)雜和費(fèi)時(shí)的,但對(duì)得益于本公開內(nèi)容的本領(lǐng)域技術(shù)人員來(lái)說(shuō),這種開發(fā)工作僅僅是例行的任務(wù)。
[0023]在此,還需要說(shuō)明的一點(diǎn)是,為了避免因不必要的細(xì)節(jié)而模糊了本發(fā)明,在附圖中僅僅示出了與根據(jù)本發(fā)明的方案密切相關(guān)的裝置結(jié)構(gòu)和/或處理步驟,而省略了與本發(fā)明關(guān)系不大的其他細(xì)節(jié)。
[0024]本發(fā)明的實(shí)施例提供了一種在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置,該裝置包括:跳板函數(shù)創(chuàng)建單元,其被配置用于創(chuàng)建跳板函數(shù),使得跳板函數(shù)的前N個(gè)字節(jié)內(nèi)容為目標(biāo)函數(shù)的前N個(gè)字節(jié)內(nèi)容,并在跳板函數(shù)的前N個(gè)字節(jié)之后續(xù)之以跳轉(zhuǎn)到目標(biāo)函數(shù)的第一跳轉(zhuǎn)指令以及跳轉(zhuǎn)到新函數(shù)的第二跳轉(zhuǎn)指令,其中,跳板函數(shù)在目標(biāo)函數(shù)的預(yù)定范圍之內(nèi);目標(biāo)函數(shù)處理單元,其被配置用于將目標(biāo)函數(shù)的前N個(gè)字節(jié)內(nèi)容替換為跳轉(zhuǎn)到跳板函數(shù)的第三跳轉(zhuǎn)指令;以及新函數(shù)處理單元,其被配置用于在新函數(shù)的末尾添加跳轉(zhuǎn)到跳板函數(shù)的第四跳轉(zhuǎn)指令。第三跳轉(zhuǎn)指令指示跳轉(zhuǎn)到跳板函數(shù)中執(zhí)行第二跳轉(zhuǎn)指令的位置處。
[0025]下面結(jié)合圖1來(lái)詳細(xì)描述根據(jù)本發(fā)明的實(shí)施例的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置的一個(gè)示例,其中,圖1所示的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置100包括跳板函數(shù)創(chuàng)建單元110、目標(biāo)函數(shù)處理單元120以及新函數(shù)處理單元130。
[0026]如圖1 所不,當(dāng)給定目標(biāo)函數(shù) fTa(例如 Windows 的 APKApplication ProgrammingInterface,應(yīng)用程序編程接口)函數(shù))時(shí),跳板函數(shù)創(chuàng)建單元110創(chuàng)建一個(gè)與目標(biāo)函數(shù)fTa對(duì)應(yīng)的跳板函數(shù)fft,且該跳板函數(shù)在目標(biāo)函數(shù)fTa的預(yù)定范圍(例如2G范圍)之內(nèi)。
[0027]為清楚起見(jiàn),這里所說(shuō)的目標(biāo)函數(shù)fTa均是指被掛鉤前的目標(biāo)函數(shù),而目標(biāo)函數(shù)f’ Ta則是指被掛鉤后的目標(biāo)函數(shù)。
[0028]跳板函數(shù)創(chuàng)建單元110復(fù)制目標(biāo)函數(shù)fTa的前N個(gè)字節(jié)內(nèi)容作為跳板函數(shù)的前N個(gè)字節(jié)內(nèi)容,并在跳板函數(shù)匕的前N個(gè)字節(jié)之后續(xù)之以第一跳轉(zhuǎn)指令和第二跳轉(zhuǎn)指令。這里,第一跳轉(zhuǎn)指令用于指示跳轉(zhuǎn)到目標(biāo)函數(shù)f’Ta (即被掛鉤后的目標(biāo)函數(shù),下文中將提到),而第二跳轉(zhuǎn)指令則用于指示跳轉(zhuǎn)到新函數(shù)fN。
[0029]其中,N是大于或等于5的整數(shù)。在根據(jù)本發(fā)明的實(shí)施例的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置100的一個(gè)實(shí)現(xiàn)方式中,N可以等于5,在這種情況下,僅需要復(fù)制目標(biāo)函數(shù)的5個(gè)字節(jié)的代碼即可實(shí)現(xiàn)下文中所描述的掛鉤,處理效率較高,并且適用于函數(shù)體(即函數(shù)大小)較小(例如在5個(gè)字節(jié)到14個(gè)字節(jié)之間)的目標(biāo)函數(shù)的掛鉤。
[0030]這樣,通過(guò)跳板函數(shù)創(chuàng)建單元110的處理得到了如上所述的跳板函數(shù)然后,目標(biāo)函數(shù)處理單元120將目標(biāo)函數(shù)fTa的前N個(gè)字節(jié)內(nèi)容替換為第三跳轉(zhuǎn)指令,該第三跳轉(zhuǎn)指令用于指示跳轉(zhuǎn)到跳板函數(shù)fft,由此,得到被掛鉤后的目標(biāo)函數(shù)f’ Ta (即,替換后的目標(biāo)函數(shù))。
[0031]然后,新函數(shù)處理單元130在新函數(shù)fN的末尾添加第四跳轉(zhuǎn)指令,該第四跳轉(zhuǎn)指令用于指示跳轉(zhuǎn)到跳板函數(shù)fft。
[0032]需要說(shuō)明的是,雖然該示例中所描述的跳板函數(shù)創(chuàng)建單元110、目標(biāo)函數(shù)處理單元120以及新函數(shù)處理單元130是先后依次執(zhí)行處理的,但在其他示例中,上述各個(gè)單元也可以按照其他順序來(lái)執(zhí)行處理。例如,跳板函數(shù)創(chuàng)建單元110、目標(biāo)函數(shù)處理單元120以及新函數(shù)處理單元130也可以按照目標(biāo)函數(shù)處理單元120、跳板函數(shù)創(chuàng)建單元110以及新函數(shù)處理單元130的順序來(lái)執(zhí)行處理,或者,可以分別同時(shí)進(jìn)行處理,等等。
[0033]其中,在被掛鉤后的目標(biāo)函數(shù)f’Ta中,第三跳轉(zhuǎn)指令指示跳轉(zhuǎn)到跳板函數(shù)fft中執(zhí)行第二跳轉(zhuǎn)指令的位置處,以便被掛鉤后的目標(biāo)函數(shù)f ’ Ta執(zhí)行時(shí)能夠首先執(zhí)行第三跳轉(zhuǎn)指令而跳轉(zhuǎn)到跳板函數(shù)中來(lái)執(zhí)行第二跳轉(zhuǎn)指令。
[0034]此外,當(dāng)通過(guò)執(zhí)行被掛鉤后的目標(biāo)函數(shù)f ’ Ta中的第三跳轉(zhuǎn)指令而跳轉(zhuǎn)到跳板函數(shù)fTr中執(zhí)行第二跳轉(zhuǎn)指令時(shí),可以進(jìn)而通過(guò)對(duì)第二跳轉(zhuǎn)指令的執(zhí)行而跳轉(zhuǎn)到新函數(shù)fN來(lái)執(zhí)行,并在新函數(shù)fN執(zhí)行結(jié)束時(shí),能夠通過(guò)執(zhí)行新函數(shù)fN尾部的第四跳轉(zhuǎn)指令而調(diào)回到跳板函數(shù)來(lái)執(zhí)行。此時(shí),由于跳板函數(shù)fft的前N個(gè)字節(jié)內(nèi)容即為被掛鉤前的目標(biāo)函數(shù)fTa的前N個(gè)字節(jié)內(nèi)容,因此,當(dāng)通過(guò)執(zhí)行新函數(shù)fN尾部的第四跳轉(zhuǎn)指令而調(diào)回到跳板函數(shù)fft來(lái)執(zhí)行時(shí),在執(zhí)行該跳板函數(shù)&的前N個(gè)字節(jié)內(nèi)容(也即被掛鉤前的目標(biāo)函數(shù)fTa的前N個(gè)字節(jié)內(nèi)容)之后,執(zhí)行跳板函數(shù)fft中的第一跳轉(zhuǎn)指令而跳轉(zhuǎn)到被掛鉤后的目標(biāo)函數(shù)f ’ Ta來(lái)執(zhí)行后續(xù)的指令。例如,可以通過(guò)執(zhí)行跳板函數(shù)中的第一跳轉(zhuǎn)指令而跳轉(zhuǎn)到被掛鉤后的目標(biāo)函數(shù)f’ Ta中的第N+1個(gè)字節(jié)處,以便執(zhí)行原目標(biāo)函數(shù)(即被掛鉤前的目標(biāo)函數(shù)fTa)的第N+1個(gè)字節(jié)及后續(xù)字節(jié)內(nèi)容的指令。
[0035]根據(jù)本發(fā)明的實(shí)施例的上述在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置,對(duì)于所有要掛鉤的函數(shù)的處理方式是一致的,因此能夠簡(jiǎn)化對(duì)各種不同入口指令的處理流程。另外,相比于傳統(tǒng)技術(shù),該裝置能夠更好地支援系統(tǒng)框架的升級(jí)擴(kuò)展。
[0036]該裝置僅需要復(fù)制目標(biāo)函數(shù)的5個(gè)或以上字節(jié)的代碼即可實(shí)現(xiàn)掛鉤。因此,該裝置可以適用于小于14字節(jié)的目標(biāo)函數(shù)的掛鉤。此外,對(duì)于例如32位和64位操作系統(tǒng)來(lái)說(shuō),該裝置可以僅通過(guò)一套程序完成兩種操作系統(tǒng)下的掛鉤,相對(duì)于現(xiàn)有技術(shù)來(lái)說(shuō),該裝置的處理效率較高,兼容性較好,并且更加靈活。
[0037]另外,該裝置能夠使用較少的字節(jié)來(lái)實(shí)現(xiàn)64位操作系統(tǒng)下的掛鉤,能夠完美支持因64位操作系統(tǒng)引出的地址空間問(wèn)題和特殊函數(shù)的掛鉤問(wèn)題。由此,在實(shí)際應(yīng)用中,根據(jù)本發(fā)明的實(shí)施例的上述在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置不僅可以適用于32位操作系統(tǒng),而且可以適用于64位操作系統(tǒng)。此外,如果64位操作系統(tǒng)升級(jí)到128位操作系統(tǒng),只需將跳板函數(shù)分配的字節(jié)進(jìn)行擴(kuò)位,即可很好地支持128位操作系統(tǒng)下的掛鉤。
[0038]下面結(jié)合圖2來(lái)描述根據(jù)本發(fā)明的實(shí)施例的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置的另一個(gè)示例,其中,圖2所示的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置200除了包括跳板函數(shù)創(chuàng)建單元210、目標(biāo)函數(shù)處理單元220和新函數(shù)處理單元230之外,還包括第一預(yù)處理單元240。
[0039]假設(shè)在該示例中,跳板函數(shù)創(chuàng)建單元210、目標(biāo)函數(shù)處理單元220和新函數(shù)處理單元230是先后依次執(zhí)行處理的,則在跳板函數(shù)創(chuàng)建單元210執(zhí)行處理之前,可以先通過(guò)第一預(yù)處理單元240來(lái)執(zhí)行第一預(yù)處理。
[0040]如圖2所示,第一預(yù)處理單元240可以首先判定目標(biāo)函數(shù)fTa (即被掛鉤前的目標(biāo)函數(shù))的第N個(gè)字節(jié)和第N+1個(gè)字節(jié)是否屬于同一個(gè)不可分割指令。
[0041]如果目標(biāo)函數(shù)fTa的第N個(gè)字節(jié)和第N+1個(gè)字節(jié)是屬于同一個(gè)不可分割指令,則若在此基礎(chǔ)上不做改變而繼續(xù)執(zhí)行跳板函數(shù)創(chuàng)建單元210的處理,也即,繼續(xù)復(fù)制目標(biāo)函數(shù)fTa的前N個(gè)字節(jié)到跳板函數(shù)中,則會(huì)硬性地分割開一條完整的指令,使得跳板函數(shù)在后續(xù)執(zhí)行時(shí)會(huì)發(fā)生錯(cuò)誤,從而造成程序崩潰。
[0042]因此,當(dāng)?shù)谝活A(yù)處理單元240判定出目標(biāo)函數(shù)fTa的第N個(gè)字節(jié)和第N+1個(gè)字節(jié)屬于同一個(gè)不可分割指令時(shí),可以通過(guò)重新確定N的值(也即改變所復(fù)制的目標(biāo)函數(shù)fTa的字節(jié)數(shù))來(lái)避免產(chǎn)生以上問(wèn)題。例如,在這種情況下,第一預(yù)處理單元240可以確定一個(gè)M值,使得目標(biāo)函數(shù)fTa的第M個(gè)字節(jié)和第M+1個(gè)字節(jié)不屬于同一個(gè)不可分割指令(同時(shí)可以使得M值盡量的小)。這樣,在確定了滿足上述條件的M值之后,通過(guò)將N的值替換為M的值,則可使得跳板函數(shù)創(chuàng)建單元210在執(zhí)行處理時(shí)不會(huì)出現(xiàn)上述問(wèn)題。其中,M為大于N的整數(shù)。然后,在完成以上替換后,可以觸發(fā)后續(xù)的處理,比如可以觸發(fā)跳板函數(shù)創(chuàng)建單元210的處理。其中,M值例如可以通過(guò)查看目標(biāo)函數(shù)的匯編代碼而獲得,對(duì)于本領(lǐng)域的技術(shù)人員來(lái)說(shuō),以上通過(guò)查看目標(biāo)函數(shù)匯編代碼獲得需要拷貝的字節(jié)數(shù)的方法是可以通過(guò)結(jié)合公知常識(shí)和/或公開資料的方式來(lái)獲知的,因此這里將不再詳述。
[0043]此外,如果目標(biāo)函數(shù)fTa的第N個(gè)字節(jié)和第N+1個(gè)字節(jié)并不屬于同一個(gè)不可分割指令的話,則可以跳過(guò)第一預(yù)處理單元240的處理,即,可以不需要重新確定N的值而繼續(xù)執(zhí)行跳板函數(shù)創(chuàng)建單元210的處理。
[0044]在該示例中,后續(xù)的跳板函數(shù)創(chuàng)建單元210、目標(biāo)函數(shù)處理單元220和新函數(shù)處理單元230的處理例如可以與上文中結(jié)合圖1所描述的裝置100中的對(duì)應(yīng)單元所執(zhí)行的處理相同,并可以具有與之相同的結(jié)構(gòu)和功能,以及能夠達(dá)到相類似的技術(shù)效果,這里不再贅述。
[0045]在以上示例中,描述了當(dāng)跳板函數(shù)創(chuàng)建單元210、目標(biāo)函數(shù)處理單元220和新函數(shù)處理單元230先后依次執(zhí)行處理時(shí)的情形。需要說(shuō)明的是,在其他示例中,在跳板函數(shù)創(chuàng)建單元210、目標(biāo)函數(shù)處理單元220和新函數(shù)處理單元230并非先后依次執(zhí)行處理的情況下,可以在所有這些單元進(jìn)行處理之前,先執(zhí)行第一預(yù)處理單元240的處理,處理的具體細(xì)節(jié)與以上示例類似,這里省略其詳細(xì)描述。
[0046]下面結(jié)合圖3來(lái)描述根據(jù)本發(fā)明的實(shí)施例的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置的另一個(gè)示例,其中,圖3所示的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置300除了包括跳板函數(shù)創(chuàng)建單元310、目標(biāo)函數(shù)處理單元320和新函數(shù)處理單元330之外,還包括第二預(yù)處理單元350。
[0047]假設(shè)在該示例中,跳板函數(shù)創(chuàng)建單元310、目標(biāo)函數(shù)處理單元320和新函數(shù)處理單元330是先后依次執(zhí)行處理的,則在跳板函數(shù)創(chuàng)建單元310執(zhí)行處理之前,可以先通過(guò)第二預(yù)處理單元350來(lái)執(zhí)行第二預(yù)處理。
[0048]如圖3所示,在跳板函數(shù)創(chuàng)建單元310執(zhí)行處理之前,第二預(yù)處理單元350可以首先判斷目標(biāo)函數(shù)fTa (即被掛鉤前的目標(biāo)函數(shù))的大小是否大于或等于N個(gè)字節(jié)。
[0049]顯然,如果目標(biāo)函數(shù)fTa的大小小于N個(gè)字節(jié)的話,則不能夠利用跳板函數(shù)創(chuàng)建單元310、目標(biāo)函數(shù)處理單元320和新函數(shù)處理單元330來(lái)在該目標(biāo)函數(shù)中掛鉤新函數(shù),在這種情況下,可以利用現(xiàn)有技術(shù)的掛鉤方法來(lái)執(zhí)行從目標(biāo)函數(shù)到新函數(shù)的跳轉(zhuǎn)而實(shí)現(xiàn)掛鉤。也就是說(shuō),在實(shí)際處理中,如果目標(biāo)函數(shù)fTa的大小小于N個(gè)字節(jié),可以利用(例如內(nèi)置在裝置300中的)其他處理單元或模塊、通過(guò)現(xiàn)有技術(shù)中存在的掛鉤技術(shù)(例如長(zhǎng)跳轉(zhuǎn)指令)來(lái)實(shí)現(xiàn)掛鉤。對(duì)于本領(lǐng)域的技術(shù)人員來(lái)說(shuō),上述現(xiàn)有技術(shù)中的掛鉤技術(shù)是可以通過(guò)結(jié)合公知常識(shí)和/或公開資料等來(lái)獲知的,故這里不再詳述。
[0050]此外,如果目標(biāo)函數(shù)fTa的大小大于或等于N個(gè)字節(jié),則是可以利用裝置300中的跳板函數(shù)創(chuàng)建單元310、目標(biāo)函數(shù)處理單元320和新函數(shù)處理單元330來(lái)進(jìn)行處理的。也就是說(shuō),在該示例中,當(dāng)?shù)诙A(yù)處理單元350判定出目標(biāo)函數(shù)fTa的大小大于或等于N個(gè)字節(jié)時(shí),第二預(yù)處理單元350可以進(jìn)而觸發(fā)裝置300中的后續(xù)處理,即跳板函數(shù)創(chuàng)建單元310的處理。
[0051]在該示例中,后續(xù)的跳板函數(shù)創(chuàng)建單元310、目標(biāo)函數(shù)處理單元320和新函數(shù)處理單元330的處理例如可以與上文中結(jié)合圖1所描述的裝置100中的對(duì)應(yīng)單元所執(zhí)行的處理相同,并可以具有與之相同的結(jié)構(gòu)和功能,以及能夠達(dá)到相類似的技術(shù)效果,這里不再贅述。
[0052]在以上示例中,描述了當(dāng)跳板函數(shù)創(chuàng)建單元310、目標(biāo)函數(shù)處理單元320和新函數(shù)處理單元330先后依次執(zhí)行處理時(shí)的情形。需要說(shuō)明的是,在其他示例中,在跳板函數(shù)創(chuàng)建單元310、目標(biāo)函數(shù)處理單元320和新函數(shù)處理單元330并非先后依次執(zhí)行處理的情況下,可以在所有這些單元進(jìn)行處理之前,先執(zhí)行第二預(yù)處理單元350的處理,處理的具體細(xì)節(jié)與以上示例類似,這里省略其詳細(xì)描述。
[0053]另外,需要說(shuō)明的是,在其他實(shí)現(xiàn)方式中,圖3所示的裝置300還可以選擇性地包括第一預(yù)處理單元340。需要注意的是,在這種情況下,當(dāng)給定目標(biāo)函數(shù)fTa時(shí),裝置300可以(但不限于此)先令第二預(yù)處理單元350和第一預(yù)處理單元340先后依次執(zhí)行第二預(yù)處理和第一預(yù)處理,再令其余的跳板函數(shù)創(chuàng)建單元310、目標(biāo)函數(shù)處理單元320和新函數(shù)處理單元330執(zhí)行處理,每個(gè)單元的具體處理細(xì)節(jié)與以上結(jié)合圖1和圖2所描述的示例中的對(duì)應(yīng)單元的處理過(guò)程相似,并能夠達(dá)到相類似的技術(shù)效果,這里不再贅述。
[0054]下面來(lái)描述上述根據(jù)本發(fā)明的實(shí)施例的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置300的一個(gè)應(yīng)用示例。
[0055]在該應(yīng)用示例中,假設(shè)裝置300包括跳板函數(shù)創(chuàng)建單元310、目標(biāo)函數(shù)處理單元320、新函數(shù)處理單元330、第一預(yù)處理單元340以及第二預(yù)處理單元350。
[0056]此外,在該應(yīng)用示例中,對(duì)所有要掛鉤的函數(shù)的處理方式是一致的,下面以目標(biāo)函數(shù)fTa作為要掛鉤的函數(shù)的示例來(lái)進(jìn)行說(shuō)明。
[0057]假設(shè)N=5,以及被掛鉤前的目標(biāo)函數(shù)fTa代碼如下:
【權(quán)利要求】
1.一種在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置,包括: 跳板函數(shù)創(chuàng)建單元,其被配置用于創(chuàng)建跳板函數(shù),使得所述跳板函數(shù)的前N個(gè)字節(jié)內(nèi)容為所述目標(biāo)函數(shù)的前N個(gè)字節(jié)內(nèi)容,并在所述跳板函數(shù)的前N個(gè)字節(jié)之后續(xù)之以跳轉(zhuǎn)到所述目標(biāo)函數(shù)的第一跳轉(zhuǎn)指令以及跳轉(zhuǎn)到新函數(shù)的第二跳轉(zhuǎn)指令,其中,所述跳板函數(shù)在所述目標(biāo)函數(shù)的預(yù)定范圍之內(nèi),且N為大于或等于5的整數(shù); 目標(biāo)函數(shù)處理單元,其被配置用于將所述目標(biāo)函數(shù)的所述前N個(gè)字節(jié)內(nèi)容替換為跳轉(zhuǎn)到所述跳板函數(shù)的第三跳轉(zhuǎn)指令;以及 新函數(shù)處理單元,其被配置用于在所述新函數(shù)的末尾添加跳轉(zhuǎn)到所述跳板函數(shù)的第四跳轉(zhuǎn)指令, 其中,所述第三跳轉(zhuǎn)指令指示跳轉(zhuǎn)到所述跳板函數(shù)中執(zhí)行所述第二跳轉(zhuǎn)指令的位置處。
2.根據(jù)權(quán)利要求1所述的裝置,其中,N等于5。
3.根據(jù)權(quán)利要求1所述的裝置,其中,所述第一跳轉(zhuǎn)指令指示跳轉(zhuǎn)到所述目標(biāo)函數(shù)的第N+1個(gè)字節(jié)。
4.根據(jù)權(quán)利要求1所述的裝置,還包括第一預(yù)處理單元,所述第一預(yù)處理單元被配置用于: 在所述跳板函數(shù)創(chuàng)建單元執(zhí)行處理之前,判定所述目標(biāo)函數(shù)的第N個(gè)字節(jié)和第N+1個(gè)字節(jié)是否屬于同一個(gè)不可分割指令:若是,則確定所述目標(biāo)函數(shù)的前M個(gè)字節(jié),使得所述目標(biāo)函數(shù)的第M個(gè)字節(jié)和第M+1個(gè)字節(jié)不屬于同一個(gè)不可分割指令,并將N的值替換為M的值,其中M為大于N的整數(shù)。
5.根據(jù)權(quán)利要求1所述的裝置,還包括第二預(yù)處理單元,所述第二預(yù)處理單元被配置用于: 在所述跳板函數(shù)創(chuàng)建單元執(zhí)行處理之前,判斷所述目標(biāo)函數(shù)的大小是否大于或等于N字節(jié):若是,則觸發(fā)所述所述跳板函數(shù)創(chuàng)建單元執(zhí)行處理。
6.一種在目標(biāo)函數(shù)中掛鉤新函數(shù)的方法,包括: 創(chuàng)建跳板函數(shù),所述跳板函數(shù)在所述目標(biāo)函數(shù)的預(yù)定范圍之內(nèi),在所述跳板函數(shù)中,前N個(gè)字節(jié)內(nèi)容為所述目標(biāo)函數(shù)的前N個(gè)字節(jié)內(nèi)容,并續(xù)之以跳轉(zhuǎn)到所述目標(biāo)函數(shù)的第一跳轉(zhuǎn)指令以及跳轉(zhuǎn)到新函數(shù)的第二跳轉(zhuǎn)指令,其中,N為大于或等于5的整數(shù); 將所述目標(biāo)函數(shù)的所述前N個(gè)字節(jié)內(nèi)容替換為跳轉(zhuǎn)到所述跳板函數(shù)的第三跳轉(zhuǎn)指令;以及 在所述新函數(shù)的末尾添加跳轉(zhuǎn)到所述跳板函數(shù)的第四跳轉(zhuǎn)指令, 其中,所述第三跳轉(zhuǎn)指令指示跳轉(zhuǎn)到所述跳板函數(shù)中執(zhí)行所述第二跳轉(zhuǎn)指令的位置處。
7.根據(jù)權(quán)利要求6所述的方法,其中,N等于5。
8.根據(jù)權(quán)利要求6所述的方法,其中,所述第一跳轉(zhuǎn)指令指示跳轉(zhuǎn)到所述目標(biāo)函數(shù)的第N+1個(gè)字節(jié)。
9.根據(jù)權(quán)利要求6所述的方法,其中在執(zhí)行所述創(chuàng)建跳板函數(shù)的步驟之前還包括以下第一預(yù)處理步驟: 判定所述目標(biāo)函數(shù)的第N個(gè)字節(jié)和第N+1個(gè)字節(jié)是否屬于同一個(gè)不可分割指令:若是,則確定所述目標(biāo)函數(shù)的前M個(gè)字節(jié),使得所述目標(biāo)函數(shù)的第M個(gè)字節(jié)和第M+1個(gè)字節(jié)不屬于同一個(gè)不可分割指令,并將N的值替換為M的值,其中M為大于N的整數(shù)。
10.一種電子設(shè)備,包括如權(quán)利要求1-5中任一項(xiàng)所述的在目標(biāo)函數(shù)中掛鉤新函數(shù)的裝置
【文檔編號(hào)】G06F9/30GK103885750SQ201410136808
【公開日】2014年6月25日 申請(qǐng)日期:2014年4月4日 優(yōu)先權(quán)日:2014年4月4日
【發(fā)明者】黃鑫, 吳魯加 申請(qǐng)人:深圳市大成天下信息技術(shù)有限公司