欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種Android應(yīng)用程序代碼保護(hù)機(jī)制鑒別方法與流程

文檔序號(hào):12669729閱讀:505來(lái)源:國(guó)知局
一種Android應(yīng)用程序代碼保護(hù)機(jī)制鑒別方法與流程

本發(fā)明屬于網(wǎng)絡(luò)空間安全技術(shù)領(lǐng)域,尤其涉及一種Android應(yīng)用程序代碼保護(hù)機(jī)制鑒別方法。



背景技術(shù):

近年來(lái),隨著移動(dòng)互聯(lián)網(wǎng)的快速發(fā)展和應(yīng)用,以Android為代表的智能移動(dòng)端得以迅速普及應(yīng)用。在這樣的一個(gè)趨勢(shì)下,涌現(xiàn)出一大批優(yōu)秀的移動(dòng)互聯(lián)網(wǎng)公司,他們以APK應(yīng)用程序?yàn)檩d體,向人們傳達(dá)不同行業(yè)移動(dòng)互聯(lián)網(wǎng)思維和商業(yè)模式。然而,如果這些APK應(yīng)用程序的源碼遭到泄露,必然會(huì)給移動(dòng)互聯(lián)網(wǎng)公司帶來(lái)巨大的經(jīng)濟(jì)損失。逆向工程能破開(kāi)Android應(yīng)用程序的外殼,借助Android逆向工程技術(shù),分析者可以從一個(gè)APK應(yīng)用程序包中解析出源碼。隨著APK應(yīng)用程序防護(hù)技術(shù)的發(fā)展,很多公司采取了相應(yīng)的技術(shù)手段,來(lái)防范通過(guò)逆向工程技術(shù)獲取程序的源代碼,比如采用代碼混淆、代碼加密、JNI調(diào)用等技術(shù)。一方面,很多公司用這些保護(hù)機(jī)制來(lái)保護(hù)自己的源代碼;另一方面,很多網(wǎng)絡(luò)攻擊者開(kāi)發(fā)的惡意代碼為了逃避殺毒軟件的查殺,采用上述保護(hù)機(jī)制對(duì)自己的代碼進(jìn)行保護(hù),從而給惡意代碼的檢測(cè)和查殺造成了極大的困難。所以,判斷源代碼的保護(hù)機(jī)制,不管對(duì)于想保護(hù)自己源代碼的公司,還是對(duì)于研究惡意代碼檢測(cè)技術(shù)的研究機(jī)構(gòu)都具有重大意義。

Android逆向工程介紹:

逆向工程,顧名思義,就是通過(guò)現(xiàn)有的產(chǎn)品,通過(guò)一些手段進(jìn)行逆向推演,最后還原出產(chǎn)品本來(lái)的架構(gòu)和組成等。對(duì)于一個(gè)Android應(yīng)用程序來(lái)說(shuō),我們可以通過(guò)最原始的APK包,利用一些工具,還原出APK的邏輯代碼、系統(tǒng)架構(gòu)、函數(shù)調(diào)用樹(shù)、界面源碼等。常見(jiàn)的工具有APKTool、dex2jar等。這也是我們?cè)诒景l(fā)明方法中主要使用的工具。

Android逆向工程主要處理兩部分內(nèi)容:xml文件和dex文件,xml文件是APK的界面設(shè)計(jì)布局所使用的語(yǔ)言,dex文件存儲(chǔ)的是java經(jīng)過(guò)編譯所生成的對(duì)應(yīng)代碼。對(duì)于xml文件的反編譯,一般可以采用APKTool和AXMLPrinter2.jar工具。對(duì)于dex文件的反編譯,一般可以采用APKTool和dex2jar工具。

dex2jar應(yīng)用于反編譯dex文件的過(guò)程可以分為兩步:第一步,從一般的APK包中恢復(fù)出dex文件。APK包本質(zhì)上是一個(gè)zip格式的壓縮包,我們可以通過(guò)修改文件的后綴名并解壓的方式,恢復(fù)出dex文件。第二步,從dex文件反編譯出.class文件,可以使用dex2jar.ba在windows命令行下,輸入dex2jar+反編譯需要的dex文件名即可完成反編譯。從jar文件恢復(fù)出Java源代碼的技術(shù)相對(duì)較成熟,主要的工具包括jd-gui、Jodeclipse以及JadClipse。

通過(guò)APKTool工具我們可以將一個(gè)正常的APK包反編譯成Smali程序語(yǔ)言代碼,該程序語(yǔ)言可被Android系統(tǒng)里的Java虛擬機(jī)(Dalvik)所解析,該程序語(yǔ)言與Java程序語(yǔ)言有一定的相似性,因?yàn)槠涫怯蒍ava程序語(yǔ)言在打包時(shí)候經(jīng)過(guò)轉(zhuǎn)換得來(lái)的,有一定Java程序語(yǔ)言編程基礎(chǔ)的人可以很輕松地閱讀Smali程序語(yǔ)言。

Android系統(tǒng)代碼保護(hù)機(jī)制介紹:

從代碼被保護(hù)的客體來(lái)看,代碼保護(hù)措施分為兩種,分別是結(jié)構(gòu)上的保護(hù)和語(yǔ)義上的保護(hù)。結(jié)構(gòu)上的保護(hù),如代碼JNI接口調(diào)用等,讓代碼本身處于一種不可拿到的狀態(tài),分析者也就無(wú)法破獲代碼的具體內(nèi)容了。語(yǔ)義上的保護(hù),如代碼混淆等,指的是代碼的含義被人為進(jìn)行了處理,并且這種處理是不可逆的,導(dǎo)致分析者即使拿到了代碼,也無(wú)法閱讀代碼的具體內(nèi)容,但是機(jī)器使用某些工具是可以解析的。需要注意的是,代碼加密是一種結(jié)構(gòu)上的保護(hù),具體原因如下面詳細(xì)解釋。

1.對(duì)于代碼結(jié)構(gòu)的保護(hù)

JNI技術(shù):JNI技術(shù)已經(jīng)成為Java開(kāi)發(fā)平臺(tái)的一部分,它允許Java代碼和其他程序語(yǔ)言寫(xiě)的代碼進(jìn)行交互。JNI技術(shù)一開(kāi)始是為了本地已編譯語(yǔ)言,尤其是C和C++程序語(yǔ)言而設(shè)計(jì)的,但是它并不妨礙你使用其他程序語(yǔ)言,只要JNI調(diào)用約定支持就可以了。一般來(lái)說(shuō),APK程序運(yùn)行在Android系統(tǒng)的應(yīng)用程序?qū)?,先將APK程序打包成的jar文件解析成dex文件,然后交由Java虛擬機(jī)(Dalvik)進(jìn)一步執(zhí)行。對(duì)于C程序語(yǔ)言編譯的so文件,Java虛擬機(jī)(Dalvik)是不能夠直接執(zhí)行的,它可以將這個(gè)文件遞交給自己的上一層去執(zhí)行。很多開(kāi)發(fā)者將應(yīng)用程序的核心代碼編譯成so文件,再由JNI去調(diào)用。這樣做的原因是相對(duì)于jar文件,so文件的反編譯難度會(huì)有所增加。

代碼加密技術(shù):這是利用Java虛擬機(jī)類裝載機(jī)制實(shí)現(xiàn)加密解密,類裝載機(jī)制指的是:在執(zhí)行Java程序的時(shí)候,Java虛擬機(jī)會(huì)將*.class類文件加載到內(nèi)存中,并形成一個(gè)Class的對(duì)象。代碼加密首先將代碼用密鑰加密,然后發(fā)布出去,當(dāng)該代碼的應(yīng)用程序在執(zhí)行的過(guò)程中,需要調(diào)用ClassLoader的loadClass方法時(shí),開(kāi)發(fā)者提前重寫(xiě)了loadClass方法,使其變成解密器,利用密鑰進(jìn)行解密,完成代碼的順利執(zhí)行。上面提到,代碼加密是一種結(jié)構(gòu)保護(hù)措施,因?yàn)榻饷艿拿荑€往往被嵌入在APK包內(nèi)。

2.對(duì)于代碼語(yǔ)義的保護(hù)

代碼混淆技術(shù):相對(duì)來(lái)說(shuō)成本較低、效果較好的當(dāng)屬代碼混淆技術(shù)。代碼混淆是將計(jì)算機(jī)程序語(yǔ)言的代碼,轉(zhuǎn)換成一種功能上的等價(jià),但是其形式人類難于閱讀和理解的行為。代碼混淆可以用于程序源代碼,也可以用于程序編譯成的中間代碼。具體做法有:

將代碼中的各種元素,如變量、函數(shù)、類的名字改寫(xiě)成無(wú)意義的名字。比如改寫(xiě)成單個(gè)字母,或是簡(jiǎn)短的無(wú)意義字母組合,甚至改寫(xiě)成“__”這樣的符號(hào)等,使得代碼閱讀者無(wú)法根據(jù)名字猜測(cè)其用途。

重寫(xiě)代碼中的部分邏輯,將其變成功能上的等價(jià),但是更難理解的形式。比如將for循環(huán)改寫(xiě)成while循環(huán),將循環(huán)改寫(xiě)成遞歸,精簡(jiǎn)中間變量等。

打亂代碼的格式,比如刪除空格,將多行代碼擠到一行中,或者將一行代碼斷成多行等。

在Android的開(kāi)發(fā)平臺(tái)工具中,內(nèi)嵌了一個(gè)代碼混淆工具ProGuard。ProGuard是一個(gè)壓縮、優(yōu)化和混淆Java字節(jié)碼文件的免費(fèi)工具,它可以刪除無(wú)用的類、字段、方法和屬性??梢詣h除沒(méi)用的注釋,最大限度地優(yōu)化字節(jié)碼文件。它還可以使用簡(jiǎn)短的無(wú)意義的名稱來(lái)重命名已經(jīng)存在的類、字段、方法和屬性。Android系統(tǒng)開(kāi)發(fā)者常常用其混淆最終的代碼,以增加項(xiàng)目被反編譯的難度。



技術(shù)實(shí)現(xiàn)要素:

針對(duì)現(xiàn)有技術(shù)的上述狀況,本發(fā)明提供一種Android應(yīng)用程序代碼保護(hù)機(jī)制鑒別方法,能有效識(shí)別出代碼是否有保護(hù)機(jī)制,以及采用的是何種保護(hù)機(jī)制,并以人們易懂的形式輸出鑒別結(jié)果。

本發(fā)明Android應(yīng)用程序代碼保護(hù)機(jī)制鑒別方法,包括以下步驟:

步驟一、載入APK包,按照路徑讀取APK包文件;

步驟二、對(duì)APK包進(jìn)行初步的逆向工程反編譯,判斷獲取APK包的安裝包名稱、版本,如果成功則進(jìn)入步驟三,不成功則加入手工辨識(shí)標(biāo)簽后,進(jìn)入步驟六;

步驟三、進(jìn)入反編譯器,對(duì)APK包進(jìn)行深入的反編譯操作,如果反編譯成功,得到APK源代碼,則進(jìn)入步驟四;如果反編譯不成功則進(jìn)入APK解析器,通過(guò)包解析操作得到源代碼,如果成功則進(jìn)入步驟四,不成功則加入手工辨識(shí)標(biāo)簽后進(jìn)入步驟六;

步驟四、對(duì)APK源代碼進(jìn)行分析,判斷代碼是否經(jīng)過(guò)混淆及是否存在結(jié)構(gòu)保護(hù),得到分析結(jié)果集后進(jìn)入步驟五;

步驟五、對(duì)結(jié)果集進(jìn)行歸類整理,將結(jié)果集用人類能理解的語(yǔ)言描述、輸出;

步驟六、提取具有手工辨識(shí)標(biāo)簽的APK包,進(jìn)行手工辨識(shí),最終得到結(jié)果集。

優(yōu)選地,步驟二及步驟三調(diào)用程序APKTools進(jìn)行APK包的反編譯,利用Process類封裝反編譯APK包的進(jìn)程,然后調(diào)用該進(jìn)程進(jìn)行APKTools程序執(zhí)行,一旦APKTools程序執(zhí)行完畢,則判斷APK包已經(jīng)反編譯完畢。

優(yōu)選地,步驟四判斷代碼是否經(jīng)過(guò)混淆的步驟如下:如果APK源代碼的變量名、類名符合正則表達(dá)式,則判斷代碼經(jīng)過(guò)混淆;如果APK源代碼的變量名、類名不符合正則表達(dá)式,則調(diào)用駝峰命名法檢測(cè)其是否符合規(guī)則命名法,如果符合規(guī)則命名法則判斷代碼經(jīng)過(guò)混淆,如果不符合規(guī)則命名法則打上人工檢測(cè)的標(biāo)識(shí),后續(xù)進(jìn)行人工判斷。

優(yōu)選地,步驟四判斷代碼是否經(jīng)過(guò)混淆的分析入口為:根據(jù)配置清單將APK源代碼的類名轉(zhuǎn)換為路徑,找到內(nèi)部有代碼的文件夾,然后再進(jìn)行是否經(jīng)過(guò)混淆的檢測(cè)。

優(yōu)選地,步驟四判斷代碼是否經(jīng)過(guò)混淆時(shí),若在APK包的資源文件夾lib下檢索到j(luò)ar包或者so文件,則判斷APK源代碼引用了第三方的支持庫(kù)文件,將對(duì)應(yīng)的路徑排除,不進(jìn)行是否經(jīng)過(guò)混淆的判斷。

優(yōu)選地,步驟四判斷代碼是否存在結(jié)構(gòu)保護(hù)時(shí),若在APK包的資源文件夾lib中存在.so文件,則判斷APK源代碼使用了JNI技術(shù)。

與現(xiàn)有技術(shù)相比,本發(fā)明具有如下優(yōu)點(diǎn)及有益效果:

1、對(duì)APK包進(jìn)行初步和深入兩個(gè)層次的逆向工程反編譯,通過(guò)初步反編譯獲取到APK包的安裝包名稱、版本等關(guān)鍵信息,通過(guò)深度反編譯獲取到APK包的源代碼,得到源代碼后利用代碼邏輯保護(hù)檢測(cè)器和代碼結(jié)構(gòu)保護(hù)檢測(cè)器分別對(duì)代碼進(jìn)行分析,最終將分析后的結(jié)果集進(jìn)行歸類整理,使得原本只有計(jì)算機(jī)可以懂的結(jié)果集用人類可以理解的語(yǔ)言描述,例如報(bào)表等方式輸出,極大方便了源程序開(kāi)發(fā)者對(duì)自己所開(kāi)發(fā)程序的管理,也方便了研究惡意代碼檢測(cè)技術(shù)的研究機(jī)構(gòu)對(duì)相關(guān)惡意代碼的監(jiān)管。

2、對(duì)于分析過(guò)程中無(wú)法用機(jī)器自動(dòng)化進(jìn)行逆向工程和反編譯的APK包,本發(fā)明方法能自動(dòng)加上手工辨識(shí)標(biāo)簽。待分析完畢后提取具有手工辨識(shí)標(biāo)簽的APK,進(jìn)行手工辨識(shí)后得到結(jié)果。

3、本發(fā)明等反編譯結(jié)束后,才進(jìn)行下一步檢測(cè),即判斷代碼是否經(jīng)過(guò)混淆或存在結(jié)構(gòu)保護(hù),保證了整個(gè)鑒別過(guò)程的可靠性。

4、判斷代碼是否經(jīng)過(guò)混淆時(shí),并不直接從解析的Smali目錄開(kāi)始逐層地進(jìn)行判斷,而是根據(jù)配置清單將APK源代碼的類名轉(zhuǎn)換為路徑,找到內(nèi)部有代碼的文件夾后再進(jìn)行是否混淆的檢測(cè),極大地提供了算法的效率。

5、善用正反饋,充分借助代碼的歷史檢測(cè)結(jié)果來(lái)輔助分析當(dāng)前的檢測(cè)結(jié)果,將歷史檢測(cè)結(jié)果與當(dāng)前檢測(cè)結(jié)果進(jìn)行比對(duì),最終得出較為科學(xué)的分析結(jié)果集,以免誤判。

附圖說(shuō)明

圖1是本發(fā)明實(shí)施例提供的一種Android應(yīng)用程序代碼保護(hù)機(jī)制鑒別方法的流程圖。

圖2是本發(fā)明實(shí)施例提供的鑒別結(jié)果報(bào)表結(jié)構(gòu)圖。

具體實(shí)施方式

下面結(jié)合實(shí)施例和附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)的描述,但本發(fā)明的具體實(shí)施方式不限于此。

實(shí)施例

本發(fā)明Android應(yīng)用程序代碼保護(hù)機(jī)制鑒別方法首先載入APK文件安裝包,對(duì)APK包進(jìn)行逐一反編譯,再對(duì)反編譯以后的文件進(jìn)行掃描,查看其是否經(jīng)過(guò)代碼混淆和代碼加密等措施。如圖1所示,具體來(lái)說(shuō)包括以下步驟:

步驟一、載入APK包,按照路徑讀取APK包文件??赏ㄟ^(guò)路徑加載器完成APK包的載入,路徑加載器可利用Java語(yǔ)言自帶的文件操作框進(jìn)行編寫(xiě)實(shí)現(xiàn)。

步驟二、對(duì)APK包進(jìn)行初步的逆向工程反編譯,判斷獲取APK的安裝包名稱、版本等關(guān)鍵信息。如果成功則進(jìn)入步驟三,不成功則加入手工辨識(shí)標(biāo)簽后,進(jìn)入步驟六。初步逆向工程反編譯的核心工具是APKTool。APKTool的解析原理是通過(guò)將一個(gè)APK包文件轉(zhuǎn)換成ZIP壓縮文件,按照事先定義好的解析規(guī)則,解析AndroidMainfest.xml,將classes.dex文件解析成Smali程序語(yǔ)言文件。在本步驟中,主要是從AndroidMainfest.xml中的packagename字段中解析安裝包名稱,從versionname與versioncode中解析APK的版本信息。

步驟三、進(jìn)入反編譯器,對(duì)APK包進(jìn)行深入的反編譯操作,如果反編譯成功,得到APK源代碼,則進(jìn)入步驟四,不成功則進(jìn)入APK包解析器。APK包解析器會(huì)對(duì)APK包進(jìn)行解析操作,嘗試通過(guò)包解析操作得到源代碼,如果成功則進(jìn)入步驟四,不成功則加入手工辨識(shí)標(biāo)簽后進(jìn)入步驟六。

反編譯器有許多預(yù)先定義的規(guī)則,正常的APK包可以被這些規(guī)則所解析。一旦APK包被保護(hù),就會(huì)破壞這些規(guī)則,如采取加密、XML主配文件保護(hù)等手段,反編譯就無(wú)法順利執(zhí)行,從而導(dǎo)致APKTool拋出異常。拋出異常后進(jìn)入步驟六。通過(guò)反編譯器獲取源碼的過(guò)程中,如果失敗,我們就能知道其針對(duì)于APK安裝包進(jìn)行過(guò)防止反編譯保護(hù),即經(jīng)過(guò)結(jié)構(gòu)類保護(hù)。這些結(jié)果會(huì)被記錄下來(lái),提供給結(jié)果集分析器。

步驟四、對(duì)APK的源代碼進(jìn)行分析。利用代碼邏輯保護(hù)檢測(cè)器和代碼結(jié)構(gòu)保護(hù)檢測(cè)器分別對(duì)源代碼進(jìn)行分析,判斷源代碼是否經(jīng)過(guò)混淆及是否存在結(jié)構(gòu)保護(hù),得到分析結(jié)果集后進(jìn)行步驟五操作。

APK包能否解析是APK包經(jīng)過(guò)保護(hù)與否的一項(xiàng)重要標(biāo)志,但是無(wú)法判斷APK包內(nèi)部的代碼是否經(jīng)過(guò)混淆保護(hù)。本發(fā)明方法采用代碼混淆檢測(cè)器,對(duì)解析出來(lái)的代碼進(jìn)行混淆檢測(cè),判段其是否經(jīng)過(guò)代碼混淆。代碼混淆檢測(cè)器會(huì)逐級(jí)檢測(cè)已經(jīng)解析的代碼是否經(jīng)過(guò)混淆。對(duì)計(jì)算機(jī)無(wú)法解析的代碼,會(huì)給它打上手工解析標(biāo)識(shí)。

經(jīng)過(guò)APKTool反編譯的APK包會(huì)生成和原來(lái)文件名一樣的一個(gè)文件夾,內(nèi)部放置了AndroidMainfest.xml、res等文件,代碼放置在Smali文件夾下。

此外,如果在lib的文件夾及子文件夾中含有非第三方的so文件,那么就可以判斷其進(jìn)行了JNI調(diào)用。

在整個(gè)源代碼的解析與混淆檢測(cè)過(guò)程中,需要克服以下技術(shù)難題,現(xiàn)在一一進(jìn)行分析與闡述:

如何判斷代碼是否已經(jīng)反編譯結(jié)束

步驟二及步驟三所述反編譯在執(zhí)行的過(guò)程中,如何判斷出這個(gè)APK是否已經(jīng)反編譯結(jié)束,是至關(guān)重要的一步,因?yàn)橹挥械确淳幾g結(jié)束后(不論成功與否),才能進(jìn)行下一步檢測(cè)。這里不能是一個(gè)簡(jiǎn)單的if-else判斷,因?yàn)槲覀冋{(diào)用的另外一個(gè)程序APKTools來(lái)反編譯APK,這個(gè)程序獨(dú)立于主程序,無(wú)法在一個(gè)獨(dú)立的程序中加入Flag判斷其是否已經(jīng)對(duì)一個(gè)APK執(zhí)行反編譯結(jié)束。如果進(jìn)行循環(huán)檢測(cè),一方面,可能出現(xiàn)檢測(cè)效率問(wèn)題,另一方面,因?yàn)閷?duì)于一個(gè)APK文件反編譯后目錄的結(jié)構(gòu)是不確定的,也就是說(shuō),找不到循環(huán)結(jié)束的條件。在這里,將用到Java的Process類,這個(gè)類是一個(gè)抽象類(該類所有的方法均是抽象的),封裝了一個(gè)進(jìn)程(即一個(gè)執(zhí)行程序)。Process類提供了執(zhí)行進(jìn)程輸入、執(zhí)行進(jìn)程輸出、等待進(jìn)程完成、檢查進(jìn)程的退出狀態(tài)以及銷毀(殺掉)進(jìn)程的方法。我們利用Process類封裝反編譯APK包的進(jìn)程,然后調(diào)用該進(jìn)程進(jìn)行程序執(zhí)行,一旦APKTools程序執(zhí)行完畢,那么該應(yīng)用程序的進(jìn)程就會(huì)被系統(tǒng)自動(dòng)置空,也就能依據(jù)此,判斷一個(gè)APK已經(jīng)反編譯完畢。

如何判斷代碼經(jīng)過(guò)混淆

經(jīng)過(guò)混淆的代碼,通常變量名、類名是由一些難以理解的字符串進(jìn)行拼接而成的,所以往往是沒(méi)有意義且雜亂的。通過(guò)大量的手工實(shí)驗(yàn)我們發(fā)現(xiàn)通過(guò)Proguard混淆后的變量名和類名,一般都用a、b、c、d等1到3個(gè)字符組成,正則表達(dá)式為^[a-z]{1,2,3}$。此時(shí)Java語(yǔ)言中的正則表達(dá)式,為我們提供了很好的現(xiàn)成調(diào)用方法。正則表達(dá)式是使用單個(gè)字符串來(lái)描述、匹配一系列符合某個(gè)句法規(guī)則的字符串。在很多文本編輯器里,正則表達(dá)式通常被用來(lái)檢索、替換那些符合某個(gè)模式的文本。一方面,通過(guò)正則表達(dá)式,我們能判斷一個(gè)類的類名,以及其內(nèi)部變量,是否符合Proguard的混淆規(guī)則。另一方面,有極少一部分APK不是經(jīng)過(guò)Proguard進(jìn)行代碼混淆的,那么這些APK內(nèi)部類名就可能是一些其它的特殊符號(hào)。正則表達(dá)式會(huì)在上述判斷不符合的情況下,進(jìn)一步判斷一個(gè)類的類名是否符合類名的拼寫(xiě)規(guī)則,目前業(yè)內(nèi)通用的類名拼寫(xiě)方法是駝峰命名法,即對(duì)于一個(gè)單詞,首字母大寫(xiě),其余字母小寫(xiě)。如登錄界面的拼寫(xiě)方法是LoginActivity,這種每個(gè)單詞的首字母都大寫(xiě)的我們叫做大駝峰命名法,正則表達(dá)式為^([A-Z][a-z]+)$,對(duì)于類似于getAttribute這樣的機(jī)構(gòu),我們叫做小駝峰命名法,正則表達(dá)式為^[a-z]+([A-Z][a-z]+)$。大駝峰命名的名字常見(jiàn)于類名等命名規(guī)則中,小駝峰命名則常常出現(xiàn)在方法名稱中。如果變量名、類名不符合^[a-z]{1,2,3}$正則表達(dá)式,我們調(diào)用駝峰命名法檢測(cè)其是否符合規(guī)則命名法,如果不符合規(guī)則命名法,其代碼很可能經(jīng)過(guò)特殊符號(hào)的混淆,我們會(huì)為其打上人工檢測(cè)的標(biāo)識(shí)。為什么我們要首先檢測(cè)是否滿足^[a-z]{1,2,3}$表達(dá)式呢?首先,大多數(shù)經(jīng)過(guò)混淆的代碼類名、變量名,都符合上述的命名規(guī)則,符合該規(guī)則能迅速判斷一個(gè)類名經(jīng)過(guò)混淆。其次,從執(zhí)行效率方面,首先判斷命名規(guī)則若滿足^[a-z]{1,2,3}$表達(dá)式,肯定是經(jīng)過(guò)混淆的,若不滿足^[a-z]{1,2,3}$表達(dá)式,則不一定沒(méi)有經(jīng)過(guò)混淆,還要經(jīng)過(guò)駝峰命名法進(jìn)行檢測(cè),如果駝峰命名法檢測(cè)結(jié)果為假,也不一定是經(jīng)過(guò)混淆,其還需要人工去判斷。如果最先進(jìn)行駝峰命名法檢測(cè),那么不論檢測(cè)結(jié)果真與假都需要進(jìn)行下一次的判斷,才能確定其是否經(jīng)過(guò)混淆。

混淆檢測(cè)入口的判斷

如果直接從解析的Smali目錄開(kāi)始逐層地進(jìn)行判斷,那么就會(huì)出現(xiàn)效率問(wèn)題,一個(gè)混淆后的代碼,可能出現(xiàn)在第一個(gè)子目錄,也有可能出現(xiàn)在最后一個(gè)子目錄。如果都從第一個(gè)子目錄開(kāi)始找起,難免會(huì)造成效率低下。因?yàn)橛械淖幽夸浛赡芗?jí)聯(lián)好幾個(gè)子目錄,每個(gè)子目錄中可能都沒(méi)有混淆,而且,并不是每個(gè)子目錄中都有代碼,很多情況下,目錄中層層嵌套著其余的目錄。目錄遞歸也會(huì)對(duì)效率造成相應(yīng)的影響。

我們發(fā)現(xiàn)不管代碼如何混淆,它的入口函數(shù)是不會(huì)進(jìn)行混淆的。實(shí)際上,由于Activity入口函數(shù)屬于Android四大組件之一,要在配置清單文件中進(jìn)行相應(yīng)的配置,Activity入口函數(shù)一旦經(jīng)過(guò)混淆,那么在配置清單中就無(wú)法找到相應(yīng)的Acitivity函數(shù)名稱,Android程序就會(huì)出錯(cuò)?;诖?,我們可以從配置清單入手,將類名轉(zhuǎn)換為路徑,找到內(nèi)部有代碼的文件夾,然后再進(jìn)行混淆檢測(cè)。

src下的包結(jié)構(gòu)是以“.”作為分隔符的,我們可以將其中的“.”替換為文件路徑分隔符“/”,用以表示路徑。值得一提的是,在有的APK中,類并不是全名,往往是類似于“.LoginActivity”這類的名稱,我們可以通過(guò)獲取包名的方式,將APK包名和類名進(jìn)行拼接,就能得到目錄級(jí)聯(lián)下的實(shí)際文件位置。而APK包名在配置文件中也可以直接找到。

lib包檢測(cè)

一方面,有很多應(yīng)用程序,代碼本身其實(shí)沒(méi)有進(jìn)行過(guò)代碼混淆,但是調(diào)用了第三方的代碼,導(dǎo)致代碼混淆。這樣的代碼我們也可以在APK包的資源文件夾lib下進(jìn)行檢索,如果包含常用的第三方j(luò)ar包,或者so文件,那么就可以知道這些應(yīng)用程序引用了第三方的支持庫(kù)文件,將對(duì)應(yīng)的路徑排除即可。常用的第三方庫(kù)文件有地圖應(yīng)用、廣告應(yīng)用等,如libBaiduMapSDK_v3_5_0_1.so就是百度地圖的核心類庫(kù)。在檢測(cè)其代碼是否經(jīng)過(guò)混淆的時(shí)候,我們可以將com.baidu.*目錄下的所有文件排除在外,不進(jìn)行混淆檢測(cè)。

另外一方面,如果APK應(yīng)用本身使用了JNI技術(shù)調(diào)用自身存儲(chǔ)的C/C++代碼,那么在APK包的資源文件夾lib中,必然存在著.so文件,這可以作為我們分析判斷一個(gè)APK有沒(méi)有經(jīng)過(guò)代碼保護(hù)措施的重要依據(jù)。

善用正反饋

盡管本發(fā)明方法設(shè)計(jì)了完備的檢測(cè)方案,但是仍然可能出現(xiàn)誤報(bào)的情況,如何提高檢測(cè)的準(zhǔn)確率以降低誤報(bào)率,也是本發(fā)明方法研究的重點(diǎn)。對(duì)此,本發(fā)明方法加入了正反饋功能,即借助歷史的檢測(cè)結(jié)果來(lái)輔助分析現(xiàn)有的檢測(cè)結(jié)果。將先前的檢測(cè)結(jié)果,通過(guò)報(bào)表的形式導(dǎo)入到待檢測(cè)APK源代碼的當(dāng)前判斷結(jié)果中進(jìn)行比對(duì),最終得出較為科學(xué)的分析結(jié)果集。比如說(shuō),一個(gè)APK早期版本,發(fā)現(xiàn)其經(jīng)過(guò)代碼混淆,到了后面的版本,發(fā)現(xiàn)其沒(méi)有經(jīng)過(guò)代碼混淆,那么很可能結(jié)果是有問(wèn)題的,需要加上人工標(biāo)識(shí),后面再進(jìn)行排查以得出正確的結(jié)果。

步驟五、對(duì)結(jié)果集進(jìn)行歸類整理,將原本只有計(jì)算機(jī)可以懂的結(jié)果集用人類可以理解的語(yǔ)言描述,如報(bào)表等方式輸出結(jié)果,呈現(xiàn)給用戶。這里我們選擇用jexcelapi工具生成excel報(bào)表的形式并呈現(xiàn)給用戶,如圖2所示。用戶可以在報(bào)表上看到包名、版本、是否經(jīng)過(guò)保護(hù)措施、經(jīng)過(guò)何種保護(hù)措施以及判斷理由等信息。

步驟六、步驟二與步驟三中,對(duì)于計(jì)算機(jī)分析無(wú)效的代碼,本發(fā)明方法會(huì)自動(dòng)加上手工辨識(shí)標(biāo)簽。步驟六提取具有手工辨識(shí)標(biāo)簽的APK包,進(jìn)行手工辨識(shí),最終得到結(jié)果集。

以上所述僅為本發(fā)明的較佳實(shí)施例之一而已,并不用于限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
于田县| 江陵县| 会理县| 海淀区| 商都县| 鹤岗市| 卢湾区| 克东县| 马山县| 科技| 广昌县| 舟曲县| 苗栗县| 浏阳市| 湖南省| 蓬莱市| 平顶山市| 康马县| 应城市| 右玉县| 乐都县| 平湖市| 大城县| 米林县| 东丽区| 凤山市| 隆德县| 宝山区| 翁牛特旗| 宜宾县| 那坡县| 桐庐县| 贺州市| 灌南县| 永新县| 开鲁县| 义马市| 沅江市| 龙南县| 无为县| 商城县|