fest文件中目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的【具體實(shí)施方式】。
【附圖說明】
[0057]通過閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號表示相同的部件。在附圖中:
[0058]圖1示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種防軟件反編譯的方法的流程示意圖;
[0059]圖1A示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的app整體啟動邏輯;
[0060]圖2示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種防反編譯軟件啟動的方法的流程示意圖;
[0061]圖2A示出了根據(jù)本發(fā)明一個(gè)實(shí)施例具體的一種防反編譯軟件啟動的方法的流程示意圖;
[0062]圖3示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種防反編譯軟件啟動的裝置的結(jié)構(gòu)示意圖;
[0063]圖4示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種防反編譯軟件啟動的裝置的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0064]下面將參照附圖更詳細(xì)地描述本公開的示例性實(shí)施例。雖然附圖中顯示了本公開的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
[0065]實(shí)施例一
[0066]參照圖1,其示出了本發(fā)明的一種防軟件反編譯的方法的流程示意圖,具體可以包括:
[0067]步驟110,針對安卓系統(tǒng)的應(yīng)用的配置文件,將所述配置文件中的入口 activity聲明為 nativeActivity ;
[0068]在安卓(Android)系統(tǒng)的APP (APPlicat1n,應(yīng)用)啟動時(shí),必然首先加載其配置文件Manifest文件。因?yàn)槊總€(gè)安卓應(yīng)用程序必須有一個(gè)Manifest文件配置文件,在其根目錄res下。Manifest文件在簡單的Android系統(tǒng)的應(yīng)用提出了重要的信息,信息系統(tǒng)必須具備之前,Manifest文件中可以運(yùn)行任何應(yīng)用程序的代碼。除其他事項(xiàng)外,清單中執(zhí)行下列操作:(I)Manifest文件命名為應(yīng)用程序的Java包。包的名稱作為一個(gè)應(yīng)用程序的唯一標(biāo)識符;(2)Manifest文件中聲明了應(yīng)用程序的組件的活動、服務(wù)、廣播接收機(jī)、內(nèi)容提供商、應(yīng)用程序組成。Manifest文件中命名的類,實(shí)現(xiàn)每個(gè)組件。這些聲明讓Android系統(tǒng)知道的組件是什么和在什么條件下,他們可以啟用。(3)Manifest文件中決定哪些進(jìn)程將主機(jī)應(yīng)用程序組件。(4)Manifest文件中聲明,應(yīng)用程序必須有權(quán)限才能訪問受保護(hù)的API (APPlicat1n Program Interface,應(yīng)用程序編程接口)部分,并與其他應(yīng)用程序進(jìn)行交互。(5)Manifest文件中還聲明,其他進(jìn)程需要以與應(yīng)用程序的組件交互的權(quán)限。(6)Manifest文件中宣布的Android API的應(yīng)用程序需要的最低水平。等等一系列功能。
[0069]在上述一系列功能中,有一個(gè)聲明為入口 activity,即聲明應(yīng)用主界面啟動的類。在本發(fā)明實(shí)施例中,Manifest文件中的入口 activity聲明為nativeActivity。
[0070]步驟120,通過JAVA本地調(diào)用接口構(gòu)建針對所述nativeActivity的執(zhí)行文件;其中,針對所述nativeActivity的執(zhí)行文件用于,在所述針對所述nativeActivity的執(zhí)行文件加載后,在所述應(yīng)用的主界面啟動完成之前對所述應(yīng)用進(jìn)行簽名校驗(yàn),如果所述應(yīng)用的簽名校驗(yàn)不通過,則退出應(yīng)用。
[0071]然后通過jni實(shí)現(xiàn)nativeActivity的邏輯,即通過JNI 口構(gòu)建針對所述nativeActivity 的執(zhí)行文件。JNI 是 Java Native Interface,java 本地接口,也就是 java本地接口,它提供了若干的API實(shí)現(xiàn)了和Java和其他語言(C&C++)的通信。
[0072]當(dāng)然所述執(zhí)行文件還用于繪制主界面相關(guān)的邏輯,以及校驗(yàn)通過后,啟動相應(yīng)功能的邏輯。
[0073]優(yōu)選地,所述執(zhí)行文件用于,在所述針對所述nativeActivity的執(zhí)行文件加載后,在所述應(yīng)用的主界面啟動完成之前對所述應(yīng)用進(jìn)行簽名校驗(yàn),包括:
[0074]子步驟121,在所述針對所述nativeActivity的執(zhí)行文件加載后,執(zhí)行安卓主界面函數(shù),通過所述主界面函數(shù),在所述應(yīng)用的主界面啟動完成之前對所述應(yīng)用進(jìn)行簽名校驗(yàn)。
[0075]在本發(fā)明實(shí)施例中應(yīng)用的主界面的啟動的整體邏輯如圖1A:
[0076]All,加載 Manifest 文件中的 nativeActivity。
[0077]A12,調(diào)用 Android Jni 接口 ;
[0078]安卓系統(tǒng)中任何一個(gè)APP啟動時(shí),都會去加載Manifest文件,然后其中的入口 activity,以繪制主界面。但是在本發(fā)明實(shí)施例中加載Manifest文件,從中讀取nativeActivity聲明,從而可以通過JNI接口去調(diào)用本地方法,加載通過JNI接口加載本地應(yīng)用主函數(shù)android_main的執(zhí)行文件。
[0079]A13,執(zhí)行應(yīng)用主函數(shù) android_main ;
[0080]在本發(fā)明實(shí)施例中執(zhí)行android_main。
[0081]A14,執(zhí)行主界面初始化函數(shù)engine_init_display ;
[0082]然后會根據(jù)上述執(zhí)行文件調(diào)用engine_init_display對繪制主界面需要的資源進(jìn)行初始化。
[0083]A15,執(zhí)行框架繪制函數(shù) engine_draw_frame ;
[0084]然后執(zhí)行engine_draw_frame繪制主界面的框架。
[0085]A16,在 frame 中執(zhí)行 UI 條目繪制函數(shù) engine_term_display0
[0086]然后執(zhí)行engine_term_display繪制框架中的具體UI界面。
[0087]本發(fā)明將上述的步驟A14-A16統(tǒng)一以JNI規(guī)定構(gòu)建一個(gè)執(zhí)行文件,比如so文件,那么應(yīng)用讀取到Manifest文件中的nativeActivity后,需要首先讀取與nativeActivity對應(yīng)的本地so文件去繪制主界面的activity。那么本發(fā)明則可在步驟A13執(zhí)行安卓主界面函數(shù)android_main之后,主界面繪制之前,加入應(yīng)用主界面的簽名校驗(yàn)邏輯,由android_main控制所述簽名校驗(yàn)邏輯。
[0088]優(yōu)選地,在所述應(yīng)用的主界面啟動完成之前對所述應(yīng)用進(jìn)行簽名校驗(yàn),包括:
[0089]子步驟1211,在王界面函數(shù)中,調(diào)用natve方法在系統(tǒng)內(nèi)存中指走位置申請一塊內(nèi)存,存放預(yù)置的第一簽名信息;
[0090]子步驟1212,獲取當(dāng)前應(yīng)用的第二簽名信息,判斷所述第一簽名信息與第二簽名信息是否匹配;所述第一簽名信息與第二簽名信息不匹配,則確定所述應(yīng)用的簽名校驗(yàn)不通過。
[0091]前述簽名校驗(yàn)邏輯中,在android_main控制的邏輯中加入natve方法,由natve方法執(zhí)行在在系統(tǒng)內(nèi)存中指定位置申請一塊內(nèi)存,存放預(yù)置的第一簽名信息。那么果反編譯過APP,重新打包后,其可能在指定位置申請的內(nèi)存中存放的簽名信息被更改。
[0092]那么在android_main控制后續(xù)驗(yàn)證邏輯時(shí),首先獲取當(dāng)前啟動的應(yīng)用的第二簽名信息,與開發(fā)者開發(fā)完成時(shí)構(gòu)建的存在指定位置的內(nèi)存塊中第一簽名信息進(jìn)行匹配。如果所述第一簽名信息與第二簽名信息不匹配,則確定所述應(yīng)用的簽名校驗(yàn)不通過,退出繪制主界面,從而不能進(jìn)入APP。如果所述第一簽名信息與第二簽名信息匹配,則確定所述應(yīng)用的簽名校驗(yàn)通過,可以繪制主界面,從能進(jìn)入APP。
[0093]當(dāng)然在本發(fā)明實(shí)施例中,經(jīng)過反編譯的APP,其還可能根本就不在指定位置申請內(nèi)存塊,本發(fā)明實(shí)施例android_main控制后續(xù)驗(yàn)證邏輯時(shí),貝U從指定位置的內(nèi)存塊讀取簽名信息,如果沒有從指定位置讀取到任何簽名信息,也認(rèn)為校驗(yàn)沒有通過。
[0094]優(yōu)選地,所述第一簽名信息為應(yīng)用初始狀態(tài)下的第一 MD5值,所述第二簽名信息為應(yīng)用啟動時(shí)的第二 MD5值。
[0095]在本發(fā)明實(shí)施例中,第一簽名信息為開發(fā)者把APP開發(fā)完成后,對APP的某個(gè)文件A計(jì)算MD5值(Message-Digest Algorithm 5,信息摘要算法5),,該MD5值為第一 MD5值。當(dāng)客戶端從某個(gè)途徑,比如第三方平臺下載所述APP,進(jìn)行安裝后,啟動時(shí)則會計(jì)算當(dāng)前啟動時(shí)的APP的文件A計(jì)算MD5值,該啟動時(shí)計(jì)算的MD5值為第二 MD5值。那么如果APP被反編譯后,文件A的內(nèi)容不同,其MD5值也不同。
[0096]優(yōu)選地,所述第一簽名信息為所述應(yīng)用初始狀態(tài)下的第一證書文件,所述第二簽名信息為所述應(yīng)用啟動時(shí)的第二證書文件。
[0097]在本發(fā)明實(shí)施例中,第一簽名信息為開發(fā)者把APP開發(fā)完成后,對APP的下發(fā)的一個(gè)文件內(nèi)容的證書文件,該證書文件為第一證書文件。當(dāng)客戶端從某個(gè)途徑,比如第三方平臺下載所述APP,進(jìn)行安裝后,啟動時(shí)則會獲取當(dāng)前啟動時(shí)的APP的數(shù)字證書,該啟動時(shí)的該證書文件為第二證書文件。那么如果APP被反編譯后,APP的文件內(nèi)容不同,其證書文件值也不同。
[0098]那么如此對APP的啟動邏輯進(jìn)行了修改,即使該APP被反編譯之后,由于是通過JNI接口調(diào)用的本地方法,而本地方法可以通過C++構(gòu)建為SO文件,反編譯難度巨大,基本上無法被反編譯,那么即使有修改者對整個(gè)APP的大致邏輯進(jìn)行了反編譯,也會改變APP的簽名,那么對于被反編譯之后的APP,如果啟動,其不能通過上述nativeActivity的執(zhí)行文件中的校驗(yàn)邏輯,則無法啟動APP的主界面,也就無法使用APP,對用戶和開發(fā)者來說均不會由于APP內(nèi)容改變而受到危害。
[0099]優(yōu)選地,所述通過JAVA本地調(diào)用接口構(gòu)建針對所述nativeActivity的執(zhí)行文件包括:
[0100]子步驟122,構(gòu)建針對所述nativeActivity的SO文件;。
[0101]本發(fā)明的構(gòu)建的執(zhí)行文件可為so文件。so文件可以理解為動態(tài)鏈接庫,可以由C++編譯出來。所述所述SO文件用于,在所述針對所述nativeActivity的執(zhí)行文件加載后,在所述應(yīng)用的主界面啟動完成之前對所述應(yīng)用進(jìn)行簽名校驗(yàn),如果所述應(yīng)用的簽名校驗(yàn)不通過,則退出應(yīng)用。即通過所述so文件,在繪制主界面的邏輯中,加入對所述應(yīng)用進(jìn)行簽名校驗(yàn),如果所述應(yīng)用的簽名校驗(yàn)不通過,則退出應(yīng)用,結(jié)束主界面的繪制,如果所述應(yīng)用的簽名校驗(yàn)通過,則繪制主界面。
[0102]本發(fā)明實(shí)施例在所述應(yīng)用的配置文件Manifest文件中,將所述配置文件中的入口 activity 聲明為 nativeActivity,然后通過 JNI (Java Native Interface,JAVA 本地調(diào)用接口)構(gòu)建針對所述nativeActivity的執(zhí)行文件;其中,針對所述nativeActivity的執(zhí)行文件用于,在所述針對所述nativeActivity的執(zhí)行文件加載后,在所述應(yīng)用的主界面啟動完成之前對所述應(yīng)用進(jìn)行簽名校驗(yàn),如果所述應(yīng)用的簽名校驗(yàn)不通過,則退出應(yīng)用。由于通過 JNI (Java Native Interface,JAVA 本地調(diào)用接口)構(gòu)建針對所述 nativeActivity的執(zhí)行文件,其可以通過采用C++實(shí)現(xiàn)android_m