一種加固apk的方法和裝置以及apk加固客戶端和服務器的制造方法
【專利摘要】本發明公開了一種加固APK的方法和裝置以及APK加固客戶端和服務器,該方法包括:獲取待加固APK中的至少一個方法對應的Java代碼;將所述至少一個方法對應的Java代碼分別轉換成相應的反射調用的Native C代碼。本發明提供的技術方案通過將APK中的Java代碼轉換成反射調用的Native C代碼,實現了將Java的方法調用轉化為對等語法的Native C的方法調用,當一個方法被調用時,實現調用的代碼是Native C代碼而不是原始的Java代碼。與Java代碼相比,逆向Native C代碼的成本很高,且Native C代碼的保護方式很多,大大降低了APK被反匯編分析,進而重打包再次分發的可能性,提高APK的安全等級。
【專利說明】一種加固APK的方法和裝置以及APK加固客戶端和服務器
【技術領域】
[0001]本發明涉及信息安全領域,具體涉及一種加固APK的方法和裝置以及APK加固客戶端和服務器。
【背景技術】
[0002]安卓系統的快速發展以及設備的高速增長,產生了大量的第三方應用程序,與其他操作系統相比,安卓系統的開源性為應用開發者提供了更多的功能接口,這些功能接口在提高了系統的可擴展性的同時也為惡意軟件提供了便利,非法拷貝、逆向工程、反編譯、調試、破解、二次打包、內存截取等手段不斷威脅著安卓系統的安全,不僅危害了使用者,也給正常應用開發者造成嚴重的損害。
[0003]現有的安卓軟件安裝包的加固方案主要分為三種:第一種是對待保護方法的Java代碼進行完整的加密;第二種是運行時對待保護方法的Java代碼做字節碼變形,防止直接還原出完整的Java代碼,現有方式不能很好的自定義,該方案需要做字節碼變形的函數;第三種是將前兩種方案混合使用。但由于上述方案在APK運行的某一時間內內存中存在完整的Java代碼的映像,受保護的方法的Java代碼可以通過內存Dump的方式被完整的還原出來,導致現有方案始終無法完全解決安卓安裝包面臨的安全問題,人們也一直在尋求更有效的解決方案。
【發明內容】
[0004]鑒于上述問題,提出了本發明以便提供一種克服上述問題或者至少部分地解決上述問題的一種加固APK的方法和裝置以及APK加固客戶端和服務器。
[0005]依據本發明的一個方面,提供了一種加固APK的方法,該方法包括:
[0006]獲取待加固APK中的至少一個方法對應的Java代碼;
[0007]將所述至少一個方法對應的Java代碼分別轉換成相應的反射調用的Native C代碼。
[0008]可選地,所述獲取待加固APK中的至少一個方法對應的Java代碼包括:
[0009]對所述待加固APK進行反編譯獲取其中的至少一個方法對應的Java代碼。
[0010]可選地,將所述至少一個方法對應的Java代碼分別轉換成相應的反射調用的Native C代碼包括:
[0011]對一個方法對應的Java代碼進行語義解析,根據語義解析結果構造反射調用的Native C代碼,再對Native C代碼進行編譯。
[0012]可選地,所述對一個方法對應的Java代碼進行語義解析,根據語義解析結果構造反射調用的Native C代碼包括:
[0013]將該方法對應的Java代碼編譯成smali代碼,將smali代碼反編譯成一種中間語言,再將所述中間語言轉換成Native C代碼。
[0014]可選地,所述中間語言是一種由三元組指令構成的指令集,一個三元組指令包括:源地址、操作的目標地址和操作的類型。
[0015]可選地,該方法進一步包括:
[0016]對所述APK中的轉換后的Native C代碼進行加密處理。
[0017]可選地,該方法進一步包括:
[0018]獲取待加固APK中的ELF文件,進行反編譯;
[0019]根據加密開始標記和加密結束標記,從所述反編譯的ELF文件中提取出待保護的一段或多段代碼,并對每個提取位置設置一個鉤子函數;其中每段待保護的代碼的起始位置和結束位置分別有加密開始標記和加密結束標記;
[0020]將提取出的一段或多段代碼進行加密處理后,放入指定文件中;
[0021]將所述指定文件添加到所述反編譯的APK中,編譯生成加固APK ;
[0022]其中,在所述加固APK運行的過程中,通過設置的鉤子函數獲知到需要運行被保護的一段代碼時,從所述指定文件中解密出該段代碼,并在該段代碼運行完畢時,重新對該段代碼進行加密。
[0023]可選地,所述將提取出的一段或多段代碼進行加密處理包括:
[0024]對提取出的一端或多段代碼進行VM虛擬化;或/和,對提取出的一端或多段代碼進行分段加密;或/和,對提取出的一端或多段代碼進行代碼混淆;或/和,對提取出的一端或多段代碼進行反調試處理。
[0025]可選地,所述將提取出的一段或多段代碼進行加密處理后,放入指定文件中包括:
[0026]將提取出的一段或多段代碼進行加密處理后,放入SO文件的尾部。
[0027]可選地,上述方法由位于終端側的客戶端執行;
[0028]或者,由位于終端側的客戶端獲取待加固的APK上傳到服務器,由服務器執行上述方法。
[0029]依據本發明的另一個方面,提供了一種加固APK的裝置,該裝置包括:
[0030]獲取單元,適于獲取待加固APK中的至少一個方法對應的Java代碼;
[0031]轉換單元,適于將所述至少一個方法對應的Java代碼分別轉換成相應的反射調用的Native C代碼。
[0032]可選地,所述獲取單元,適于對所述待加固APK進行反編譯獲取其中的至少一個方法對應的Java代碼。
[0033]可選地,所述轉換單元,適于對一個方法對應的Java代碼進行語義解析,根據語義解析結果構造反射調用的Native C代碼,再對Native C代碼進行編譯。
[0034]可選地,所述轉換單元,適于將該方法對應的Java代碼編譯成smali代碼,將smali代碼反編譯成一種中間語言,再將所述中間語言轉換成Native C代碼。
[0035]可選地,所述轉換單元所采用的所述中間語言是一種由三元組指令構成的指令集,一個三元組指令包括:源地址、操作的目標地址和操作的類型。
[0036]可選地,該裝置進一步包括:
[0037]加密單元,適于對所述APK中的轉換后的Native C代碼進行加密處理。
[0038]可選地,該裝置進一步包括:添加編譯單元;
[0039]所述獲取單元,進一步適于獲取待加固APK中的ELF文件,進行反編譯;并適于根據加密開始標記和加密結束標記,從所述反編譯的ELF文件中提取出待保護的一段或多段代碼,并對每個提取位置設置一個鉤子函數;其中每段待保護的代碼的起始位置和結束位置分別有加密開始標記和加密結束標記;
[0040]所述加密單元,進一步適于將提取出的一段或多段代碼進行加密處理后,放入指定文件中;
[0041]所述添加編譯單元,適于將所述指定文件添加到所述反編譯的APK中,編譯生成加固APK ;
[0042]其中,所述加固APK在運行的過程中,通過設置的鉤子函數獲知到需要運行被保護的一段代碼時,從所述指定文件中解密出該段代碼,并在該段代碼運行完畢時,重新對該段代碼進行加密。
[0043]可選地,所述加密單元,適于對提取出的一端或多段代碼進行VM虛擬化;或/和,適于對提取出的一端或多段代碼進行分段加密;或/和,適于對提取出的一端或多段代碼進行代碼混淆;或/和,適于對提取出的一端或多段代碼進行反調試處理。
[0044]可選地,所述加密單元,適于將提取出的一段或多段代碼進行加密處理后,放入SO文件的尾部
[0045]依據本發明的又一個方面,提供了一種APK加固客戶端,該客戶端包括如上任一項所述的加固APK的裝置。
[0046]依據本發明的再一個方面,提供了一種APK加固服務器,該服務器包括如上任一項所述的加固APK的裝置。
[0047]由上述可知,本發明提供的技術方案通過將APK中的Java代碼轉換成反射調用的Native C代碼,實現了將Java的方法調用轉化為對等語法的Native C的方法調用,當一個方法被調用時,實現調用的代碼是Native C代碼而不是原始的Java代碼。與Java代碼相比,在任何時間點不存在自身還原的過程,并且逆向Native C代碼的成本很高,且Native C代碼的保護方式很多,大大降低了 APK被反匯編分析,進而重打包再次分發的可能性,提高APK的安全等級。
[0048]上述說明僅是本發明技術方案的概述,為了能夠更清楚了解本發明的技術手段,而可依照說明書的內容予以實施,并且為了讓本發明的上述和其它目的、特征和優點能夠更明顯易懂,以下特舉本發明的【具體實施方式】。
【專利附圖】
【附圖說明】
[0049]通過閱讀下文優選實施方式的詳細描述,各種其他的優點和益處對于本領域普通技術人員將變得清楚明了。附圖僅用于示出優選實施方式的目的,而并不認為是對本發明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:
[0050]圖1示出了根據本發明一個實施例的一種加固APK的方法的流程圖;
[0051]圖2示出了根據本發明另一個實施例的一種加固APK的方法的流程圖;
[0052]圖3示出了根據本發明一個實施例的一種加固APK的裝置的示意圖;
[0053]圖4示出了根據本發明另一個實施例的一種加固APK的裝置的示意圖;
[0054]圖5示出了根據本發明又一個實施例的一種加固APK的裝置的示意圖
[0055]圖6不出了根據本發明一個實施例的一種APK加固客戶端的不意圖;
[0056]圖7示出了根據本發明一個實施例的一種APK加固服務器的示意圖。
【具體實施方式】
[0057]下面將參照附圖更詳細地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應當理解,可以以各種形式實現本公開而不應被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠將本公開的范圍完整的傳達給本領域的技術人員。
[0058]圖1示出了根據本發明一個實施例的一種加固APK的方法的流程圖。如圖1所示,該方法包括:
[0059]步驟S110,獲取待加固APK中的至少一個方法對應的Java代碼。
[0060]步驟S120,將至少一個方法對應的Java代碼分別轉換成相應的反射調用的Native C 代碼。
[0061]可見,圖1所示的方法通過將APK中的Java代碼轉換成反射調用的Native C代碼,實現了將Java的方法調用轉化為對等語法的Native C的方法調用,當一個方法被調用時,實現調用的代碼是Native C代碼而不是原始的Java代碼。與Java代碼相比,在任何時間點不存在自身還原的過程,并且逆向Native C代碼的成本很高,且Native C代碼的保護方式很多,大大降低了 APK被反匯編分析,進而重打包再次分發的可能性,提高APK的安全等級。
[0062]在本發明的一個實施例中,圖1所示方法的步驟SllO獲取待加固APK中的至少一個方法對應的Java代碼包括:對待加固APK進行反編譯獲取其中的至少一個方法對應的Java代碼。
[0063]在本發明的一個實施例中,圖1所示方法的步驟S120將至少一個方法對應的Java代碼分別轉換成相應的反射調用的Native C代碼包括:對一個方法對應的Java代碼進行語義解析,根據語義解析結果構造反射調用的Native C代碼,再對Native C代碼進行編譯。該過程實現了 Java調用的方法和Native C調用的方法的對等轉化,保證被加固后APK執行功能的有效性。
[0064]在一個具體實施例中,對一個方法對應的Java代碼進行語義解析,根據語義解析結果構造反射調用的Native C代碼具體可以是:將該方法對應的Java代碼編譯成smali代碼,將smali代碼反編譯成一種中間語言,再將所述中間語言轉換成Native C代碼。其中,中間語言可以是一種由三元組指令構成的指令集,一個三元組指令包括:源地址、操作的目標地址和操作的類型。
[0065]在將方法對應的Java代碼轉換成相應的反射調用的Native C代碼之后,為了進一步提高安全等級,在本發明的一個實施例中,圖1所示的方法進一步包括:對APK中的轉換后的Native C代碼進行加密處理。相比于Java代碼,Native C代碼的加密方式多種多樣,進一步提高了反匯編的難度。
[0066]在本發明的一些實施例中,上述方法由位于終端側的客戶端執行;或者,在本發明的另一些實施例中,由位于終端側的客戶端獲取待加固的APK上傳到服務器,由服務器執行上述方法。這樣,開發者既可以在客戶端加固APK,也可以在服務器端加固APK,具有相當的靈活性。
[0067]圖2示出了根據本發明另一個實施例的一種加固APK的方法的流程圖。如圖2所示,該方法包括:
[0068]步驟S210,獲取待加固APK中的ELF文件,進行反編譯。
[0069]本步驟中,ELF文件是Android系統上的可執行文件格式,也包括.so或.ο類文件。
[0070]步驟S220,根據加密開始標記和加密結束標記,從反編譯的ELF文件中提取出待保護的一段或多段代碼,并對每個提取位置設置一個鉤子函數。
[0071]本步驟中,每段待保護的代碼的起始位置和結束位置分別有加密開始標記和加密結束標記,該標記用于將任何信息或元數據與程序元素進行關聯,其本身不會對源代碼執行產生任何影響。
[0072]步驟S230,將提取出的一段或多段代碼進行加密處理后,放入指定文件中。
[0073]步驟S240,將指定文件添加到所述反編譯的APK中,編譯生成加固ΑΡΚ。
[0074]經過上述過程得到的加固APK的運行過程如下:在運行的過程中,通過設置的鉤子函數獲知到需要運行被保護的一段代碼時,從指定文件中解密出該段代碼,并在該段代碼運行完畢時,重新對該段代碼進行加密。實現對待保護代碼的動態加解密,使得內存中任意時刻都不存在完整的原始代碼的映像,從而防止APK被逆向還原。
[0075]在本發明的一個實施例中,圖2所示方法的步驟S230將提取出的一段或多段代碼進行加密處理包括:對提取出的一端或多段代碼進行VM虛擬化;或/和,對提取出的一端或多段代碼進行分段加密;或/和,對提取出的一端或多段代碼進行代碼混淆;或/和,對提取出的一端或多段代碼進行反調試處理。其中,VM虛擬化是指將原始指令虛擬化,轉換成第三方的虛擬機的指令,在APK被逆向時,得到的逆向結果是該虛擬化指令而不是原始指令。
[0076]在本發明的一個實施例中,圖2所示方法的步驟S230在將提取出的一段或多段代碼進行加密處理后,放入SO文件的尾部。
[0077]圖2所述的方法使得APK開發者可以利用加密開始標記和加密結束標記來標記需要進行的一段或多段代碼。提供加密的服務者可根據加密開始標記和加密結束標記來對相應段的代碼進行加密處理。并且圖2所示的方法將一段或多段代碼提取出并加密后放在指定文件中,待需要運行該段代碼是才進行解密,并在該段代碼運行完畢后再重新進行加密,使得任何時刻在內存中都不存在該APK的完整dump,使得破解者無法得到完整的dump。
[0078]圖3示出了根據本發明一個實施例的一種加固APK的裝置的示意圖。如圖3所示,該加固APK的裝置300包括:
[0079]獲取單元310,適于獲取待加固APK中的至少一個方法對應的Java代碼;
[0080]轉換單元320,適于將至少一個方法對應的Java代碼分別轉換成相應的反射調用的Native C代碼。
[0081]可見,圖3所示的裝置通過各單元的相互配合,將APK中的Java代碼轉換成反射調用的Native C代碼,實現了將Java的方法調用轉化為對等語法的Native C的方法調用,當一個方法被調用時,實現調用的代碼是Native C代碼而不是原始的Java代碼。與Java代碼相比,逆向Native C代碼的成本很高,且Native C代碼的保護方式很多,大大降低了APK被反匯編分析,進而重打包再次分發的可能性,提高APK的安全等級。
[0082]在本發明的一個實施例中,圖3所示裝置的獲取單元310,適于對待加固APK進行反編譯獲取其中的至少一個方法對應的Java代碼。
[0083]在本發明的一個實施例中,圖3所示裝置的轉換單元320,適于對一個方法對應的Java代碼進行語義解析,根據語義解析結果構造反射調用的Native C代碼,再對Native C代碼進行編譯。轉換單元320在該過程實現了 Java調用的方法和Native C調用的方法的對等轉化,保證被加固后APK執行功能的有效性。
[0084]在一個具體實施例中,對一個方法對應的Java代碼進行語義解析,根據語義解析結果構造反射調用的Native C代碼的過程具體是:轉換單元320,適于將該方法對應的Java代碼編譯成smali代碼,將smali代碼反編譯成一種中間語言,在將所述中間語言轉換成Native C代碼。其中,中間語言是一種由三元組指令構成的指令集,一個三元組指令包括:源地址、操作的目標地址和操作的類型。
[0085]圖4示出了根據本發明另一個實施例的一種加固APK的裝置的示意圖。如圖4所示,該加固APK的裝置400包括:獲取單元410、轉換單元420和加密單元430。
[0086]其中,獲取單元410、轉換單元420分別與圖3所示裝置的獲取單元310、轉換單元320對應相同,在此不再贅述。
[0087]加密單元430,適于對所述APK中的轉換后的Native C代碼進行加密處理。
[0088]相比于Java代碼,Native C代碼的加密方式更加多樣,進一步增加逆向難度,防止APK關鍵信息的泄露。
[0089]圖5示出了根據本發明又一個實施例的一種加固APK的裝置的示意圖。如圖5所示,該加固APK的裝置500包括:獲取單元510、加密單元520、和添加編譯單元530。
[0090]獲取單元510,適于獲取待加固APK中的ELF文件,進行反編譯;并適于根據加密開始標記和加密結束標記,從反編譯的ELF文件中提取出待保護的一段或多段代碼,并對每個提取位置設置一個鉤子函數。
[0091]其中每段待保護的代碼的起始位置和結束位置分別有加密開始標記和加密結束不己O
[0092]加密單元520,適于將提取出的一段或多段代碼進行加密處理后,放入指定文件中。
[0093]添加編譯單元530,適于將指定文件添加到所述反編譯的APK中,編譯生成加固APK0
[0094]經圖5所示的裝置加固后得到的加固APK,在運行的過程中,通過設置的鉤子函數獲知到需要運行被保護的一段代碼時,從指定文件中解密出該段代碼,并在該段代碼運行完畢時,重新對該段代碼進行加密。實現對待保護代碼的動態加解密,使得內存中任意時刻都不存在完整的原始代碼的映像,從而防止APK被逆向還原。
[0095]在本發明的一個實施例中,加密單元520,適于對提取出的一端或多段代碼進行VM虛擬化;或/和,適于對提取出的一端或多段代碼進行分段加密;或/和,適于對提取出的一端或多段代碼進行代碼混淆;或/和,適于對提取出的一端或多段代碼進行反調試處理。
[0096]在本發明的一個實施例中,加密單元520,適于將提取出的一段或多段代碼進行加密處理后,放入SO文件的尾部。
[0097]本發明的一個實施例中,還提供了包含圖3和圖5所示裝置的一種加固APK的裝置,其中的獲取單元310和獲取單元510為同一個單元。本發明的另一個實施例中,還提供了包含圖4和圖5所述裝置的一種加固APK的裝置,其中的獲取單元410和獲取單元510為同一個單元。
[0098]圖6示出了根據本發明一個實施例的一種APK加固客戶端的示意圖。如圖6所示,該APK加固客戶端包括加固APK的裝置610。該加固APK的裝置610可以是如上文中任一實施例所述的加固APK的裝置。
[0099]圖7示出了根據本發明一個實施例的一種APK加固服務器的示意圖。如圖7所示,該APK加固服務器包括加固APK的裝置710。該加固APK的裝置710可以是如上文中任一實施例所述的加固APK的裝置。
[0100]綜上所述,本發明提供的技術方案通過將APK中的Java代碼轉換成反射調用的Native C代碼,實現了將Java的方法調用轉化為對等語法的Native C的方法調用,當一個方法被調用時,實現調用的代碼是Native C代碼而不是原始的Java代碼。并通過對轉換后的Native C代碼進行加密,實現對Native C代碼的進一步保護。與Java代碼相比,逆向Native C代碼的成本很高,且Native C代碼的保護方式很多,大大降低了 APK被反匯編分析,進而重打包再次分發的可能性,提高APK的安全等級。
[0101]需要說明的是:
[0102]在此提供的算法和顯示不與任何特定計算機、虛擬裝置或者其它設備固有相關。各種通用裝置也可以與基于在此的示教一起使用。根據上面的描述,構造這類裝置所要求的結構是顯而易見的。此外,本發明也不針對任何特定編程語言。應當明白,可以利用各種編程語言實現在此描述的本發明的內容,并且上面對特定語言所做的描述是為了披露本發明的最佳實施方式。
[0103]在此處所提供的說明書中,說明了大量具體細節。然而,能夠理解,本發明的實施例可以在沒有這些具體細節的情況下實踐。在一些實例中,并未詳細示出公知的方法、結構和技術,以便不模糊對本說明書的理解。
[0104]類似地,應當理解,為了精簡本公開并幫助理解各個發明方面中的一個或多個,在上面對本發明的示例性實施例的描述中,本發明的各個特征有時被一起分組到單個實施例、圖、或者對其的描述中。然而,并不應將該公開的方法解釋成反映如下意圖:即所要求保護的本發明要求比在每個權利要求中所明確記載的特征更多的特征。更確切地說,如下面的權利要求書所反映的那樣,發明方面在于少于前面公開的單個實施例的所有特征。因此,遵循【具體實施方式】的權利要求書由此明確地并入該【具體實施方式】,其中每個權利要求本身都作為本發明的單獨實施例。
[0105]本領域那些技術人員可以理解,可以對實施例中的設備中的模塊進行自適應性地改變并且把它們設置在與該實施例不同的一個或多個設備中。可以把實施例中的模塊或單元或組件組合成一個模塊或單元或組件,以及此外可以把它們分成多個子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設備的所有過程或單元進行組合。除非另外明確陳述,本說明書(包括伴隨的權利要求、摘要和附圖)中公開的每個特征可以由提供相同、等同或相似目的的替代特征來代替。
[0106]此外,本領域的技術人員能夠理解,盡管在此所述的一些實施例包括其它實施例中所包括的某些特征而不是其它特征,但是不同實施例的特征的組合意味著處于本發明的范圍之內并且形成不同的實施例。例如,在下面的權利要求書中,所要求保護的實施例的任意之一都可以以任意的組合方式來使用。
[0107]本發明的各個部件實施例可以以硬件實現,或者以在一個或者多個處理器上運行的軟件模塊實現,或者以它們的組合實現。本領域的技術人員應當理解,可以在實踐中使用微處理器或者數字信號處理器(DSP)來實現根據本發明實施例的加固APK的裝置以及APK加固客戶端和服務器中的一些或者全部部件的一些或者全部功能。本發明還可以實現為用于執行這里所描述的方法的一部分或者全部的設備或者裝置程序(例如,計算機程序和計算機程序產品)。這樣的實現本發明的程序可以存儲在計算機可讀介質上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網網站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。
[0108]應該注意的是上述實施例對本發明進行說明而不是對本發明進行限制,并且本領域技術人員在不脫離所附權利要求的范圍的情況下可設計出替換實施例。在權利要求中,不應將位于括號之間的任何參考符號構造成對權利要求的限制。單詞“包含”不排除存在未列在權利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發明可以借助于包括有若干不同元件的硬件以及借助于適當編程的計算機來實現。在列舉了若干裝置的單元權利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現。單詞第一、第二、以及第三等的使用不表示任何順序。可將這些單詞解釋為名稱。
[0109]本發明公開了 Al、一種加固APK的方法,其中,該方法包括:
[0110]獲取待加固APK中的至少一個方法對應的Java代碼;
[0111]將所述至少一個方法對應的Java代碼分別轉換成相應的反射調用的Native C代碼。
[0112]A2、如Al所述的方法,其中,所述獲取待加固APK中的至少一個方法對應的Java代碼包括:
[0113]對所述待加固APK進行反編譯獲取其中的至少一個方法對應的Java代碼。
[0114]A3、如Al所述的方法,其中,將所述至少一個方法對應的Java代碼分別轉換成相應的反射調用的Native C代碼包括:
[0115]對一個方法對應的Java代碼進行語義解析,根據語義解析結果構造反射調用的Native C代碼,再對Native C代碼進行編譯。
[0116]A4、如A3所述的方法,其中,所述對一個方法對應的Java代碼進行語義解析,根據語義解析結果構造反射調用的Native C代碼包括:
[0117]將該方法對應的Java代碼編譯成smali代碼,將smali代碼反編譯成一種中間語言,再將所述中間語言轉換成Native C代碼。
[0118]A5、如A4所述的方法,其中,
[0119]所述中間語言是一種由三元組指令構成的指令集,一個三元組指令包括:源地址、操作的目標地址和操作的類型。
[0120]A6、如Al所述的方法,其中,該方法進一步包括:
[0121]對所述APK中的轉換后的Native C代碼進行加密處理。
[0122]A7、如Al所述的方法,其中,該方法進一步包括:
[0123]獲取待加固APK中的ELF文件,進行反編譯;
[0124]根據加密開始標記和加密結束標記,從所述反編譯的ELF文件中提取出待保護的一段或多段代碼,并對每個提取位置設置一個鉤子函數;其中每段待保護的代碼的起始位置和結束位置分別有加密開始標記和加密結束標記;
[0125]將提取出的一段或多段代碼進行加密處理后,放入指定文件中;
[0126]將所述指定文件添加到所述反編譯的APK中,編譯生成加固APK ;
[0127]其中,在所述加固APK運行的過程中,通過設置的鉤子函數獲知到需要運行被保護的一段代碼時,從所述指定文件中解密出該段代碼,并在該段代碼運行完畢時,重新對該段代碼進行加密。
[0128]AS、如A7所述的方法,其中,所述將提取出的一段或多段代碼進行加密處理包括:
[0129]對提取出的一端或多段代碼進行VM虛擬化;或/和,對提取出的一端或多段代碼進行分段加密;或/和,對提取出的一端或多段代碼進行代碼混淆;或/和,對提取出的一端或多段代碼進行反調試處理。
[0130]A9、如A7所述的方法,其中,所述將提取出的一段或多段代碼進行加密處理后,放入指定文件中包括:
[0131]將提取出的一段或多段代碼進行加密處理后,放入SO文件的尾部。
[0132]A10、如A1-A9中任一項所述的方法,其中,
[0133]上述方法由位于終端側的客戶端執行;
[0134]或者,由位于終端側的客戶端獲取待加固的APK上傳到服務器,由服務器執行上述方法。
[0135]本發明公開了 BI 1、一種加固APK的裝置,其中,該裝置包括:
[0136]獲取單元,適于獲取待加固APK中的至少一個方法對應的Java代碼;
[0137]轉換單元,適于將所述至少一個方法對應的Java代碼分別轉換成相應的反射調用的Native C代碼。
[0138]B12、如Bll所述的裝置,其中,
[0139]所述獲取單元,適于對所述待加固APK進行反編譯獲取其中的至少一個方法對應的Java代碼。
[0140]B13、如Bll所述的裝置,其中,
[0141]所述轉換單元,適于對一個方法對應的Java代碼進行語義解析,根據語義解析結果構造反射調用的Native C代碼,再對Native C代碼進行編譯。
[0142]B14、如B13所述的裝置,其中,
[0143]所述轉換單元,適于將該方法對應的Java代碼編譯成smali代碼,將smali代碼反編譯成一種中間語言,再將所述中間語言轉換成Native C代碼。
[0144]B15、如B14所述的裝置,其中,
[0145]所述轉換單元所采用的所述中間語言是一種由三元組指令構成的指令集,一個三元組指令包括:源地址、操作的目標地址和操作的類型。
[0146]B16、如Bll所述的裝置,其中,該裝置進一步包括:
[0147]加密單元,適于對所述APK中的轉換后的Native C代碼進行加密處理。
[0148]B17、如Bll所述的裝置,其中,該裝置進一步包括:添加編譯單元和加密單元;
[0149]所述獲取單元,進一步適于獲取待加固APK中的ELF文件,進行反編譯;并適于根據加密開始標記和加密結束標記,從所述反編譯的ELF文件中提取出待保護的一段或多段代碼,并對每個提取位置設置一個鉤子函數;其中每段待保護的代碼的起始位置和結束位置分別有加密開始標記和加密結束標記;
[0150]所述加密單元,進一步適于將提取出的一段或多段代碼進行加密處理后,放入指定文件中;
[0151]所述添加編譯單元,適于將所述指定文件添加到所述反編譯的APK中,編譯生成加固APK ;
[0152]其中,所述加固APK在運行的過程中,通過設置的鉤子函數獲知到需要運行被保護的一段代碼時,從所述指定文件中解密出該段代碼,并在該段代碼運行完畢時,重新對該段代碼進行加密。
[0153]B18、如B17所述的裝置,其中,
[0154]所述加密單元,適于對提取出的一端或多段代碼進行VM虛擬化;或/和,適于對提取出的一端或多段代碼進行分段加密;或/和,適于對提取出的一端或多段代碼進行代碼混淆;或/和,適于對提取出的一端或多段代碼進行反調試處理。
[0155]B19、如B17所述的裝置,其中,
[0156]所述加密單元,適于將提取出的一段或多段代碼進行加密處理后,放入SO文件的尾部
[0157]本發明公開了 C20、一種APK加固客戶端,其中,該客戶端包括如B11-B19中任一項所述的加固APK的裝置。
[0158]本發明還公開了 D21、一種APK加固服務器,其中,該服務器包括如B11-B19中任一項所述的加固APK的裝置。
【權利要求】
1.一種加固八?X的方法,其中,該方法包括: 獲取待加固八1?中的至少一個方法對應的拓妨代碼; 將所述至少一個方法對應的把妨代碼分別轉換成相應的反射調用的版0代碼。
2.如權利要求1所述的方法,其中,所述獲取待加固八?X中的至少一個方法對應的 代碼包括: 對所述待加固仙X進行反編譯獲取其中的至少一個方法對應的拓%代碼。
3.如權利要求1所述的方法,其中,將所述至少一個方法對應的了代碼分別轉換成相應的反射調用的0代碼包括: 對一個方法對應的拓抑代碼進行語義解析,根據語義解析結果構造反射調用的^81:1^6 0代碼,再對0代碼進行編譯。
4.如權利要求3所述的方法,其中,所述對一個方法對應的拓%代碼進行語義解析,根據語義解析結果構造反射調用的代碼包括: 將該方法對應的拓妨代碼編譯成觀“丨代碼,將觀“丨代碼反編譯成一種中間語言,再將所述中間語言轉換成(:代碼。
5.一種加固八?X的裝置,其中,該裝置包括: 獲取單元,適于獲取待加固八?X中的至少一個方法對應的拓妨代碼; 轉換單元,適于將所述至少一個方法對應的拓妨代碼分別轉換成相應的反射調用的他1:1乂6 0代碼。
6.如權利要求5所述的裝置,其中, 所述獲取單元,適于對所述待加固仙X進行反編譯獲取其中的至少一個方法對應的 代碼。
7.如權利要求5所述的裝置,其中, 所述轉換單元,適于對一個方法對應的拓%代碼進行語義解析,根據語義解析結果構造反射調用的0代碼,再對0代碼進行編譯。
8.如權利要求7所述的裝置,其中, 所述轉換單元,適于將該方法對應的拓妨代碼編譯成811^11代碼,將811^11代碼反編譯成一種中間語言,再將所述中間語言轉換成~社1% (:代碼。
9.一種八?1(加固客戶端,其中,該客戶端包括如權利要求5-8中任一項所述的加固八?1(的裝置。
10.一種八?1(加固服務器,其中,該服務器包括如權利要求5-8中任一項所述的加固八?X的裝置。
【文檔編號】G06F21/60GK104463002SQ201410815934
【公開日】2015年3月25日 申請日期:2014年12月24日 優先權日:2014年12月24日
【發明者】李偉 申請人:北京奇虎科技有限公司, 奇智軟件(北京)有限公司