一種Native API函數(shù)重構(gòu)方法和裝置制造方法
【專利摘要】本發(fā)明提供了一種Native API函數(shù)重構(gòu)方法和裝置,通過自定義實(shí)現(xiàn)Native API函數(shù),并將所述Native API函數(shù)封裝為靜態(tài)庫lib文件,并保存于本地。在應(yīng)用程序運(yùn)行時(shí)可以通過從靜態(tài)庫lib文件對應(yīng)的本地存儲位置中直接調(diào)用自定義Native API函數(shù),實(shí)現(xiàn)應(yīng)用程序的相關(guān)功能。由于Native API函數(shù)是保存于本地,惡意程序無法知道Native API函數(shù)的存儲地址,也就無法對其進(jìn)行非法監(jiān)聽、攔截或篡改等操作。此外,由于Native API函數(shù)是靜態(tài)庫lib文件,逆向工程分析人員無法知道靜態(tài)庫的接口位置,也就無法對自定義實(shí)現(xiàn)的Native API函數(shù)進(jìn)行攔截或篡改,從而從根本上杜絕了在應(yīng)用層上對API函數(shù)的跟蹤攔截,大大提高了應(yīng)用程序的安全性。
【專利說明】-種NativeAPI函數(shù)重構(gòu)方法和裝置
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計(jì)算機(jī)技術(shù)安全領(lǐng)域,特別涉及一種Native API函數(shù)重構(gòu)方法和裝 置。
【背景技術(shù)】
[0002] 隨著WINDOWS API (WINDOWS Application Programming Interface,WINDOWS應(yīng)用 程序編程接口)編程的廣泛普及和應(yīng)用,越來越多的應(yīng)用程序可以通過調(diào)用WINDOWS API 函數(shù)來完成相應(yīng)的功能。目前,應(yīng)用程序在實(shí)現(xiàn)具體功能時(shí),在應(yīng)用層,首先需要加載與功 能相關(guān)的DLL (Dynamic Link Library,動(dòng)態(tài)鏈接庫),然后根據(jù)GetProcAddress函數(shù)獲取 DLL中WINDOWS API函數(shù)的起始地址,根據(jù)這些起始地址調(diào)用對應(yīng)的WINDOWS API函數(shù),這 些WINDOWS API函數(shù)通常會最終調(diào)用較低級的Native API函數(shù),這些Native API函數(shù)最 終完成對驅(qū)動(dòng)層的訪問。
[0003] 在實(shí)現(xiàn)本發(fā)明的過程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)至少存在以下問題:在應(yīng)用層上,惡 意程序(比如利用鉤子H00K技術(shù)的程序)可以預(yù)先處理GetProcAddress函數(shù),以得到相 關(guān)的API函數(shù)(通常可以包括WINDOWS API函數(shù)或者Native API函數(shù))的起始地址,并獲 取API函數(shù)的內(nèi)容或?qū)PI函數(shù)的內(nèi)容進(jìn)行修改。因此,在應(yīng)用層上,惡意程序均可以非法 監(jiān)聽、攔截或篡改API函數(shù)中的內(nèi)容,從而使得應(yīng)用程序存在較大的安全隱患。
[0004] 因此,如何避免應(yīng)用程序在調(diào)用API函數(shù)時(shí),被惡意程序非法監(jiān)聽、攔截,甚至篡 改API函數(shù)中的內(nèi)容,進(jìn)而解決應(yīng)用程序存在的安全隱患,是計(jì)算機(jī)技術(shù)安全領(lǐng)域亟需解 決的一個(gè)問題。
【發(fā)明內(nèi)容】
[0005] 為此,需要提供一種Native API函數(shù)重構(gòu)的技術(shù)方案,用以解決現(xiàn)有技術(shù)中調(diào)用 API函數(shù)的過程中容易被惡意程序預(yù)先處理,使得應(yīng)用程序存在較大的安全隱患的問題。
[0006] 為實(shí)現(xiàn)上述目的,發(fā)明人提供了一種Native API函數(shù)重構(gòu)方法,所述方法包括如 下步驟:
[0007] 自定義實(shí)現(xiàn)Native API函數(shù);
[0008] 將所述Native API函數(shù)封裝為靜態(tài)庫lib文件,并保存于本地;其中所述靜態(tài)庫 lib文件位于自定義代碼段中。
[0009] 作為Native API函數(shù)重構(gòu)方法的一種可實(shí)施方式,自定義實(shí)現(xiàn)Native API函數(shù) 的方法基于系統(tǒng)類型;所述系統(tǒng)類型包括32位系統(tǒng)或64位系統(tǒng)。
[0010] 作為Native API函數(shù)重構(gòu)方法的一種可實(shí)施方式,所述自定義實(shí)現(xiàn)Native API 函數(shù)的方法基于系統(tǒng)類型具體包括:
[0011] 當(dāng)所述系統(tǒng)類型為32位系統(tǒng)時(shí),自定義實(shí)現(xiàn)32位系統(tǒng)的Native API函數(shù)并將其 保存于所述自定義代碼段中的第一指定位置;或,
[0012] 當(dāng)所述系統(tǒng)類型為64位系統(tǒng)時(shí),自定義實(shí)現(xiàn)64位系統(tǒng)的Native API函數(shù)并將其 保存于所述自定義代碼段中的第二指定位置。
[0013]作為Native API函數(shù)重構(gòu)方法的一種可實(shí)施方式,所述自定義實(shí)現(xiàn)64位系統(tǒng)的 Native API函數(shù)還包括整合操作,所述整合操作包括指令整合和堆棧整合;
[0014] 所述指令整合包括設(shè)置寄存器ECX指令和設(shè)置寄存器EDX指令,所述寄存器ECX 和寄存器EDX用于存儲調(diào)用自定義實(shí)現(xiàn)64位的Native API函數(shù)的參數(shù);
[0015] 所述堆棧整合具體包括:
[0016] 在調(diào)用自定義實(shí)現(xiàn)64位系統(tǒng)的Native API函數(shù)前將當(dāng)前堆棧的棧頂指針ESP及 棧底指針EBP的初始值保存至靜態(tài)局部變量中;
[0017] 在調(diào)用完自定義實(shí)現(xiàn)64位系統(tǒng)的Native API函數(shù)后,將當(dāng)前堆棧的棧頂指針ESP 及棧底指針EBP的值替換為初始值。
[0018] 作為Native API函數(shù)重構(gòu)方法的一種可實(shí)施方式,所述方法還包括:
[0019] 對自定義實(shí)現(xiàn)的Native API函數(shù)進(jìn)行虛擬化操作。
[0020] 發(fā)明人還提供了一種Native API函數(shù)重構(gòu)裝置,所述裝置包括實(shí)現(xiàn)單元,封裝單 元以及存儲單元;
[0021] 所述實(shí)現(xiàn)單元用于自定義實(shí)現(xiàn)Native API函數(shù);
[0022] 所述封裝單元用于將所述自定義實(shí)現(xiàn)Native API函數(shù)封裝為靜態(tài)庫lib文件;其 中,所述靜態(tài)庫lib文件位于可執(zhí)行應(yīng)用程序自定義代碼段中;
[0023] 所述存儲單元用于將靜態(tài)庫lib文件保存于本地。
[0024] 作為Native API函數(shù)重構(gòu)裝置的一種可實(shí)施方式,實(shí)現(xiàn)單元自定義實(shí)現(xiàn)Native API函數(shù)基于系統(tǒng)類型;所述系統(tǒng)類型包括32位系統(tǒng)或64位系統(tǒng)。
[0025] 作為Native API函數(shù)重構(gòu)裝置的一種可實(shí)施方式,所述實(shí)現(xiàn)單元自定義實(shí)現(xiàn) Native API函數(shù)基于系統(tǒng)類型具體包括:
[0026] 當(dāng)所述系統(tǒng)類型為32位系統(tǒng)時(shí),實(shí)現(xiàn)單元用于自定義實(shí)現(xiàn)32位系統(tǒng)的Native API函數(shù),存儲單元用于將自定義實(shí)現(xiàn)32位系統(tǒng)的Native API函數(shù)保存于所述自定義代碼 段中的第一指定位置;或,
[0027] 當(dāng)所述系統(tǒng)類型為64位系統(tǒng)時(shí),實(shí)現(xiàn)單元用于自定義實(shí)現(xiàn)64位系統(tǒng)的Native API函數(shù),存儲單元用于將自定義實(shí)現(xiàn)64位系統(tǒng)的Native API函數(shù)保存于所述自定義代碼 段中的第二指定位置。
[0028] 作為Native API函數(shù)重構(gòu)裝置的一種可實(shí)施方式,所述裝置還包括整合單元,所 述整合單元包括指令整合模塊和堆棧整合模塊,所述指令整合模塊用于設(shè)置寄存器ECX指 令和設(shè)置寄存器EDX指令,所述寄存器ECX和寄存器EDX用于存儲調(diào)用自定義實(shí)現(xiàn)64位的 Native API函數(shù)的參數(shù);所述堆棧整合模塊用于在調(diào)用自定義實(shí)現(xiàn)64位的Native API函 數(shù)前將當(dāng)前堆棧的棧頂指針ESP及棧底指針EBP的初始值保存到靜態(tài)局部變量中,并在調(diào) 用完自定義實(shí)現(xiàn)64位的Native API函數(shù)后,將當(dāng)前堆棧的棧頂指針ESP及棧底指針EBP 的值替換為初始值。
[0029] 作為Native API函數(shù)重構(gòu)裝置的一種可實(shí)施方式,所述裝置包括虛擬化單元,所 述虛擬化單元用于對自定義實(shí)現(xiàn)的Native API函數(shù)進(jìn)行虛擬化操作。
[0030] 區(qū)別于現(xiàn)有技術(shù),上述技術(shù)方案通過自定義實(shí)現(xiàn)Native API函數(shù),并將所述 Native API函數(shù)封裝為靜態(tài)庫lib文件,并保存于本地。在應(yīng)用程序運(yùn)行時(shí)可以通過從靜 態(tài)庫lib文件對應(yīng)的本地存儲位置中直接調(diào)用自定義Native API函數(shù),實(shí)現(xiàn)應(yīng)用程序的相 關(guān)功能。由于Native API函數(shù)是保存于本地,惡意程序無法知道Native API函數(shù)的存儲地 址,也就無法對其進(jìn)行非法監(jiān)聽、攔截或篡改等操作。此外,由于Native API函數(shù)是靜態(tài)庫 lib文件,逆向工程分析人員無法知道靜態(tài)庫的接口位置,也就無法對自定義實(shí)現(xiàn)的Native API函數(shù)進(jìn)行攔截或篡改,從而從根本上杜絕了在應(yīng)用層上對API函數(shù)的跟蹤攔截,大大提 高了應(yīng)用程序的安全性,因而在計(jì)算機(jī)技術(shù)安全領(lǐng)域具有廣闊的前景。
【專利附圖】
【附圖說明】
[0031] 圖1為本發(fā)明一實(shí)施方式所述的Native API函數(shù)重構(gòu)方法的流程圖;
[0032] 圖2為本發(fā)明一實(shí)施方式所述的實(shí)現(xiàn)64位系統(tǒng)的Native API函數(shù)方法的流程 圖;
[0033] 圖3為本發(fā)明一實(shí)施方式所述Native API函數(shù)重構(gòu)裝置的結(jié)構(gòu)示意圖。
[0034] 附圖標(biāo)記說明:
[0035] 1、實(shí)現(xiàn)單元;
[0036] 2、封裝單元;
[0037] 3、存儲單元;
[0038] 4、整合單元;41、指令整合模塊;42、堆棧整合模塊;
[0039] 5、虛擬化單元。
【具體實(shí)施方式】
[0040] 為詳細(xì)說明技術(shù)方案的技術(shù)內(nèi)容、構(gòu)造特征、所實(shí)現(xiàn)目的及效果,以下結(jié)合具體實(shí) 施例并配合附圖詳予說明。
[0041] 請參閱圖1,本發(fā)明一實(shí)施方式所述的Native API函數(shù)重構(gòu)方法的流程圖;所述 方法可以應(yīng)用于電子設(shè)備上,對Native API函數(shù)進(jìn)行重構(gòu),具體包括以下步驟:
[0042] 首先為步驟S1自定義實(shí)現(xiàn)Native API函數(shù)。自定義實(shí)現(xiàn)就是通過自己編寫的方 式來實(shí)現(xiàn)Native API函數(shù)。應(yīng)用程序在執(zhí)行的過程中,往往需要調(diào)用WINDOWS API函數(shù)來 實(shí)現(xiàn)應(yīng)用程序的相關(guān)功能,在調(diào)用這些函數(shù)時(shí)上容易被HOOK到,進(jìn)而被監(jiān)聽、攔截或篡改, 給應(yīng)用程序帶來很大的安全隱患。因而需要對這些API函數(shù)進(jìn)行重構(gòu),避免在調(diào)用這些API 函數(shù)時(shí)被HOOK到,而在實(shí)際應(yīng)用中一方面WINDOWS API函數(shù)的種類較多,不容易被重構(gòu),另 一方面應(yīng)用程序所調(diào)用的WINDOWS API函數(shù)最終會調(diào)用較低級的Native API函數(shù)以完成 相應(yīng)的功能,因此選擇通過自定義實(shí)現(xiàn)Native API來實(shí)現(xiàn)應(yīng)用程序的相關(guān)功能。
[0043] 而后進(jìn)入步驟S2將所述Native API函數(shù)封裝為靜態(tài)庫lib文件,并保存于本地。 自定義實(shí)現(xiàn)Native API函數(shù)后,需要對自定義實(shí)現(xiàn)的Native API函數(shù)進(jìn)行封裝處理,方便 應(yīng)用程序直接從封裝庫中調(diào)用。常用的封裝方法是將函數(shù)封裝為靜態(tài)庫和動(dòng)態(tài)庫兩種形 式,動(dòng)態(tài)庫在應(yīng)用程序運(yùn)行時(shí)才被調(diào)用,一定程度上節(jié)省了內(nèi)存空間,然而由于動(dòng)態(tài)庫并不 存儲于應(yīng)用程序的代碼段中,在調(diào)用時(shí)應(yīng)用程序與動(dòng)態(tài)庫之間需要進(jìn)行一定的交互,交互 頻繁就使得函數(shù)接口容易暴露,一旦惡意程序獲悉函數(shù)接口,就可在應(yīng)用程序調(diào)用動(dòng)態(tài)庫 函數(shù)時(shí)對其進(jìn)行H00K。靜態(tài)庫在編譯過程中就保存于應(yīng)用程序的代碼段(自定義代碼段) 中,在調(diào)用靜態(tài)庫函數(shù)時(shí)無需與外界進(jìn)行交互,所有的調(diào)用均在應(yīng)用程序代碼段內(nèi)部完成, 這就避免了函數(shù)接口暴露,且應(yīng)用程序和靜態(tài)庫是自定義實(shí)現(xiàn),且存儲于本地,惡意程序無 法知道應(yīng)用程序的存儲位置,也就無法得知靜態(tài)庫lib文件的存儲位置,從而進(jìn)一步增強(qiáng) 了調(diào)用Native API函數(shù)的安全性。
[0044] 上述技術(shù)方案通過自定義實(shí)現(xiàn)Native API函數(shù),并將所述Native API函數(shù)封裝 為靜態(tài)庫lib文件,并保存于本地。在應(yīng)用程序運(yùn)行時(shí)可以通過從靜態(tài)庫lib文件對應(yīng)的 本地存儲位置中直接調(diào)用自定義Native API函數(shù),實(shí)現(xiàn)應(yīng)用程序的相關(guān)功能。由于Native API函數(shù)是保存于本地,惡意程序無法知道Native API函數(shù)的存儲地址,也就無法對其進(jìn) 行非法監(jiān)聽、攔截或篡改等操作。此外,由于Native API函數(shù)是靜態(tài)庫lib文件,逆向工程 分析人員無法知道靜態(tài)庫的接口位置,也就無法對自定義實(shí)現(xiàn)的Native API函數(shù)進(jìn)行監(jiān) 聽、攔截或篡改,從而從根本上杜絕了在應(yīng)用層上對API函數(shù)的跟蹤攔截,大大提高了應(yīng)用 程序的安全性,因而在計(jì)算機(jī)技術(shù)安全領(lǐng)域具有廣闊的前景。
[0045] 為了擴(kuò)大自定義實(shí)現(xiàn)的Native API函數(shù)的適用范圍,提高自定義實(shí)現(xiàn)的Native API函數(shù)在不同運(yùn)行環(huán)境下的兼容性,所述自定義實(shí)現(xiàn)Native API函數(shù)方法基于系統(tǒng)類 型;所述系統(tǒng)類型包括32位系統(tǒng)或64位系統(tǒng)。所述自定義實(shí)現(xiàn)Native API函數(shù)的方法基 于系統(tǒng)類型具體包括:
[0046] 當(dāng)所述系統(tǒng)類型為32位系統(tǒng)時(shí),自定義實(shí)現(xiàn)32位系統(tǒng)的Native API函數(shù)并將 其保存于所述自定義代碼段中的第一指定位置。對于32位系統(tǒng),不管系統(tǒng)的版本如何,如 WIN8,WIN7,WINXP等,它們的Native API函數(shù)均保持一致,簡言之,就是所調(diào)用Native API 函數(shù)并不差別,因而在自定義實(shí)現(xiàn)32位系統(tǒng)的Native API函數(shù)時(shí)也無需進(jìn)行預(yù)設(shè)處理,只 需自定義編寫完成后將其封裝為靜態(tài)庫lib文件并保存于所述自定義代碼段中的第一指 定位置。自定義代碼段即為自定義實(shí)現(xiàn)的應(yīng)用程序代碼段,當(dāng)需要調(diào)用自定義實(shí)現(xiàn)的32位 系統(tǒng)Native API函數(shù)時(shí),只需從應(yīng)用程序代碼段的第一指定位置調(diào)用即可。
[0047] 當(dāng)所述系統(tǒng)類型為64位系統(tǒng)時(shí),首先進(jìn)入步驟S3自定義實(shí)現(xiàn)64位系統(tǒng)的Native API函數(shù)并將其保存于所述自定義代碼段中的第二指定位置。當(dāng)需要調(diào)用自定義實(shí)現(xiàn)的64 位系統(tǒng)Native API函數(shù)時(shí),只需從應(yīng)用程序代碼段的第二指定位置調(diào)用即可。通過將自定 義實(shí)現(xiàn)32位系統(tǒng)的Native API函數(shù)和64位系統(tǒng)的Native API函數(shù)分別存儲于應(yīng)用程序 代碼段的不同位置,提升了調(diào)用Native API函數(shù)的效率。
[0048] 由于不同系統(tǒng)版本的Native API函數(shù)存在一定的差別,因而需要對自定義實(shí)現(xiàn)的 64位系統(tǒng)的Native API函數(shù)作一定的預(yù)設(shè)處理。具體地,所述不同系統(tǒng)版本的Native API 函數(shù)存在一定的差別表現(xiàn)為:WIN8系統(tǒng)和其他版本系統(tǒng)(如WIN7,WINXP,WIN2003)存在差 另 1J,下面以Native API函數(shù)中的ZwGetContextThread函數(shù)為例對WIN8系統(tǒng)和其他版本系 統(tǒng)(如WIN7,WINXP,WIN2003)存在的差別作進(jìn)一步說明:
[0049] 對于WIN8系統(tǒng)的ZwGetContextThread函數(shù)的反匯編代碼如下:
[0050] 77E5FAD8>B816000000 MOV EAX,16
[0051] 77E5FAE3 64:FF15 C0000000 CALL DWORD PTR FS:[CO]
[0052] 77E5FAED C2 1400 RETN 14
[0053] 而對于其他版本系統(tǒng)(如WIN7、WINXP、WIN2003、WIN2000等)的 ZwGetContextThread函數(shù)的反匯編代碼如下:
[0054] 77E5FAD8 > B8 16000000 MOVEAX, 16 77E5FADD 33C9 XORECX, ECX 77E5FADF 8D5424 04 LEA EDX, DWORD PTR SS:[ESP+4] 77E5FAE3 64:FF15 C0000000 CALL DWORD PTR FS:[C0] 77E5FAEA 83C4 04 ADD ESP, 4 77E5FAED C2 1400 RETN 14
[0055] 比較得知,對于WIN8系統(tǒng)的ZwGetContextThread函數(shù)與其他版本系統(tǒng)的差別在 于少了如下3條指令 :
[0056] X0R ECX, ECX
[0057] LEA EDX, DffROD PTR SS: [ESP+4]
[0058] ADD ESP, 4
[0059] 而對于64位系統(tǒng)而言,除了 ZwGetContextThread函數(shù)之外的其他Native API函 數(shù)同樣存在類似的差異,即WIN8系統(tǒng)與其他版本系統(tǒng)的Native API函數(shù)存在著少了如上3 條指令的差別。為了增強(qiáng)自定義實(shí)現(xiàn)的64位系統(tǒng)Native API函數(shù)的兼容性,使得無論系 統(tǒng)是什么樣的版本,都能很好地調(diào)用自定義實(shí)現(xiàn)的64位系統(tǒng)Native API函數(shù),完成相應(yīng)的 功能,因而需要對自定義實(shí)現(xiàn)的64位系統(tǒng)Native API函數(shù)進(jìn)行整合操作,所述整合操作包 括指令整合和堆棧整合。如圖2所示,因而在步驟S3后可以進(jìn)入步驟S4設(shè)置寄存器ECX 指令和設(shè)置寄存器EDX指令,所述寄存器ECX和寄存器EDX用于存儲調(diào)用自定義實(shí)現(xiàn)64 位的Native API函數(shù)的參數(shù)。在64位系統(tǒng)中,對于除WIN8以外的其他版本系統(tǒng),在進(jìn)行 Native API函數(shù)調(diào)用時(shí)需要用到寄存器ECX和寄存器EDX中存儲的兩個(gè)參數(shù),才可完成API 函數(shù)的調(diào)用;而對于WIN8系統(tǒng)而言,在進(jìn)行Native API函數(shù)調(diào)用時(shí)無需用到寄存器ECX和 寄存器EDX中存儲的兩個(gè)參數(shù),因而無需設(shè)置寄存器ECX指令和設(shè)置寄存器EDX指令,即使 設(shè)置了寄存器ECX指令和設(shè)置寄存器EDX指令,也不會對WIN8系統(tǒng)的Native API函數(shù)造 成影響。為了使得自定義實(shí)現(xiàn)64位系統(tǒng)的Native API函數(shù)在指令方面得以統(tǒng)一,因而在 自定義實(shí)現(xiàn)64位系統(tǒng)的Native API函數(shù)在指令方面采用除WIN8之外的其他版本系統(tǒng)的 指令設(shè)置方式,也即設(shè)置寄存器ECX指令和設(shè)置寄存器EDX指令。這樣,自定義實(shí)現(xiàn)64位 系統(tǒng)的Native API函數(shù)不僅能夠兼容除WIN8以外的其他版本系統(tǒng)環(huán)境下的調(diào)用,而又不 影響WIN8系統(tǒng)環(huán)境下的調(diào)用,從而使得自定義實(shí)現(xiàn)64位的Native API函數(shù)在指令方面得 以整合統(tǒng)一。
[0060] 而對于堆棧整合方面,以ZwGetContextThread函數(shù)為例,從上述反匯編代碼中易 得,WIN8與其他版本的系統(tǒng)相比較,少了以下一條指令:
[0061] ADD ESP,4
[0062] 簡言之,除WIN8以外的其他版本系統(tǒng)的Native API函數(shù)與WIN8系統(tǒng)的Native API函數(shù)相比較,需要進(jìn)行平衡堆棧操作,上述指令"ADD ESP,4"用于平衡堆棧,4為平衡堆 棧的值,盡管對于不同的Native API函數(shù)所平衡堆棧的值有所差異,但對于除WIN8以外的 其他版本系統(tǒng)的NativeAPI函數(shù)均需要進(jìn)行平衡堆棧操作。而對于WINS系統(tǒng)而言,無需進(jìn) 行平衡堆棧操作,但是即使進(jìn)行了平衡堆棧操作,也不會對NativeAPI函數(shù)的調(diào)用產(chǎn)生影 響。因而為了兼容除WIN8以外的其他版本系統(tǒng),堆棧整合包括平衡堆棧操作,具體包括:
[0063] 首先進(jìn)入步驟S5在調(diào)用自定義實(shí)現(xiàn)64位系統(tǒng)的NativeAPI函數(shù)前將當(dāng)前堆棧 的棧頂指針ESP及棧底指針EBP的初始值保存至靜態(tài)局部變量中;
[0064] 而后進(jìn)入步驟S6在調(diào)用完自定義實(shí)現(xiàn)64位系統(tǒng)的NativeAPI函數(shù)后,將當(dāng)前堆 棧的棧頂指針ESP及棧底指針EBP的值替換為初始值。
[0065]由于NativeAPI函數(shù)在被調(diào)用后,棧頂指針ESP及棧底指針EBP的值往往會發(fā)生 變化,如果未對棧頂指針ESP及棧底指針EBP的初始值進(jìn)行保存的話,每次調(diào)用完成后,由 于需要進(jìn)行平衡堆棧操作,就需要將棧頂指針ESP及棧底指針EBP的值恢復(fù)為初始值,一旦 在計(jì)算過程中恢復(fù)的棧頂指針ESP及棧底指針的值發(fā)生錯(cuò)誤,也就是說與初始值不一致, 則會造成堆棧被破壞,甚至應(yīng)用程序崩潰的嚴(yán)重后果。因而通過在調(diào)用NativeAPI函數(shù)前 將堆棧的棧頂指針ESP及棧底指針EBP的初始值保存至靜態(tài)局部變量中,并在調(diào)用完成后 對頂指針ESP及棧底指針EBP予以恢復(fù)初始值的方式,避免了除WIN8以外的其他版本系統(tǒng) 的NativeAPI函數(shù)在調(diào)用前后進(jìn)行平衡堆棧時(shí)容易發(fā)生錯(cuò)誤的問題。
[0066] 為了增強(qiáng)自定義實(shí)現(xiàn)的NativeAPI函數(shù)調(diào)用時(shí)的安全性,防止逆向分析人員或惡 意程序獲悉自定義實(shí)現(xiàn)的NativeAPI函數(shù)的存儲地址。在步驟S2之后還可以進(jìn)入步驟S7對自定義實(shí)現(xiàn)的NativeAPI函數(shù)進(jìn)行虛擬化操作。所述虛擬化操作可以通過虛擬化軟件 來完成的,具體的,所述虛擬化步驟包括:
[0067] 在需要虛擬化的NativeAPI函數(shù)的代碼中寫入所述虛擬化軟件的宏定義文件; 在需要虛擬化的NativeAPI函數(shù)的代碼內(nèi)加入一對保護(hù)宏,所述保護(hù)宏包括初始保護(hù)宏和 結(jié)束保護(hù)宏,所述初始保護(hù)宏和結(jié)束保護(hù)宏分別位于所述NativeAPI函數(shù)的代碼的初始位 置和結(jié)束位置;用虛擬化軟件運(yùn)行上述NativeAPI函數(shù)的代碼,從而生成相應(yīng)的虛擬化程 序文件。經(jīng)過虛擬化軟件處理后,逆向工程分析人員或惡意程序利用相關(guān)軟件對編譯的二 進(jìn)制進(jìn)行反匯編處理后,并不能得到NativeAPI函數(shù)代碼,得到的是NativeAPI函數(shù)虛擬 化后的程序文件代碼,因而無從得知虛擬化后的程序文件的用途,更無從獲悉NativeAPI 函數(shù)的存儲地址,從而進(jìn)一步提高了自定義實(shí)現(xiàn)的NativeAPI函數(shù)的安全性,進(jìn)而保證了 應(yīng)用程序的安全。
[0068] 上述技術(shù)方案通過自定義實(shí)現(xiàn)NativeAPI函數(shù),并將所述NativeAPI函數(shù)封裝 為靜態(tài)庫lib文件,并保存于本地。且對64位系統(tǒng)的NativeAPI函數(shù)進(jìn)行整合處理,實(shí)現(xiàn) 了 WIN8以及其他版本系統(tǒng)的NativeAPI函數(shù)在調(diào)用時(shí)的統(tǒng)一。并且可以對自定義實(shí)現(xiàn)的 NativeAPI函數(shù)的代碼進(jìn)行虛擬化處理,使得逆向工程分析人員或惡意程序無法獲悉自定 義實(shí)現(xiàn)的NativeAPI函數(shù)的存儲地址,也就無法對自定義實(shí)現(xiàn)的NativeAPI函數(shù)進(jìn)行監(jiān) 聽、攔截或篡改,從而從根本上杜絕了在應(yīng)用層上對API函數(shù)的跟蹤攔截,大大提高了應(yīng)用 程序的安全性,因而在計(jì)算機(jī)技術(shù)安全領(lǐng)域具有廣闊的前景。
[0069] 請參閱圖3,為本發(fā)明一實(shí)施方式NativeAPI函數(shù)重構(gòu)裝置的結(jié)構(gòu)示意圖。所述 裝置包括實(shí)現(xiàn)單元1,封裝單元2以及存儲單元3 ;
[0070] 所述實(shí)現(xiàn)單元1用于自定義實(shí)現(xiàn)NativeAPI函數(shù);
[0071] 所述封裝單元2用于將所述自定義實(shí)現(xiàn)NativeAPI函數(shù)封裝為靜態(tài)庫1ib文件; 其中,所述靜態(tài)庫lib文件位于可執(zhí)行應(yīng)用程序自定義代碼段中;
[0072] 所述存儲單元3用于將靜態(tài)庫lib文件保存于本地。
[0073] 在使用Native API函數(shù)重構(gòu)裝置對Native API函數(shù)進(jìn)行重構(gòu)時(shí),首先實(shí)現(xiàn)單元1 自定義實(shí)現(xiàn)Native API函數(shù),自定義實(shí)現(xiàn)就是通過自己編寫的方式來實(shí)現(xiàn)Native API函 數(shù);而后封裝單元2將所述Native API函數(shù)封裝為靜態(tài)庫lib文件,常用的封裝方法是將 函數(shù)封裝為靜態(tài)庫和動(dòng)態(tài)庫兩種形式,動(dòng)態(tài)庫在應(yīng)用程序運(yùn)行時(shí)才被調(diào)用,一定程度上節(jié) 省了內(nèi)存空間,然而由于動(dòng)態(tài)庫并不存儲于應(yīng)用程序的代碼段中,在調(diào)用時(shí)應(yīng)用程序與動(dòng) 態(tài)庫之間需要進(jìn)行一定的交互,交互頻繁就使得函數(shù)接口容易暴露,一旦惡意程序獲悉函 數(shù)接口,就可在應(yīng)用程序調(diào)用動(dòng)態(tài)庫函數(shù)時(shí)對其進(jìn)行H00K,靜態(tài)庫在編譯過程中就保存于 應(yīng)用程序的代碼段(自定義代碼段)中,在調(diào)用靜態(tài)庫函數(shù)時(shí)無需與外界進(jìn)行交互,所有的 調(diào)用均在應(yīng)用程序代碼段內(nèi)部完成,這就避免了函數(shù)接口暴露;而后存儲單元3將靜態(tài)庫 lib文件保存于本地。由于應(yīng)用程序和靜態(tài)庫是自定義實(shí)現(xiàn),且存儲于本地,惡意程序無法 知道應(yīng)用程序的存儲位置,也就無法得知靜態(tài)庫lib文件的存儲位置,從而進(jìn)一步增強(qiáng)了 調(diào)用Native API函數(shù)的安全性。
[0074] 上述技術(shù)方案通過自定義實(shí)現(xiàn)Native API函數(shù),并將所述Native API函數(shù)封裝 為靜態(tài)庫lib文件,并保存于本地。在應(yīng)用程序運(yùn)行時(shí)可以通過從靜態(tài)庫lib文件對應(yīng)的 本地存儲位置中直接調(diào)用自定義Native API函數(shù),實(shí)現(xiàn)應(yīng)用程序的相關(guān)功能。由于Native API函數(shù)是保存于本地,惡意程序無法知道Native API函數(shù)的存儲地址,也就無法對其進(jìn) 行非法監(jiān)聽、攔截或篡改等操作。此外,由于Native API函數(shù)是靜態(tài)庫lib文件,逆向工程 分析人員無法知道靜態(tài)庫的接口位置,也就無法對自定義實(shí)現(xiàn)的Native API函數(shù)進(jìn)行監(jiān) 聽、攔截或篡改,從而從根本上杜絕了在應(yīng)用層上對API函數(shù)的跟蹤攔截,大大提高了應(yīng)用 程序的安全性,因而在計(jì)算機(jī)技術(shù)安全領(lǐng)域具有廣闊的前景。
[0075] 為了擴(kuò)大自定義實(shí)現(xiàn)的Native API函數(shù)的適用范圍,提高自定義實(shí)現(xiàn)的Native API函數(shù)在不同運(yùn)行環(huán)境下的兼容性,所述自定義實(shí)現(xiàn)Native API函數(shù)方法基于系統(tǒng)類 型;所述系統(tǒng)類型包括32位系統(tǒng)或64位系統(tǒng)。所述自定義實(shí)現(xiàn)Native API函數(shù)的方法基 于系統(tǒng)類型具體包括:
[0076] 當(dāng)所述系統(tǒng)類型為32位系統(tǒng)時(shí),自定義實(shí)現(xiàn)32位系統(tǒng)的Native API函數(shù)并將其 保存于所述自定義代碼段中的第一指定位置。對于32位系統(tǒng),不管系統(tǒng)是什么樣的版本, 如WIN8, WIN7, WINXP等,它們的Native API函數(shù)均保持一致,簡言之,就是所調(diào)用Native API函數(shù)并不差別,因而在自定義實(shí)現(xiàn)32位系統(tǒng)的Native API函數(shù)時(shí)也無需進(jìn)行預(yù)設(shè)處 理,只需自定義編寫完成后將其封裝為靜態(tài)庫lib文件并保存于所述自定義代碼段中的第 一指定位置。自定義代碼段即為自定義實(shí)現(xiàn)的應(yīng)用程序代碼段,當(dāng)需要調(diào)用自定義實(shí)現(xiàn)的 32位系統(tǒng)Native API函數(shù)時(shí),只需從應(yīng)用程序代碼段的第一指定位置調(diào)用即可。
[0077] 當(dāng)所述系統(tǒng)類型為64位系統(tǒng)時(shí),首先進(jìn)入步驟S3自定義實(shí)現(xiàn)64位系統(tǒng)的Native API函數(shù)并將其保存于所述自定義代碼段中的第二指定位置。當(dāng)需要調(diào)用自定義實(shí)現(xiàn)的64 位系統(tǒng)Native API函數(shù)時(shí),只需從應(yīng)用程序代碼段的第二指定位置調(diào)用即可。通過將自定 義實(shí)現(xiàn)32位系統(tǒng)的Native API函數(shù)和64位系統(tǒng)的Native API函數(shù)分別存儲于應(yīng)用程序 代碼段的不同位置,提升了調(diào)用Native API函數(shù)的效率。
[0078] 由于不同系統(tǒng)版本的Native API函數(shù)存在一定的差別,因而需要對自定義實(shí)現(xiàn)的 64位系統(tǒng)的NativeAPI函數(shù)作一定的預(yù)設(shè)處理。具體地,所述不同系統(tǒng)版本的NativeAPI 函數(shù)存在一定的差別表現(xiàn)為:WIN8系統(tǒng)和其他版本系統(tǒng)(如WIN7,WINXP,WIN2003)存在差 另1J,下面以NativeAPI函數(shù)中的ZwGetContextThread函數(shù)為例對WIN8系統(tǒng)和其他版本系 統(tǒng)(如WIN7,WINXP,WIN2003)存在的差別作進(jìn)一步說明:
[0079] 對于WIN8系統(tǒng)的ZwGetContextThread函數(shù)的反匯編代碼如下:
[0080] 77E5FAD8 >B8 16000000 MOVEAX, 16
[0081] 77E5FAE3 64:FF15C0000000 CALLDWORDPTRFS:[CO]
[0082] 77E5FAED C21400 RETN 14
[0083] 而對于其他版本系統(tǒng)(如WIN7、WINXP、WIN2003、WIN2000等)的 ZwGetContextThread函數(shù)的反匯編代碼如下:
[0084] 77E5FAD8>B8 16000000 MOV EAX, 16 77E5FADD 33C9 XOR ECX, ECX 77E5FADF 8D5424 04 LEA EDX, DWORD PTR SS:[ESP+4] 77E5FAE3 64:FF15 C0000000 CALL DWORD PTR FS: [CO] 77E5FAEA 83C4 04 ADD ESP, 4 77E5FAED C2 1400 RETN 14
[0085] 比較得知,對于WIN8系統(tǒng)的ZwGetContextThread函數(shù)與其他版本系統(tǒng)的差別在 于少了如下3條指令 :
[0086] XORECX,ECX
[0087] LEAEDX,DffRODPTRSS: [ESP+4]
[0088] ADD ESP, 4
[0089] 而對于64位系統(tǒng)而言,除了 ZwGetContextThread函數(shù)之外的其他NativeAPI函 數(shù)同樣存在類似的差異,即WINS系統(tǒng)與其他版本系統(tǒng)的NativeAPI函數(shù)存在著少了如上3條指令的差別。為了增強(qiáng)自定義實(shí)現(xiàn)的64位系統(tǒng)NativeAPI函數(shù)的兼容性,使得無論 系統(tǒng)是什么樣的版本,都能很好地調(diào)用自定義實(shí)現(xiàn)的64位系統(tǒng)NativeAPI函數(shù),完成相應(yīng) 的功能,因而所在裝置還包括整合單元4,所述整合單元4用于對自定義實(shí)現(xiàn)的64位系統(tǒng) NativeAPI函數(shù)進(jìn)行整合操作,所述整合單元4包括指令整合模塊41和堆棧整合模塊42, 所述指令整合模塊41用于設(shè)置寄存器ECX指令和設(shè)置寄存器EDX指令,堆棧整合模塊4用 于在調(diào)用自定義實(shí)現(xiàn)64位系統(tǒng)的NativeAPI函數(shù)前將當(dāng)前堆棧的棧頂指針ESP及棧底 指針EBP的初始值保存至靜態(tài)局部變量中,在調(diào)用完自定義實(shí)現(xiàn)64位系統(tǒng)的NativeAPI 函數(shù)后,將當(dāng)前堆棧的棧頂指針ESP及棧底指針EBP的值替換為初始值。
[0090] 在64位系統(tǒng)中,對于除WIN8以外的其他版本系統(tǒng),在進(jìn)行Native API函數(shù)調(diào)用 時(shí)需要用到寄存器ECX和寄存器EDX中存儲的兩個(gè)參數(shù),才可完成API函數(shù)的調(diào)用;而對于 WIN8系統(tǒng)而言,在進(jìn)行Native API函數(shù)調(diào)用時(shí)無需用到寄存器ECX和寄存器EDX中存儲的 兩個(gè)參數(shù),因而無需設(shè)置寄存器ECX指令和設(shè)置寄存器EDX指令,即使設(shè)置了寄存器ECX指 令和設(shè)置寄存器EDX指令,也不會對WIN8系統(tǒng)的NativeAPI函數(shù)造成影響。為了使得自 定義實(shí)現(xiàn)64位系統(tǒng)的NativeAPI函數(shù)在指令方面得以統(tǒng)一,因而在實(shí)現(xiàn)單元1自定義實(shí) 現(xiàn)64位系統(tǒng)的NativeAPI函數(shù)在指令方面采用除WIN8之外的其他版本系統(tǒng)的指令設(shè)置 方式,也即指令整合模塊41設(shè)置寄存器ECX指令和設(shè)置寄存器EDX指令。這樣,自定義實(shí) 現(xiàn)64位系統(tǒng)的NativeAPI函數(shù)不僅能夠兼容除WIN8以外的其他版本系統(tǒng)環(huán)境下的調(diào)用, 而又不影響WIN8系統(tǒng)環(huán)境下的調(diào)用,從而使得自定義實(shí)現(xiàn)64位的NativeAPI函數(shù)在指令 方面得以整合統(tǒng)一。
[0091] 而對于堆棧整合方面,以ZwGetContextThread函數(shù)為例,從上述反匯編代碼中易 得,WIN8與其他版本的系統(tǒng)相比較,少了以下一條指令:
[0092] ADDESP,4
[0093] 簡言之,除WIN8以外的其他版本系統(tǒng)的NativeAPI函數(shù)與WIN8系統(tǒng)的Native API函數(shù)相比較,需要進(jìn)行平衡堆棧操作,上述指令"ADDESP,4"用于平衡堆棧,4為平衡堆 棧的值,盡管對于不同的NativeAPI函數(shù)所平衡堆棧的值有所差異,但對于除WIN8以外的 其他版本系統(tǒng)的NativeAPI函數(shù)均需要進(jìn)行平衡堆棧操作。而對于WIN8系統(tǒng)而言,無需 進(jìn)行平衡堆棧操作,但是即使進(jìn)行了平衡堆棧操作,也不會對NativeAPI函數(shù)的調(diào)用產(chǎn)生 影響。因而為了兼容除WIN8以外的其他版本系統(tǒng),堆棧整合模塊42在進(jìn)行平衡堆棧操作 時(shí),具體包括:
[0094] 在調(diào)用自定義實(shí)現(xiàn)64位系統(tǒng)的NativeAPI函數(shù)前將當(dāng)前堆棧的棧頂指針ESP及 棧底指針EBP的初始值保存至靜態(tài)局部變量中;
[0095] 在調(diào)用完自定義實(shí)現(xiàn)64位系統(tǒng)的NativeAPI函數(shù)后,將當(dāng)前堆棧的棧頂指針ESP 及棧底指針EBP的值替換為初始值。
[0096] 由于NativeAPI函數(shù)在被調(diào)用后,棧頂指針ESP及棧底指針EBP的初始值往往會 發(fā)生變化,如果未對棧頂指針ESP及棧底指針EBP的初始值進(jìn)行保存的話,每次調(diào)用完成 后,由于需要進(jìn)行平衡堆棧操作,就需要將棧頂指針ESP及棧底指針EBP的值恢復(fù)為初始 值,一旦在計(jì)算過程中恢復(fù)的棧頂指針ESP及棧底指針的值發(fā)生錯(cuò)誤,也就是說與初始值 不一致,則會造成堆棧被破壞,甚至應(yīng)用程序崩潰的嚴(yán)重后果。因而通過在調(diào)用NativeAPI 函數(shù)前將堆棧的棧頂指針ESP及棧底指針EBP的初始值保存至靜態(tài)局部變量中,并在調(diào)用 完成后對頂指針ESP及棧底指針EBP予以恢復(fù)初始值的方式,避免了除WIN8以外的其他版 本系統(tǒng)的NativeAPI函數(shù)在調(diào)用前后進(jìn)行平衡堆棧時(shí)容易發(fā)生錯(cuò)誤的問題。
[0097] 為了增強(qiáng)自定義實(shí)現(xiàn)的NativeAPI函數(shù)調(diào)用時(shí)的安全性,防止逆向分析人員或惡 意程序獲悉自定義實(shí)現(xiàn)的NativeAPI函數(shù)的存儲地址。所述裝置還包括虛擬化單元5,所 述虛擬化單元5用于對自定義實(shí)現(xiàn)的NativeAPI函數(shù)進(jìn)行虛擬化操作。所述虛擬化操作 可以通過虛擬化軟件來完成的,具體的,所述虛擬化步驟包括:
[0098] 在需要虛擬化的NativeAPI函數(shù)的代碼中寫入所述虛擬化軟件的宏定義文件; 在需要虛擬化的NativeAPI函數(shù)的代碼內(nèi)加入一對保護(hù)宏,所述保護(hù)宏包括初始保護(hù)宏和 結(jié)束保護(hù)宏,所述初始保護(hù)宏和結(jié)束保護(hù)宏分別位于所述NativeAPI函數(shù)的代碼的初始位 置和結(jié)束位置;用虛擬化軟件運(yùn)行上述NativeAPI函數(shù)的代碼,從而生成相應(yīng)的虛擬化程 序文件。經(jīng)過虛擬化軟件處理后,逆向工程分析人員或惡意程序利用相關(guān)軟件對編譯的二 進(jìn)制進(jìn)行反匯編處理后,并不能得到NativeAPI函數(shù)代碼,得到的是NativeAPI函數(shù)虛擬 化后的程序文件代碼,因而無從得知虛擬化后的程序文件的用途,更無從獲悉NativeAPI 函數(shù)的存儲地址,從而進(jìn)一步提高了自定義實(shí)現(xiàn)的NativeAPI函數(shù)的安全性,進(jìn)而保證了 應(yīng)用程序的安全。
[0099] 上述技術(shù)方案通過自定義實(shí)現(xiàn)NativeAPI函數(shù),并將所述NativeAPI函數(shù)封裝 為靜態(tài)庫lib文件,并保存于本地。且對64位系統(tǒng)的NativeAPI函數(shù)進(jìn)行整合處理,實(shí)現(xiàn) 了WIN8以及其他版本系統(tǒng)的NativeAPI函數(shù)在調(diào)用時(shí)的統(tǒng)一。并且可以對自定義實(shí)現(xiàn)的 NativeAPI函數(shù)的代碼進(jìn)行虛擬化處理,使得逆向工程分析人員或惡意程序無法獲悉自定 義實(shí)現(xiàn)的NativeAPI函數(shù)的存儲地址,也就無法對自定義實(shí)現(xiàn)的NativeAPI函數(shù)進(jìn)行監(jiān) 聽、攔截或篡改,從而從根本上杜絕了在應(yīng)用層上對API函數(shù)的跟蹤攔截,大大提高了應(yīng)用 程序的安全性,因而在計(jì)算機(jī)技術(shù)安全領(lǐng)域具有廣闊的前景。
[0100] 需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個(gè)實(shí) 體或者操作與另一個(gè)實(shí)體或操作區(qū)分開來,而不一定要求或者暗示這些實(shí)體或操作之間存 在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語"包括"、"包含"或者其任何其他變體意在涵蓋 非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者終端設(shè)備不僅包括那些 要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者終 端設(shè)備所固有的要素。在沒有更多限制的情況下,由語句"包括……"或"包含……"限定的 要素,并不排除在包括所述要素的過程、方法、物品或者終端設(shè)備中還存在另外的要素。此 夕卜,在本文中,"大于"、"小于"、"超過"等理解為不包括本數(shù);"以上"、"以下"、"以內(nèi)"等理解 為包括本數(shù)。
[0101] 本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,上述各實(shí)施例可提供為方法、裝置、或計(jì)算機(jī)程序產(chǎn) 品。這些實(shí)施例可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例 的形式。上述各實(shí)施例涉及的方法中的全部或部分步驟可以通過程序來指令相關(guān)的硬件來 完成,所述的程序可以存儲于計(jì)算機(jī)設(shè)備可讀取的存儲介質(zhì)中,用于執(zhí)行上述各實(shí)施例方 法所述的全部或部分步驟。所述計(jì)算機(jī)設(shè)備,包括但不限于:個(gè)人計(jì)算機(jī)、服務(wù)器、通用計(jì)算 機(jī)、專用計(jì)算機(jī)、網(wǎng)絡(luò)設(shè)備、嵌入式設(shè)備、可編程設(shè)備、智能移動(dòng)終端、智能家居設(shè)備、穿戴式 智能設(shè)備、車載智能設(shè)備等;所述的存儲介質(zhì),包括但不限于:RAM、ROM、磁碟、磁帶、光盤、 閃存、U盤、移動(dòng)硬盤、存儲卡、記憶棒、網(wǎng)絡(luò)服務(wù)器存儲、網(wǎng)絡(luò)云存儲等。
[0102] 上述各實(shí)施例是參照根據(jù)實(shí)施例所述的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的 流程圖和/或方框圖來描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的 每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些 計(jì)算機(jī)程序指令到計(jì)算機(jī)設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過計(jì)算機(jī)設(shè)備的處理器執(zhí) 行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框 中指定的功能的裝置。
[0103] 這些計(jì)算機(jī)程序指令也可存儲在能引導(dǎo)計(jì)算機(jī)設(shè)備以特定方式工作的計(jì)算機(jī)設(shè) 備可讀存儲器中,使得存儲在該計(jì)算機(jī)設(shè)備可讀存儲器中的指令產(chǎn)生包括指令裝置的制造 品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指 定的功能。
[0104] 這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)設(shè)備上,使得在計(jì)算機(jī)設(shè)備上執(zhí)行一系列 操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程 圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
[0105] 盡管已經(jīng)對上述各實(shí)施例進(jìn)行了描述,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng) 造性概念,則可對這些實(shí)施例做出另外的變更和修改,所以以上所述僅為本發(fā)明的實(shí)施例, 并非因此限制本發(fā)明的專利保護(hù)范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu) 或等效流程變換,或直接或間接運(yùn)用在其他相關(guān)的【技術(shù)領(lǐng)域】,均同理包括在本發(fā)明的專利 保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1. 一種Native API函數(shù)重構(gòu)方法,其特征在于,所述方法包括如下步驟: 自定義實(shí)現(xiàn)Native API函數(shù); 將所述Native API函數(shù)封裝為靜態(tài)庫lib文件,并保存于本地;其中,所述靜態(tài)庫lib 文件位于自定義代碼段中。
2. 根據(jù)權(quán)利要求1所述的Native API函數(shù)重構(gòu)方法,其特征在于,自定義實(shí)現(xiàn)Native API函數(shù)的方法基于系統(tǒng)類型;所述系統(tǒng)類型包括32位系統(tǒng)或64位系統(tǒng)。
3. 根據(jù)權(quán)利要求2所述的Native API函數(shù)重構(gòu)方法,其特征在于,所述自定義實(shí)現(xiàn) Native API函數(shù)的方法基于系統(tǒng)類型具體包括: 當(dāng)所述系統(tǒng)類型為32位系統(tǒng)時(shí),自定義實(shí)現(xiàn)32位系統(tǒng)的Native API函數(shù)并將其保存 于所述自定義代碼段中的第一指定位置;或, 當(dāng)所述系統(tǒng)類型為64位系統(tǒng)時(shí),自定義實(shí)現(xiàn)64位系統(tǒng)的Native API函數(shù)并將其保存 于所述自定義代碼段中的第二指定位置。
4. 根據(jù)權(quán)利要求3所述的Native API函數(shù)重構(gòu)方法,其特征在于,所述自定義實(shí)現(xiàn)64 位系統(tǒng)的Native API函數(shù)還包括整合操作,所述整合操作包括指令整合和堆棧整合; 所述指令整合包括設(shè)置寄存器ECX指令和設(shè)置寄存器EDX指令,所述寄存器ECX和寄 存器EDX用于存儲調(diào)用自定義實(shí)現(xiàn)64位的Native API函數(shù)的參數(shù); 所述堆棧整合具體包括: 在調(diào)用自定義實(shí)現(xiàn)64位系統(tǒng)的Native API函數(shù)前將當(dāng)前堆棧的棧頂指針ESP及棧底 指針EBP的初始值保存至靜態(tài)局部變量中; 在調(diào)用完自定義實(shí)現(xiàn)64位系統(tǒng)的Native API函數(shù)后,將當(dāng)前堆棧的棧頂指針ESP及 棧底指針EBP的值替換為初始值。
5. 根據(jù)權(quán)利要求1所述的Native API函數(shù)重構(gòu)方法,其特征在于,所述方法還包括: 對自定義實(shí)現(xiàn)的Native API函數(shù)進(jìn)行虛擬化操作。
6. -種Native API函數(shù)重構(gòu)裝置,其特征在于,所述裝置包括實(shí)現(xiàn)單元,封裝單元以 及存儲單元; 所述實(shí)現(xiàn)單元用于自定義實(shí)現(xiàn)Native API函數(shù); 所述封裝單元用于將所述自定義實(shí)現(xiàn)Native API函數(shù)封裝為靜態(tài)庫lib文件;其中, 所述靜態(tài)庫lib文件位于可執(zhí)行應(yīng)用程序自定義代碼段中; 所述存儲單元用于將靜態(tài)庫lib文件保存于本地。
7. 根據(jù)權(quán)利要求6所述的Native API函數(shù)重構(gòu)裝置,其特征在于,實(shí)現(xiàn)單元自定義實(shí) 現(xiàn)Native API函數(shù)基于系統(tǒng)類型;所述系統(tǒng)類型包括32位系統(tǒng)或64位系統(tǒng)。
8. 根據(jù)權(quán)利要求7所述的Native API函數(shù)重構(gòu)裝置,其特征在于,所述實(shí)現(xiàn)單元自定 義實(shí)現(xiàn)Native API函數(shù)基于系統(tǒng)類型具體包括: 當(dāng)所述系統(tǒng)類型為32位系統(tǒng)時(shí),實(shí)現(xiàn)單元用于自定義實(shí)現(xiàn)32位系統(tǒng)的Native API函 數(shù),存儲單元用于將自定義實(shí)現(xiàn)32位系統(tǒng)的Native API函數(shù)保存于所述自定義代碼段中 的第一指定位置;或, 當(dāng)所述系統(tǒng)類型為64位系統(tǒng)時(shí),實(shí)現(xiàn)單元用于自定義實(shí)現(xiàn)64位系統(tǒng)的Native API函 數(shù),存儲單元用于將自定義實(shí)現(xiàn)64位系統(tǒng)的Native API函數(shù)保存于所述自定義代碼段中 的第二指定位置。
9. 根據(jù)權(quán)利要求8所述的Native API函數(shù)重構(gòu)裝置,其特征在于,所述裝置還包括整 合單元,所述整合單元包括指令整合模塊和堆棧整合模塊,所述指令整合模塊用于設(shè)置寄 存器ECX指令和設(shè)置寄存器EDX指令,所述寄存器ECX和寄存器EDX用于存儲調(diào)用自定義 實(shí)現(xiàn)64位的Native API函數(shù)的參數(shù);所述堆棧整合模塊用于在調(diào)用自定義實(shí)現(xiàn)64位的 Native API函數(shù)前將當(dāng)前堆棧的棧頂指針ESP及棧底指針EBP的初始值保存到靜態(tài)局部變 量中,并在調(diào)用完自定義實(shí)現(xiàn)64位的Native API函數(shù)后,將當(dāng)前堆棧的棧頂指針ESP及棧 底指針EBP的值替換為初始值。
10. 根據(jù)權(quán)利要求6所述的Native API函數(shù)重構(gòu)裝置,其特征在于,所述裝置包括虛擬 化單元,所述虛擬化單元用于對自定義實(shí)現(xiàn)的Native API函數(shù)進(jìn)行虛擬化操作。
【文檔編號】G06F21/51GK104392169SQ201410775577
【公開日】2015年3月4日 申請日期:2014年12月15日 優(yōu)先權(quán)日:2014年12月15日
【發(fā)明者】鄭建強(qiáng), 劉德建, 陳宏展, 鐘良德, 方振華, 李上杰 申請人:福建天晴數(shù)碼有限公司