Native API函數重構方法及裝置制造方法
【專利摘要】本發明公開了一種Native?API函數重構方法及裝置,屬于計算機【技術領域】。所述方法包括:獲取加載函數的系統調用號;將每個加載函數的系統調用號分別拷貝至自定義加載函數的代碼體中;根據自定義加載函數將NTDLL.DLL加載至內存的指定位置;利用NTDLL.DLL中的Native?API函數分別重構自定義代碼段內各個自定義Native?API函數。本發明通過模擬加載函數對NTDLL.DLL進行加載,利用加載后的NTDLL.DLL對Native?API函數進行重構;解決了現有技術中調用API函數時存在較大安全隱患的問題;在應用程序運行時可以直接調用重構后的自定義Native?API函數,達到了避免應用程序被惡意程序處理,提高應用程序安全性的效果。
【專利說明】Native API函數重構方法及裝置
【技術領域】
[0001]本發明涉及計算機【技術領域】,特別涉及一種Native API函數重構方法及裝置。
【背景技術】
[0002]隨著WINDOWS API (WINDOWS Application Programming Interface, WINDOWS 應用程序編程接口)編程的廣泛普及和應用,越來越多的應用程序可以通過調用WINDOWS API函數來完成相應的功能。
[0003]目前,應用程序在實現具體功能時,在應用層,首先需要加載與功能相關的DLL(Dynamic Link Library,動態鏈接庫),然后根據 GetProcAddress 函數獲取 DLL 中 WINDOWSAPI函數的起始地址,根據這些起始地址調用對應的WINDOWS API函數,這些WINDOWS API函數通常會最終調用較低級的Native API函數,這些Native API函數最終完成對驅動層的訪問。
[0004]在實現本發明的過程中,發明人發現現有技術至少存在以下問題:在應用層上,惡意程序(比如利用鉤子Η00Κ技術的程序)可以預先處理GetPiOcAddress函數,以得到相關的API函數(通常可以包括WINDOWS API函數或者Native API函數)的起始地址,并獲取API函數的內容或對API函數的內容進行修改。因此,在應用層上,惡意程序均可以非法監聽、攔截或篡改API函數中的內容,從而使得應用程序存在較大的安全隱患。
【發明內容】
[0005]為了解決現有技術中調用API函數的過程中容易被惡意程序預先處理,使得應用程序存在較大的安全隱患的問題,本發明實施例提供了一種Native API函數重構方法及裝置。所述技術方案如下:
[0006]第一方面,提供了一種Native API函數重構方法,所述方法,包括:
[0007]獲取加載函數的系統調用號,所述加載函數用于將動態鏈接庫NTDLL.DLL加載至內存,所述NTDLL.DLL中包含Native API函數;
[0008]將每個所述加載函數的系統調用號分別拷貝至與所述加載函數對應的各個自定義加載函數的代碼體中,所述自定義加載函數位于用于執行應用程序的自定義代碼段中,所述自定義加載函數的代碼體中的初始代碼與所述加載函數中的代碼相同;
[0009]根據包含有所述加載函數的系統調用號的所述自定義加載函數將所述NTDLL.DLL加載至所述內存的指定位置;
[0010]利用位于所述指定位置的NTDLL.DLL中的Native API函數中的代碼分別重構所述自定義代碼段內與所述Native API函數對應的各個自定義Native API函數中的代碼。
[0011]在第一方面的第一種可能的實施方式中,在所述根據包含有所述加載函數的系統調用號的所述自定義加載函數將所述NTDLL.DLL加載至所述內存的指定位置之前,還包括:
[0012]獲取分配函數的系統調用號,所述分配函數用于為所述加載函數分配內存讀寫執行權限;
[0013]將所述分配函數的系統調用號拷貝到所述自定義分配函數的代碼體內,所述自定義分配函數位于所述自定義代碼段中;
[0014]利用包含有所述分配函數的系統調用號的所述自定義分配函數為所述自定義加載函數分配內存讀寫執行權限。
[0015]結合第一方面或者第一方面的第一種可能的實施方式,在第二種可能的實施方式中,所述根據包含有所述加載函數的系統調用號的所述自定義加載函數將所述NTDLL.DLL加載至所述內存的指定位置之前,還包括:
[0016]將用于調用內核函數的公用代碼段拷貝到所述自定義代碼段中;
[0017]所述根據包含有所述加載函數的系統調用號的所述自定義加載函數將所述NTDLL.DLL加載至所述內存的指定位置,包括:
[0018]根據包含有所述加載函數的系統調用號的所述自定義加載函數以及所述自定義代碼段中的所述公用代碼段將所述NTDLL.DLL加載至所述內存的指定位置。
[0019]結合第一方面、第一方面的第一種可能的實施方式或者第一方面的第二種可能的實施方式,在第三種可能的實施方式中,在所述將用于調用內核函數的公用代碼段拷貝到所述自定義代碼段中之前,還包括:
[0020]遍歷內存中NTDLL的導出表,獲取指定的測試函數的起始地址;
[0021]根據所述測試函數的起始地址調用所述測試函數以獲取系統類型;
[0022]所述將用于調用內核函數的公用代碼段拷貝到所述自定義代碼段中,包括:
[0023]根據所述系統類型將用于調用與所述系統類型對應的內核函數的公用代碼段拷貝至所述自定義代碼段中。
[0024]結合第一方面、第一方面的第一種可能的實施方式、第一方面的第二種可能的實施方式或者第一方面的第三種可能的實施方式,在第四種可能的實施方式中,所述系統類型為64位W0W64模式、32位或64位,所述根據所述系統類型將用于調用與所述系統類型對應的內核函數的公用代碼段拷貝至所述自定義代碼段中,包括:
[0025]當所述系統類型為64位時,將用于調用64位W0W64模式的內核函數的公用代碼段拷貝到所述自定義代碼段中的第一指定位置;
[0026]或者,
[0027]當所述系統類型為32位時,將用于調用32位的內核函數的公用代碼段拷貝到所述自定義代碼段中的第二指定位置;
[0028]或者,
[0029]當所述系統類型為64位時,將用于調用64位的內核函數的公用代碼段拷貝到所述自定義代碼段中的第三指定位置。
[0030]第二方面,提供了一種Native API函數重構裝置,所述裝置,包括:
[0031]第一獲取模塊,用于獲取加載函數的系統調用號,所述加載函數用于將動態鏈接庫NTDLL.DLL加載至內存,所述NTDLL.DLL中包含Native API函數;
[0032]第一拷貝模塊,用于將每個所述加載函數的系統調用號分別拷貝至與所述加載函數對應的各個自定義加載函數的代碼體中,所述自定義加載函數位于用于執行應用程序的自定義代碼段中,所述自定義加載函數的代碼體中的初始代碼與所述加載函數中的代碼相同;
[0033]加載模塊,用于根據包含有所述加載函數的系統調用號的所述自定義加載函數將所述NTDLL.DLL加載至所述內存的指定位置;
[0034]重構模塊,用于利用位于所述指定位置的NTDLL.DLL中的Native API函數中的代碼分別重構所述自定義代碼段內與所述Native API函數對應的各個自定義Native API函數中的代碼。
[0035]在第二方面的第一種可能的實施方式中,所述裝置,還包括:
[0036]第二獲取模塊,用于獲取分配函數的系統調用號,所述分配函數用于為所述加載函數分配內存讀寫執行權限;
[0037]第二拷貝模塊,用于將所述分配函數的系統調用號拷貝到所述自定義分配函數的代碼體內,所述自定義分配函數位于所述自定義代碼段中;
[0038]分配模塊,用于利用包含有所述分配函數的系統調用號的所述自定義分配函數為所述自定義加載函數分配內存讀寫執行權限。
[0039]結合第二方面或者第二方面的第一種可能的實施方式,在第二種可能的實施方式中,所述裝置,還包括:
[0040]代碼段拷貝模塊,用于將用于調用內核函數的公用代碼段拷貝到所述自定義代碼段中;
[0041]所述加載模塊,還用于:
[0042]根據包含有所述加載函數的系統調用號的所述自定義加載函數以及所述自定義代碼段中的所述公用代碼段將所述NTDLL.DLL加載至所述內存的指定位置。
[0043]結合第二方面、第二方面的第一種可能的實施方式或者第二方面的第二種可能的實施方式,在第三種可能的實施方式中,所述裝置,還包括:
[0044]遍歷模塊,遍歷內存中NTDLL的導出表,獲取指定的測試函數的起始地址;
[0045]類型獲取模塊,用于根據所述測試函數的起始地址調用所述測試函數以獲取系統類型;
[0046]所述代碼段拷貝模塊,用于:
[0047]根據所述系統類型將用于調用與所述系統類型對應的內核函數的公用代碼段拷貝至所述自定義代碼段中。
[0048]結合第二方面、第二方面的第一種可能的實施方式、第二方面的第二種可能的實施方式或者第二方面的第三種可能的實施方式,在第四種可能的實施方式中,所述系統類型為64位W0W64模式、32位或64位,所述代碼段,包括:
[0049]第一拷貝單元,用于當所述系統類型為64位W0W64模式時,將用于調用64位W0W64模式的內核函數的公用代碼段拷貝到所述自定義代碼段中的第一指定位置;
[0050]或者,
[0051]第二拷貝單元,用于當所述系統類型為32位時,將用于調用32位的內核函數的公用代碼段拷貝到所述自定義代碼段中的第二指定位置;
[0052]或者,
[0053]第三拷貝單元,用于當所述系統類型為64位時,將用于調用64位的內核函數的公用代碼段拷貝到所述自定義代碼段中的第三指定位置。[0054]本發明實施例提供的技術方案帶來的有益效果是:
[0055]通過根據包含有加載函數的系統調用號的自定義加載函數將NTDLL.DLL加載至內存的指定位置,位于自定義代碼段中的每個自定義加載函數中包含有對應的加載函數的代碼,利用位于指定位置的NTDLL.DLL中的Native API函數中的代碼分別重構自定義代碼段內與Native API函數對應的各個自定義Native API函數中的代碼;解決了現有技術中調用API函數的過程中容易被惡意程序預先處理,使得應用程序存在較大安全隱患的問題JfNative API函數進行重構,在應用程序運行時可以通過自定義代碼段直接調用重構后的自定義Native API函數,實現應用程序的相關功能,達到了可以避免應用程序被惡意程序處理,大大提高了應用程序安全性的效果。
【專利附圖】
【附圖說明】
[0056]為了更清楚地說明本發明實施例中的技術方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發明的一些實施例,對于本領域普通技術人員來講,在不付出創造性勞動的前提下,還可以根據這些附圖獲得其他的附圖。
[0057]圖1是本發明一個實施例提供的Native API函數重構方法的方法流程圖;
[0058]圖2是本發明另一個實施例提供的Native API函數重構方法的方法流程圖;
[0059]圖3是本發明一個實施例提供的Native API函數重構裝置的結構示意圖;
[0060]圖4是本發明另一個實施例提供的Native API函數重構裝置的結構示意圖。
【具體實施方式】
[0061]為使本發明的目的、技術方案和優點更加清楚,下面將結合附圖對本發明實施方式作進一步地詳細描述。
[0062]在實現本發明的過程中,發明人發現現有技術中在調用執行應用程序所需的WINDOWS API函數或者Native API函數之前,WINDOWS API函數的地址或者Native API函數的地址容易被惡意程序優先獲取,這樣應用程序最終得到的結果很可能被惡意程序監聽到或者被惡意程序修改掉,因此對于應用程序來講,存在很大的安全隱患。而發明人發現應用程序在執行的過程中,調用的WINDOWS API函數最終會調用較低級的Native API函數以完成相應的功能,且應用程序中自己寫的代碼段(稱為自定義代碼段)不易被惡意程序監聽至IJ,因此發明人將Native API函數放入到自己定義的自定義代碼段中,并利用一種特殊的方法重構自定義代碼段中的Native API函數,這樣在應用程序執行時,直接調用自定義代碼段中的Native API函數即可完成相應的功能,從而保證應用程序的內容不會被惡意程序監聽或篡改,可以大大提高應用程序的安全性。
[0063]也就是說,當應用程序執行時,系統會將相關的動態鏈接庫(包括NTDLL.DLL)自動加載至內存的固定位置,這樣惡意程序就可以獲取內存中該固定位置處動態鏈接庫中的函數信息。由于應用程序在執行時需要調用相關的WINDOWS API函數來完成相應的功能,而WINDOWS API函數最終是通過Native API函數完成對內核函數的調用。因此如果能夠保證WINDOWS API函數正確或者Native API函數正確就可以保證應用程序完成正確的功能。通常,自己定義的代碼段是不容易被惡意程序Hook到的,因此可以將所需要的WINDOWS API函數或者Native API函數放入自己定義的代碼段中,以完成應用程序的相關功能,且可以避免被Hook到。但在實際應用中WINDOWS API函數的種類較多,不容易被重構,因此發明人通過重構Native API函數來實現應用程序的相關功能。
[0064]下面通過具體的實施例對Native API函數重構方法進行詳細說明。
[0065]請參見圖1,其示出了本發明一個實施例中提供的Native API函數重構方法的方法流程圖。該Native API函數重構方法可以包括:
[0066]101,獲取加載函數的系統調用號,加載函數用于將動態鏈接庫NTDLL.DLL加載至內存,該NTDLL.DLL中包含Native API函數;
[0067]為了避免惡意程序監聽并篡改NTDLL.DLL中的Native API函數,可以通過模擬的加載函數對NTDLL.DLL進行重新加載,以將NTDLL.DLL重新加載至內存中自己指定的位置,這樣就可以避免惡意程序監聽并篡改NTDLL.DLL中的Native API函數。
[0068]而在模擬加載函數時,需要獲取加載函數的系統調用號,以便于模擬加載函數。舉例來講,當應用程序被執行后,系統首先加載一個NTDLL.DLL至內存的固定位置,此時則可以獲取系統加載的NTDLL.DLL中的加載函數的系統調用號。
[0069]102,將每個加載函數的系統調用號分別拷貝至與加載函數對應的各個自定義加載函數的代碼體中,自定義加載函數位于用于執行應用程序的自定義代碼段中,自定義加載函數的代碼體中的初始代碼與加載函數中的代碼相同;
[0070]自定義代碼段是應用程序中自己定義的一段代碼,該自定義代碼段中初始定義了該應用程序所需要的Native API函數,比如可以用于將動態鏈接庫NTDLL.DLL加載至內存的加載函數等。
[0071]由于自定義代碼段中Native API函數的初始代碼都是從系統中直接獲取到的,在實際應用中,這些函數的初始代碼很可能已經被惡意程序Hook過,因此這些代碼可能是不安全的。
[0072]此時,需要模擬出加載函數,即自定義加載函數。由于自定義加載函數是模擬的加載函數,在生成自定義加載函數時是不知道該自定義加載函數的系統調用號的,且在利用自定義加載函數需要使用到與自定義加載函數相關的系統調用號,因此需要首先獲取加載函數的系統調用號,然后將該系統調用號拷貝至模擬的自定義加載函數中。
[0073]103,根據包含有加載函數的系統調用號的自定義加載函數將NTDLL.DLL加載至內存的指定位置;
[0074]也就是說,通過模擬的自定義加載函數加載NTDLL.DLL的過程可以包括:獲取加載函數的系統調用號,并將加載函數的系統調用號拷貝至自定義代碼段中的自定義加載函數中,利用該包含有加載函數的系統調用號的自定義加載函數將NTDLL.DLL加載至內存的指定位置。這樣由于自定義代碼段中的自定義加載函數無法被惡意程序Hook到,因此,利用模擬出來的自定義加載函數來加載NTDLL.DLL至內存的指定位置后,內存的指定位置處的NTDLL.DLL也無法被惡意程序Hook到。這樣,也就保證了 NTDLL.DLL中的所有NativeAPI函數都是安全的。
[0075]需要說明的是,當應用程序開始執行時,首先系統加載NTDLL.DLL至內存的固定位置后,然后可以獲取該固定位置處NTDLL.DLL中的加載函數的系統調用號,將該系統調用號拷貝至自定義代碼段中的自定義加載函數中;隨后通過模擬的自定義加載函數加載NTDLL.DLL至內存的指定位置。固定位置處的NTDLL.DLL的內容容易被Hook到,而自己加載的指定位置處的NTDLL.DLL則不容易被Hook到。
[0076]104,利用位于指定位置的NTDLL.DLL中的Native API函數中的代碼分別重構自定義代碼段內與Native API函數對應的各個自定義Native API函數中的代碼。
[0077]由于內存的指定位置處的NTDLL.DLL中的所有Native API函數都是安全的,因此可以根據自定義代碼段中設置的自定義Native API函數,從NTDLL.DLL中找到與這些自定義Native API函數對應的Native API函數,并根據這些Native API函數分別重構自定義代碼段內與Native API函數對應的各個自定義Native API函數中的代碼。
[0078]由此可知,自定義代碼段中重構后的自定義Native API函數具有對應的原有Native API的功能,且自定義Native API函數中的代碼是安全的。由于自定義NativeAPI函數是放置在自定義代碼段中的,因此這些自定義Native API函數也不易被惡意程序Hook 到。
[0079]在本實施例中的第一種可能的實現方式中,在所述根據包含有所述加載函數的系統調用號的所述自定義加載函數將所述NTDLL.DLL加載至所述內存的指定位置之前,還包括:
[0080]獲取分配函數的系統調用號,所述分配函數用于為所述加載函數分配內存讀寫執行權限;
[0081 ] 將所述分配函數的系統調用號拷貝到所述自定義分配函數的代碼體內,所述自定義分配函數位于所述自定義代碼段中;
[0082]利用包含有所述分配函數的系統調用號的所述自定義分配函數為所述自定義加載函數分配內存讀寫執行權限。
[0083]在本實施例中的第二種可能的實現方式中,所述根據包含有所述加載函數的系統調用號的所述自定義加載函數將所述NTDLL.DLL加載至所述內存的指定位置之前,還包括:
[0084]將用于調用內核函數的公用代碼段拷貝到所述自定義代碼段中;
[0085]所述根據包含有所述加載函數的系統調用號的所述自定義加載函數將所述NTDLL.DLL加載至所述內存的指定位置,包括:
[0086]根據包含有所述加載函數的系統調用號的所述自定義加載函數以及所述自定義代碼段中的所述公用代碼段將所述NTDLL.DLL加載至所述內存的指定位置。
[0087]在本實施例中的第三種可能的實現方式中,在所述將用于調用內核函數的公用代碼段拷貝到所述自定義代碼段中之前,還包括:
[0088]遍歷內存中NTDLL的導出表,獲取指定的測試函數的起始地址;
[0089]根據所述測試函數的起始地址調用所述測試函數以獲取系統類型;
[0090]所述將用于調用內核函數的公用代碼段拷貝到所述自定義代碼段中,包括:
[0091]根據所述系統類型將用于調用與所述系統類型對應的內核函數的公用代碼段拷貝至所述自定義代碼段中。
[0092]在本實施例中的第四種可能的實現方式中,所述系統類型為64位W0W64模式、32位或64位,所述根據所述系統類型將用于調用與所述系統類型對應的內核函數的公用代碼段拷貝至所述自定義代碼段中,包括:[0093]當所述系統類型為64位W0W64模式時,將用于調用64位W0W64模式的內核函數的公用代碼段拷貝到所述自定義代碼段中的第一指定位置;
[0094]或者,
[0095]當所述系統類型為32位時,將用于調用32位的內核函數的公用代碼段拷貝到所述自定義代碼段中的第二指定位置;
[0096]或者,
[0097]當所述系統類型為64位時,將用于調用64位的內核函數的公用代碼段拷貝到所述自定義代碼段中的第三指定位置。
[0098]綜上所述,本發明實施例提供的Native API函數重構方法,通過根據包含有加載函數的系統調用號的自定義加載函數將NTDLL.DLL加載至內存的指定位置,位于自定義代碼段中的每個自定義加載函數中包含有對應的加載函數的代碼,利用位于指定位置的NTDLL.DLL中的Native API函數中的代碼分別重構自定義代碼段內與Native API函數對應的各個自定義Native API函數中的代碼;解決了現有技術中調用API函數的過程中容易被惡意程序預先處理,以使得應用程序存在較大的安全隱患的問題;將Native API函數進行重構,在應用程序運行時可以通過自定義代碼段直接調用重構后的自定義Native API函數,實現應用程序的相關功能,達到了可以避免應用程序被惡意程序處理,大大提高了應用程序安全性的效果。
[0099]請參見圖2,其示出了本發明另一個實施例中提供的Native API函數重構方法的方法流程圖。該Native API函數重構方法可以包括:
[0100]201,獲取加載函數的系統調用號,加載函數用于將動態鏈接庫NTDLL.DLL加載至內存,NTDLL.DLL中包含Native API函數;
[0101]由于本實施例是對Native API函數進行重構,因此需要模擬的加載函數將包含Native API函數的NTDLL.DLL加載至內存,以獲取安全的NTDLL.DLL。舉例來講,當應用程序被執行后,系統首先加載一個NTDLL.DLL至內存的固定位置,此時則可以獲取系統加載的NTDLL.DLL中的加載函數的系統調用號。
[0102]在一個可能的實現方式中,加載函數可以為ZwCreateFile, ZwCreateSection,ZwMapViewOfSection, ZwAllocateVirtualMemory, ZwFreeVirtualMemory 等,這些加載函數均是在將NTDLL.DLL加載至內存時需要用到的函數。
[0103]202,將每個加載函數的系統調用號分別拷貝至與加載函數對應的各個自定義加載函數的代碼體中,自定義加載函數位于用于執行應用程序的自定義代碼段中,自定義加載函數的代碼體中的初始代碼與加載函數中的代碼相同;
[0104]自定義代碼段是應用程序中自己定義的一段代碼,該自定義代碼段中初始定義了該應用程序所需要的自定義Native API函數,比如可以用于將NTDLL.DLL加載至內存的加載函數等,當然自定義Native API函數還可以包括其他函數,比如可以用于生成文檔的函數、可以用于加載其他動態數據鏈接庫的函數或可以用于實現拷貝功能的函數等。
[0105]自定義代碼段中已經設置了應用程序執行時需要用到的自定義NativeAPI函數,通常,自定義Native API函數的初始代碼都是獲取的與該自定義NativeAPI函數對應的Native API函數中的代碼。舉例來講,當應用程序需要用到NtQuerylnformationProcess這一 Native API函數時,自定義代碼段中會設置一個自定義NtQuerylnformationProcess 函數,該自定義 NtQuerylnformationProcess 函數中的初始代碼即為NtQuerylnformationProcess函數的代碼。
[0106]值得注意的是,由于自定義Native API函數是自己定義的,因此這些函數在初始時是沒有系統調用號的。由于需要模擬的加載函數對NTDLL.DLL進行加載,因此需要將每個加載函數的系統調用號分別拷貝至與加載函數對應的各個自定義加載函數的代碼體中,以便使用這些自定義加載函數。
[0107]203,獲取分配函數的系統調用號,分配函數用于為加載函數分配內存讀寫執行權限;
[0108]舉例來講,當應用程序被執行后,系統首先加載一個NTDLL.DLL至內存的固定位置,此時則可以獲取系統加載的NTDLL.DLL中的分配函數的系統調用號。
[0109]通常來講,如果加載函數想要對NTDLL.DLL進行加載,這些加載函數首先需要具備內存讀寫執行權限,為這些加載函數分配內存讀寫執行權限的函數即為分配函數。而模擬的自定義加載函數在初始時是沒有加載權限的,因此,需要為這些自定義加載函數分配內存讀寫執行權限,即通過分配函數為這些自定義加載函數分配內存讀寫執行權限。在實際應用中,可以通過分配函數ZwProtectVirtualMemory為自定義加載函數分配內存讀寫執行權限。
[0110]204,將分配函數的系統調用號拷貝到自定義分配函數的代碼體內,自定義分配函數位于自定義代碼段中;
[0111]由于分配函數也可以被惡意程序Hook,因此這里也需要在自定義代碼段中模擬一個分配函數,即自定義分配函數。很顯然,這個自定義分配函數在初始時也是沒有系統調用號的,因此首先需要獲取分配函數的系統調用號。
[0112]在獲取到分配函數的系統調用號之后,將分配函數的系統調用號拷貝至自定義分配函數的代碼體內,以模擬出可用于為自定義加載函數分配內存讀寫權限的自定義分配函數。
[0113]205,利用包含有分配函數的系統調用號的自定義分配函數為自定義加載函數分配內存讀寫執行權限;
[0114]當為自定義分配函數拷貝過分配函數的系統調用號之后,即該自定義分函數模擬成功,此時可以通過該自定義分配函數為自定義加載函數分配內存讀寫執行權限。
[0115]206,將用于調用內核函數的公用代碼段拷貝到自定義代碼段中;
[0116]公用代碼段是指所有Native API函數調用內核函數時均需要使用的代碼段。
[0117]在一個可能的實現方式中,可以首先通過遍歷peb,獲取NTDLL的指針ModuleBase,即用來模擬GetMoudleHandle ( “NTDLL”);然后遍歷內存中NTDLL.DLL的導出表,對該導出表進行遍歷以獲取指定的測試函數的起始地址,即用來模擬GetProcAddress ;然后根據測試函數的起始地址調用測試函數以獲取系統類型。
[0118]舉例來講,這里的測試函數可以為ZwTestAlert,在調用測試函數ZwTestAlert獲取系統的類型時,由于ZwTestAlert測試函數通常沒人使用,也就不會被惡意程序Hook到,且該函數在使用時不需要系統調用號,因此可以直接根據獲取到的測試函數ZwTestAlert來獲取系統類型。當然,在實際應用中,也可以通過其他類似的函數獲取系統類型。
[0119]通常來講,系統類型可以為64位W0W64模式、32位或64位。一般的,Native API函數都會通過一段公用的代碼段來調用內核函數,這段代碼段可以稱之為公用代碼段。當系統類型不同時,調用內核函數的公用代碼段也會不同,也就是說,64位的系統、32位的系統和64位W0W64模式的系統中調用內核函數的公用代碼段是不同的。因此,為了避免這段公用代碼段被惡意程序Hook到,可以根據系統類型將用于調用與系統類型對應的內核函數的公用代碼段拷貝至自定義代碼段中,以便于后續的Native API使用這段公用代碼段。
[0120]為了使得自定義代碼段可以共享在不同的類型的系統中,可以在該自定義代碼段中設置三個位置,這三個位置可以分別用于存放在64位系統W0W64模式中需要調用內核函數的公用代碼段、在32位系統中需要調用內核函數的公用代碼段和在64位系統中需要調用內核函數的公用代碼段。舉例來講,當系統類型為64位W0W64模式時,將用于調用64位W0W64模式的內核函數的公用代碼段拷貝到自定義代碼段中的第一指定位置;當系統類型為32位時,將用于調用32位的內核函數的公用代碼段拷貝到自定義代碼段中的第二指定位置;當系統類型為64位時,將用于調用64位的內核函數的公用代碼段拷貝到自定義代碼段中的第三指定位置。這里所講的第一指定位置、第二指定位置和第三指定位置即為自定義代碼段中為不同的公用代碼段指定的三個不同的位置空間。
[0121]207,根據包含有加載函數的系統調用號的自定義加載函數以及自定義代碼段中的公用代碼段將NTDLL.DLL加載至內存的指定位置;
[0122]通常,加載函數在將NTDLL.DLL加載至內存時,需要使用到調用內核函數的公用代碼段,因此需要模擬好的自定義加載函數以及拷貝至自定義代碼段中的公用代碼段將NTDLL.DLL加載至內存的指定位置。這個指定位置可以是根據實際情況自由設置,這樣也就避免了惡意程序Hook到這個內存中的NTDLL.DLL。
[0123]由此可知,通過模擬的安全的自定義加載函數以及安全的公用代碼段實現了將NTDLL.DLL加載至內存的指定位置,這樣NTDLL.DLL中的Native API函數就是安全的了。
[0124]208,利用位于內存的指定位置的NTDLL.DLL中的Native API函數中的代碼分別重構自定義代碼段內與Native API函數對應的各個自定義Native API函數中的代碼。
[0125]由于應用程序中所需要的Native API函數可能并不是NTDLL.DLL中所有的Native API函數,因此,只需要將應用程序需要用到的Native API函數重構即可。
[0126]舉例來講,當應用程序需要η個Native API函數時,首先在自定義代碼段中自定義η個自定義Native API函數,通常來講,這些自定義Native API函數的初始代碼都是通過系統調用得到的Native API函數的代碼,這些代碼可能是不安全的,因此需要對這些自定義Native API函數中的代碼進行重構。此時由于位于內存的指定位置的NTDLL.DLL中的Native API函數中的代碼都是安全的,因此可以對應將與這η個自定義Native API函數對應的Native API函數中的代碼拷貝出來,然后將每個Native API函數中的代碼分別覆蓋對應的自定義Native API函數中的代碼,進而完成對該Native API函數進行的重構。
[0127]需要說明的是,當應用程序開始執行時,首先系統加載NTDLL.DLL至內存的固定位置后,然后可以獲取該固定位置處NTDLL.DLL中的加載函數的系統調用號、分配函數的系統調用號以及其他需要的Native API函數的系統調用號,將每一個Native API函數的系統調用號分別拷貝至自定義代碼段中的對應的自定義加載函數中;隨后通過模擬的自定義分配函數為自定義加載函數分配內存讀寫訪問權限;最后通過模擬的自定義加載函數加載NTDLL.DLL至內存的指定位置。固定位置處的NTDLL.DLL的內容容易被Hook到,而自己加載的指定位置處的NTDLL.DLL則不容易被Hook到。
[0128]還需要說明的是,上述實施例中僅示意性描述了加載NTDLL.DLL時用到的幾個Native API函數,當然,在實際應用中,應用程序可能還需要其他的Native API加載其他需要的動態鏈接庫,因此還可能需要其他的Native API函數,比如LdrLoadDll函數、LdrUnLoadDll 函數等。
[0129]綜上所述,本發明實施例提供的Native API函數重構方法,通過根據包含有加載函數的系統調用號的自定義加載函數將NTDLL.DLL加載至內存的指定位置,位于自定義代碼段中的每個自定義加載函數中包含有對應的加載函數的代碼,利用位于指定位置的NTDLL.DLL中的Native API函數中的代碼分別重構自定義代碼段內與Native API函數對應的各個自定義Native API函數中的代碼;解決了現有技術中調用API函數的過程中容易被惡意程序預先處理,以使得應用程序存在較大的安全隱患的問題;將Native API函數進行重構,在應用程序運行時可以通過自定義代碼段直接調用重構后的自定義Native API函數,實現應用程序的相關功能,達到了可以避免應用程序被惡意程序處理,大大提高了應用程序安全性的效果。
[0130]請參見圖3所示,其示出了本發明一個實施例中提供的Native API函數重構裝置。該Native API函數重構裝置可以包括但不限于:第一獲取模塊301、第一拷貝模塊302、加載模塊303和重構模塊304。
[0131]第一獲取模塊301,可以用于獲取加載函數的系統調用號,加載函數用于將動態鏈接庫NTDLL.DLL加載至內存,NTDLL.DLL中包含Native API函數;
[0132]第一拷貝模塊302,可以用于將每個加載函數的系統調用號分別拷貝至與加載函數對應的各個自定義加載函數的代碼體中,自定義加載函數位于用于執行應用程序的自定義代碼段中,自定義加載函數的代碼體中的初始代碼與加載函數中的代碼相同;
[0133]加載模塊303,可以用于根據包含有加載函數的系統調用號的自定義加載函數將NTDLL.DLL加載至內存的指定位置;
[0134]重構模塊304,可以用于利用位于指定位置的NTDLL.DLL中的Native API函數中的代碼分別重構自定義代碼段內與Native API函數對應的各個自定義Native API函數中的代碼。
[0135]綜上所述,本發明實施例提供的Native API函數重構裝置,通過根據包含有加載函數的系統調用號的自定義加載函數將NTDLL.DLL加載至內存的指定位置,位于自定義代碼段中的每個自定義加載函數中包含有對應的加載函數的代碼,利用位于指定位置的NTDLL.DLL中的Native API函數中的代碼分別重構自定義代碼段內與Native API函數對應的各個自定義Native API函數中的代碼;解決了現有技術中調用API函數的過程中容易被惡意程序預先處理,以使得應用程序存在較大的安全隱患的問題;將Native API函數進行重構,在應用程序運行時可以通過自定義代碼段直接調用重構后的自定義Native API函數,實現應用程序的相關功能,達到了可以避免應用程序被惡意程序處理,大大提高了應用程序安全性的效果。
[0136]請參見圖4所示,其示出了本發明另一個實施例中提供的Native API函數重構裝置。該Native API函數重構裝置可以包括但不限于:第一獲取模塊401、第一拷貝模塊402、加載模塊403和重構模塊404。[0137]第一獲取模塊401,可以用于獲取加載函數的系統調用號,加載函數用于將動態鏈接庫NTDLL.DLL加載至內存,NTDLL.DLL中包含Native API函數;
[0138]第一拷貝模塊402,可以用于將每個加載函數的系統調用號分別拷貝至與加載函數對應的各個自定義加載函數的代碼體中,自定義加載函數位于用于執行應用程序的自定義代碼段中,自定義加載函數的代碼體中的初始代碼與加載函數中的代碼相同;
[0139]加載模塊403,可以用于根據包含有加載函數的系統調用號的自定義加載函數將NTDLL.DLL加載至內存的指定位置;
[0140]重構模塊404,可以用于利用位于指定位置的NTDLL.DLL中的Native API函數中的代碼分別重構自定義代碼段內與Native API函數對應的各個自定義Native API函數中的代碼。
[0141]在本實施例的第一種可能的實現方式中,該Native API函數重構裝置還可以包括:第二獲取模塊405、第二拷貝模塊406和分配模塊407。
[0142]第二獲取模塊405,可以用于獲取分配函數的系統調用號,分配函數用于為加載函數分配內存讀寫執行權限;
[0143]第二拷貝模塊406,可以用于將分配函數的系統調用號拷貝到自定義分配函數的代碼體內,自定義分配函數位于自定義代碼段中;
[0144]分配模塊407,可以用于利用包含有分配函數的系統調用號的自定義分配函數為加載函數分配內存讀寫執行權限。
[0145]在本實施例的第二種可能的實現方式中,該Native API函數重構裝置還可以包括:代碼段拷貝模塊408。
[0146]代碼段拷貝模塊408,可以用于將用于調用內核函數的公用代碼段拷貝到自定義代碼段中;
[0147]加載模塊403,還可以用于:
[0148]根據包含有加載函數的系統調用號的自定義加載函數以及自定義代碼段中的公用代碼段將NTDLL.DLL加載至內存的指定位置。
[0149]在本實施例的第三種可能的實現方式中,該Native API函數重構裝置還可以包括:遍歷模塊409和類型獲取模塊410。
[0150]遍歷模塊409,可以遍歷NTDLL.DLL的導出表,獲取指定的測試函數的起始地址;
[0151]類型獲取模塊410,可以用于根據測試函數的起始地址調用測試函數以獲取系統類型;
[0152]代碼段拷貝模塊408,還可以用于根據系統類型將用于調用與系統類型對應的內核函數的公用代碼段拷貝至自定義代碼段中。
[0153]在本實施例的第四種可能的實現方式中,系統類型為64位W0W64模式、32位或64位,代碼段拷貝模塊408可以包括:第一拷貝單元408a、第二拷貝單元408b和第三拷貝單元 408c。
[0154]第一拷貝單元408a,可以用于當系統類型為64位W0W64模式時,將用于調用64位W0W64模式的內核函數的公用代碼段拷貝到自定義代碼段中的第一指定位置;
[0155]第二拷貝單元408b,可以用于當系統類型為32位時,將用于調用32位的內核函數的公用代碼段拷貝到自定義代碼段中的第二指定位置;[0156]第三拷貝單元408c,可以用于當系統類型為64位時,將用于調用64位的內核函數的公用代碼段拷貝到自定義代碼段中的第三指定位置。
[0157]綜上所述,本發明實施例提供的Native API函數重構裝置,通過根據包含有加載函數的系統調用號的自定義加載函數將NTDLL.DLL加載至內存的指定位置,位于自定義代碼段中的每個自定義加載函數中包含有對應的加載函數的代碼,利用位于指定位置的NTDLL.DLL中的Native API函數中的代碼分別重構自定義代碼段內與Native API函數對應的各個自定義Native API函數中的代碼;解決了現有技術中調用API函數的過程中容易被惡意程序預先處理,以使得應用程序存在較大的安全隱患的問題;將Native API函數進行重構,在應用程序運行時可以通過自定義代碼段直接調用重構后的自定義Native API函數,實現應用程序的相關功能,達到了可以避免應用程序被惡意程序處理,大大提高了應用程序安全性的效果。
[0158]需要說明的是:上述實施例提供的Native API函數重構裝置在Native API函數重構時,僅以上述各功能模塊的劃分進行舉例說明,實際應用中,可以根據需要而將上述功能分配由不同的功能模塊完成,即將設備的內部結構劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。另外,上述實施例提供的Native API函數重構裝置與NativeAPI函數重構方法實施例屬于同一構思,其具體實現過程詳見方法實施例,這里不再贅述。
[0159]上述本發明實施例序號僅僅為了描述,不代表實施例的優劣。
[0160]本領域普通技術人員可以理解實現上述實施例的全部或部分步驟可以通過硬件來完成,也可以通過程序來指令相關的硬件完成,所述的程序可以存儲于一種計算機可讀存儲介質中,上述提到的存儲介質可以是只讀存儲器,磁盤或光盤等。
[0161]以上所述僅為本發明的較佳實施例,并不用以限制本發明,凡在本發明的精神和原則之內,所作的任何修改、等同替換、改進等,均應包含在本發明的保護范圍之內。
【權利要求】
1.一種Native API函數重構方法,其特征在于,所述方法,包括: 獲取加載函數的系統調用號,所述加載函數用于將動態鏈接庫NTDLL.DLL加載至內存,所述NTDLL.DLL中包含Native API函數; 將每個所述加載函數的系統調用號分別拷貝至與所述加載函數對應的各個自定義加載函數的代碼體中,所述自定義加載函數位于用于執行應用程序的自定義代碼段中,所述自定義加載函數的代碼體中的初始代碼與所述加載函數中的代碼相同; 根據包含有所述加載函數的系統調用號的所述自定義加載函數將所述NTDLL.DLL加載至所述內存的指定位置; 利用位于所述指定位置的NTDLL.DLL中的Native API函數中的代碼分別重構所述自定義代碼段內與所述Native API函數對應的各個自定義Native API函數中的代碼。
2.根據權利要求1所述的方法,其特征在于,在所述根據包含有所述加載函數的系統調用號的所述自定義加載函數將所述NTDLL.DLL加載至所述內存的指定位置之前,還包括: 獲取分配函數的系統調用號,所述分配函數用于為所述加載函數分配內存讀寫執行權限; 將所述分配函數的系統調用號拷貝到所述自定義分配函數的代碼體內,所述自定義分配函數位于所述自定義代 碼段中; 利用包含有所述分配函數的系統調用號的所述自定義分配函數為所述自定義加載函數分配內存讀寫執行權限。
3.根據權利要求2所述的方法,其特征在于,所述根據包含有所述加載函數的系統調用號的所述自定義加載函數將所述NTDLL.DLL加載至所述內存的指定位置之前,還包括: 將用于調用內核函數的公用代碼段拷貝到所述自定義代碼段中; 所述根據包含有所述加載函數的系統調用號的所述自定義加載函數將所述NTDLL.DLL加載至所述內存的指定位置,包括: 根據包含有所述加載函數的系統調用號的所述自定義加載函數以及所述自定義代碼段中的所述公用代碼段將所述NTDLL.DLL加載至所述內存的指定位置。
4.根據權利要求3所述的方法,其特征在于,在所述將用于調用內核函數的公用代碼段拷貝到所述自定義代碼段中之前,還包括: 遍歷內存中NTDLL的導出表,獲取指定的測試函數的起始地址; 根據所述測試函數的起始地址調用所述測試函數以獲取系統類型; 所述將用于調用內核函數的公用代碼段拷貝到所述自定義代碼段中,包括: 根據所述系統類型將用于調用與所述系統類型對應的內核函數的公用代碼段拷貝至所述自定義代碼段中。
5.根據權利要求4所述的方法,其特征在于,所述系統類型為64位W0W64模式、32位或64位,所述根據所述系統類型將用于調用與所述系統類型對應的內核函數的公用代碼段拷貝至所述自定義代碼段中,包括: 當所述系統類型為64位W0W64模式時,將用于調用64位W0W64模式的內核函數的公用代碼段拷貝到所述自定義代碼段中的第一指定位置; 或者,當所述系統類型為32位時,將用于調用32位的內核函數的公用代碼段拷貝到所述自定義代碼段中的第二指定位置; 或者, 當所述系統類型為64位時,將用于調用64位的內核函數的公用代碼段拷貝到所述自定義代碼段中的第三指定位置。
6.一種Native API函數重構裝置,其特征在于,所述裝置,包括: 第一獲取模塊,用于獲取加載函數的系統調用號,所述加載函數用于將動態鏈接庫NTDLL.DLL加載至內存,所述NTDLL.DLL中包含Native API函數;第一拷貝模塊,用于將每個所述加載函數的系統調用號分別拷貝至與所述加載函數對應的各個自定義加載函數的代碼體中,所述自定義加載函數位于用于執行應用程序的自定義代碼段中,所述自定義加載函數的代碼體中的初始代碼與所述加載函數中的代碼相同;加載模塊,用于根據包含有所述加載函數的系統調用號的所述自定義加載函數將所述NTDLL.DLL加載至所述內存的指定位置; 重構模塊,用于利用位于所述指定位置的NTDLL.DLL中的Native API函數中的代碼分別重構所述自定義代碼段內與所述Native API函數對應的各個自定義Native API函數中的代碼。
7.根據權利要求6所述的裝置,其特征在于,所述裝置,還包括: 第二獲取模塊,用于獲取分配函數的系統調用號,所述分配函數用于為所述加載函數分配內存讀寫執行權限; 第二拷貝模塊,用于將所述分配函數的系統調用號拷貝到所述自定義分配函數的代碼體內,所述自定義分配函數位于所述自定義代碼段中; 分配模塊,用于利用包含有所述分配函數的系統調用號的所述自定義分配函數為所述自定義加載函數分配內存讀寫執行權限。
8.根據權利要求7所述的裝置,其特征在于,所述裝置,還包括: 代碼段拷貝模塊,用于將用于調用內核函數的公用代碼段拷貝到所述自定義代碼段中; 所述加載模塊,還用于: 根據包含有所述加載函數的系統調用號的所述自定義加載函數以及所述自定義代碼段中的所述公用代碼段將所述NTDLL.DLL加載至所述內存的指定位置。
9.根據權利要求8所述的裝置,其特征在于,所述裝置,還包括: 遍歷模塊,遍歷內存中NTDLL的導出表,獲取指定的測試函數的起始地址; 類型獲取模塊,用于根據所述測試函數的起始地址調用所述測試函數以獲取系統類型; 所述代碼段拷貝模塊,用于: 根據所述系統類型將用于調用與所述系統類型對應的內核函數的公用代碼段拷貝至所述自定義代碼段中。
10.根據權利要求9所述的裝置,其特征在于,所述系統類型為64位W0W64模式、32位或64位,所述代碼段拷貝模塊,包括: 第一拷貝單兀,用于當所述系統類型為64位W0W64模式時,將用于調用64位W0W64模式的內核函數的公用代碼段拷貝到所述自定義代碼段中的第一指定位置; 或者, 第二拷貝單元,用于當所述系統類型為32位時,將用于調用32位的內核函數的公用代碼段拷貝到所述自定義代碼段中的第二指定位置; 或者, 第三拷貝單元,用于當所述系統類型為64位時,將用于調用64位的內核函數的公用代碼段拷貝到所述自定義代碼段中的第三指定位置。
【文檔編號】G06F21/51GK103530552SQ201310455970
【公開日】2014年1月22日 申請日期:2013年9月29日 優先權日:2013年9月29日
【發明者】馮世杰 申請人:廣州華多網絡科技有限公司