TWI648648B - 安卓平台上可執行程式的保護方法 - Google Patents

安卓平台上可執行程式的保護方法 Download PDF

Info

Publication number
TWI648648B
TWI648648B TW106128965A TW106128965A TWI648648B TW I648648 B TWI648648 B TW I648648B TW 106128965 A TW106128965 A TW 106128965A TW 106128965 A TW106128965 A TW 106128965A TW I648648 B TWI648648 B TW I648648B
Authority
TW
Taiwan
Prior art keywords
function
file
code
classes
byte code
Prior art date
Application number
TW106128965A
Other languages
English (en)
Other versions
TW201839644A (zh
Inventor
闞志剛
陳彪
王衛民
朱丹
程顯龍
盧佐華
Original Assignee
大陸商北京梆梆安全科技有限公司
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 大陸商北京梆梆安全科技有限公司 filed Critical 大陸商北京梆梆安全科技有限公司
Publication of TW201839644A publication Critical patent/TW201839644A/zh
Application granted granted Critical
Publication of TWI648648B publication Critical patent/TWI648648B/zh

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本申請提供一種安卓平台上可執行程式的保護方法,包含:確定APK應用程式套件中的classes.dex檔案中要保護的函式,修改後形成新的classes.dex檔案;編寫函式的C/C++語言實作;將函式的C/C++語言實作編譯為動態連結函式庫;在APK應用程式套件中,用新的classes.dex檔案替換原classes.dex檔案,將動態連結函式庫加入APK應用程式套件。本發明不但提高了逆向分析的難度,而且更大幅度地提高了還原程式碼的難度。

Description

安卓平台上可執行程式的保護方法
本發明涉及一種軟體處理技術,更具體而言,本發明涉及一種用於安卓(Android)平台的可執行程式的保護方法。
安卓平台上採用Java語言進行開發,Java語言是一種跨平台的,直譯性的語言,Java的原始碼編譯為一種「位元組碼」形式的中間碼,這種位元組碼保留了很多原始碼的資訊,例如方法(函式)名,變數名等,從而使得Java位元組碼的反編譯(decompiling)變得非常容易。為了保護安卓程式的應用版權等,需要對應用程式進行保護。
1.安卓平台基本介紹
APK(Android Application Package)是安卓平台上的可執行程式,其本質是一個zip檔案,主要包含以下幾類檔案:classes.dex、so檔案、AndroidManifest.xml、其他資源檔案(例如:圖片、xml檔案等)。
(1)classes.dex是Dalvik的可執行程式,該檔案裡面存放了所有的Java原始碼經過編譯後的位元組碼。也是本發明所欲保護的對象。
Dalvik是Google公司自己設計用於安卓平台的虛擬機器。 Dalvik虛擬機器是Google等廠商合作開發的安卓行動裝置平台的核心組成部分之一。它可以支援已轉換為.dex(即Dalvik Executable)格式的Java應用程式的運行,.dex格式是專為Dalvik設計的一種壓縮格式,適合記憶體和處理器速度有限的系統。Dalvik經過優化,允許在有限的記憶體中同時運行多個虛擬機器的實例,並且每一個Dalvik應用程式都作為一個獨立的Linux行程執行。獨立的行程可以防止在虛擬機器崩潰的時候所有程式都被關閉。
Java原始碼編譯成dex檔案的過程如第1圖所示。在安卓平台上,Java的原始碼通過Javac編譯器先編譯為class檔案(標準的Java位元組碼),然後利用安卓提供的dx工具將多個class檔案轉換為一個dex檔案。
classes.dex的格式如第2圖所示,主要由幾個部分組成:標頭(Dex Header)、各類表格(Table)、資料區段(Data Section)等。標頭包含了每個區域的大小及偏移信息,各類表格包含各種資料,如字元串表、類別名表、函式表等等,位元組碼裡面透過表格的索引來進行編碼。
資料區段包含了位元組碼等資訊,例如以下語句: 其中「1a01 9408」是真正的Raw的位元組碼,「1a」為opcode,表示const-string,「01」代表暫存器v1,「9408」代表在字元串表中的第894項。
(2)so檔案。安卓平台除了Java平台外,還允許使用C/C++語言進行混合撰寫。同時提供了JNI介面(Java native interface)。JNI介面提供了一系列的介面允許從C/C++語言中操作Java語言中的物件,如設置某個Java物件的屬性(Field)、呼叫Java中的方法(method)等。
由C/C++編寫的原始碼透過安卓平台之原生開發套件(native development kit;NDK)編譯為動態連結函式庫(dynamic-link library;DLL)(so檔案)。
APK在安裝的時候,安卓系統使用虛擬機器(Dalvik或者ART)讀取dex檔案,然後執行dex檔案中的位元組碼。
2.傳統的軟體保護技術
傳統的安卓平台上之軟體程式碼保護技術主要包含程式碼混淆和軟體加殼這兩種技術。程式碼混淆是指將計算機程式的程式碼轉換成一種功能上等價,但是難以閱讀和理解的形式之行為。程式碼混淆並不能真正阻止逆向工程,只能增強其理解難度。軟體加殼是另一種應用極其普遍的軟體保護技術。所謂「殼」,即包裹在程式外的一層程式碼,這層程式碼在被保護之程式碼執行前執行,執行解密程式碼、反偵錯等運算,完成這些任務後,再將執行權轉交給目標程式碼。軟體加殼能有效地阻止靜態分析,但很難阻止動態分析,因為最後的解密後的程式碼最終要在記憶體中執行,只要破解者能夠在記憶體中找到解密後的程式碼的地址,那麼脫殼就很容易。
基於虛擬機器的軟體保護技術是在2005年之後流行起來的PC(個人計算機)端軟體保護技術,是目前PC(個人計算機)端最有效也是最流行的軟體保護技術,如「VMProtect」等。
3.安卓平台上的軟體保護技術
目前在安卓平台市面上的保護方案與PC(個人計算機)上類似,主要有程式碼混淆和程式碼加殼技術。
程式碼加殼主要有兩代技術:一代技術基於Java的類別載入技術進行保護,二代技術採用方法(函式)程式碼抽取加密的方式實作。
一代技術使用Java本身提供的類別載入技術,classes.dex被完整加密,存放到APK的資源中。運行時修改程式入口,將加密後的classes.dex在記憶體中解密,並讓Dalvik/ART虛擬機器載入執行。
二代技術將原APK中的所有方法(函式)的程式碼提取出來,單獨加密,當Dalvik/ART虛擬機器要執行某個方法(函式)時,加固引擎才解密該方法(函式),並將解密後的程式碼交給Dalvik/ART虛擬機器的執行引擎執行。
可以看出一代和二代最終都需要將被保護的程式碼解密後,交給Dalvik/ART虛擬機器的執行引擎執行,只不過二者的保護粒度不同,一代在Davlik/ART虛擬機器的類別載入模組進行攔截,就可以導出(dump)最終的保護程式碼。二代則需要更進一步地深入Dalvik/ART虛擬機器,在虛擬機器執行引擎這塊進行攔截,即可以導出(dump)解密後的程式碼。
從本質來說,一代和二代的技術都是一種程式碼的隱藏技術,最終程式碼還是通過Dalvik/ART虛擬機器進行執行的。因此,破解者可以透過建構一個自己修改過的虛擬機器(Dalvik/ART虛擬機器都是開源的),對保護方案進行脫殼。
以上在此先前技術章節中所揭露之資訊僅用於增強對本發明之背景之理解,且因此,其可能含有並不構成先前技術之資訊。
為克服現有技術的上述缺陷,根據本發明的一個方面,提出了一種安卓平台上可執行程式的保護方法,包含:步驟1,確定並修改APK應用程式套件中的classes.dex檔案中要保護的函式,形成新的classes.dex檔案;步驟2,編寫函式的C/C++語言實作,將函式的C/C++語言實作編譯為動態連結函式庫;以及步驟3,在APK應用程式套件中,用新的classes.dex檔案替換原classes.dex檔案,將動態連結函式庫加入APK應用程式套件。
進一步而言,步驟1更包含:步驟11,反編譯classes.dex檔案,得到第一檔案;步驟12,確定第一檔案中要保護的函式;步驟13,在第一檔案中將要保護的函式變為native函式,並清空函式內容;以及步驟14,編譯第一檔案,形成新的classes.dex檔案。
更進一步而言,步驟2更包含:步驟21,保存在原classes.dex中要保護的函式對應的位元組碼,採用位元組碼轉換引擎將要保護的函式對應的位元組碼轉換為新的位元組碼;步驟22,建立C/C++語言檔案,C/C++語言檔案的內容包含:陣列,用於保存新的位元組碼;原生函式,用於使用C/C++實作新的位元組碼;直譯器執行函式,由原生函式呼叫,以用於根據新的位元組碼的語意進行直譯;以及註冊部分,註冊部分用於將原生函式與要保護的函式建立註冊關係;以及步驟23,採用安卓平台的NDK將C/C++語言檔案編譯生成動態連結函式庫。
再進一步而言,直譯器執行函式的實作步驟包含:步驟41,分配記憶體:步驟42,將程式計數器(program counter;PC)指標指向陣列的首地址,進入無限迴圈;步驟43,在無限迴圈中,取出陣列中的指令後,解析指令的運算碼,執行運算碼代表的語意;以及步驟44,讀取下一條指令,如果沒有指令則退出無限迴圈。
本發明的保護方法主要具有以下優點:
(1)安全性高。被保護的方法(函式)其位元組碼由標準的位元組碼轉換成了自定義的位元組碼格式,對於破解者來說,即使在記憶體中拿到了自定義的位元組碼的內容,還需要去分析和理解這種自定義的位元組碼格式,因此,破解者需要花費大量的時間來逆向自定義的直譯引擎。
另外,本發明是基於函式級別的保護,因此,還可以構建多套不同的直譯引擎,不同的函式採用不同的自定義的位元組碼,可以進一步提高安全性。
(2)靈活性好。使用者可以選擇某些關鍵的函式進行保護,從而在性能和安全性間得到平衡。
(3)後向的兼容性。由於自定義的直譯器都是採用標準的JNI函式來構建,JNI函式是Java的一個標準規範,安卓上的虛擬機器,無論Dalvik虛擬機器或者ART虛擬機器,都會實作這套函式介面,因此,自定義的直譯器不依賴於具體虛擬機器是如何實作的,具有後向的兼容性。
第1圖為例示Java程式編譯流程之流程圖;第2圖為例示classes.dex檔案的格式之示意圖;第3圖為根據本發明之一或多個實施例之可執行程式之保護方法之流程圖。
如圖所示,為了能明確實現本發明的實施例的流程,在圖式 中描述了特定的裝置和運行順序,但這僅為示意需要,並非意圖將本發明限定在該特定裝置、順序、器件和環境中,根據具體需要,本發明所屬技術領域中具有通常知識者可以將這些器件和環境進行調整或者修改,所進行的調整或者修改仍然包含在後附的申請專利範圍中。
下面結合圖式和具體實施例對本發明提供的一種安卓平台的可執行程式的保護方法進行詳細描述。
在以下的描述中,將描述本發明的多個不同的方面。然而,對於本發明所屬技術領域中具有通常知識者而言,可以僅僅利用本發明的一些或者全部結構或者流程來實施本發明。為了解釋的明確性,本說明書闡述了特定的數目、配置和順序,但明顯可知,在沒有這些特定細節的情況下本發明所屬技術領域中具有通常知識者也可以實施本發明。在其他情況下,為了不混淆本發明,對於一些眾所周知的特徵將不再進行詳細闡述。
本發明的基本原理是將classes.dex的位元組碼轉化成一種新的自定義格式的位元組碼,然後使用一個針對這種自定義格式位元組碼的直譯器來直譯新的位元組碼,如第3圖所示。
根據本發明所提供的安卓平台上可執行程式的保護方法,包含:步驟1,確定並修改APK應用程式套件中classes.dex檔案中所需要保護的函式,形成新的classes.dex檔案;步驟2,編寫函式的C/C++語言實作,將函式的C/C++語言實作編譯為動態連結函式庫;步驟3,在APK應用程式套件中,用新的classes.dex檔案替換原classes.dex檔案,將動態連結函式庫加入APK應用程式套件。
進一步而言,步驟1更包含:步驟11,反編譯classes.dex檔案,得到第一檔案;步驟12,確定第一檔案中要保護的函式;步驟13,在第一檔案中將要保護的函式變為native函式,並清空函式內容;以及步驟14,編譯第一檔案,形成新的classes.dex檔案。
進一步而言,步驟2更包含:步驟21,保存在原classes.dex中要保護的函式對應的位元組碼,採用位元組碼轉換引擎將要保護的函式對應的位元組碼轉換為新的位元組碼;步驟22,建立C/C++語言檔案,C/C++語言檔案的內容包含:陣列,用於保存新的位元組碼;原生函式,用於使用C/C++實作新的位元組碼;直譯器執行函式,由原生函式所呼叫,以用於根據新的位元組碼的語意進行直譯;以及註冊部分,用於將原生函式與要保護的函式建立註冊關係;以及步驟23,採用安卓平台的NDK將C/C++語言檔案編譯生成動態連結函式庫。
進一步而言,直譯器執行函式的實作步驟包含:步驟41,分配記憶體:步驟42,將程式計數器指標指向陣列的首地址,進入無限迴圈;步驟43,在無限迴圈中,取出陣列中的指令後,解析指令的運算碼,執行運算碼代表的語意;以及步驟44,讀取下一條指令,如果沒有指令則退出無限迴圈。
下面以一個具體的例子說明本發明的技術內容。
1.對於一個APK應用程式套件,首先找到classes.dex檔案,透過反編譯將其變成可讀的檔案,意即人可以識別的檔案。
反編譯方法和工具有很多,這裡以smali工具為例進行示範和說明。
在反編譯後的檔案中掃描函式,找出該檔案中所有的函式名。
假設APK裡面有如下的Java方法(函式)(Demo方法)需要保護,採用smali反編譯後程式碼格式如下:
2.將函式的程式碼刪除,並在函式名前增加native,結果如下: 並將此檔案再重新編譯為新的classes.dex。
3.在原classes.dex檔案中找到所保護函式對應的位元組碼,例如,上面Demo函式的位元組碼如下: 直線的前後兩部分分別為位元組碼,和位元組碼對應的助憶碼。
demo函式的位元組碼為:「6200 031e 1a01 9408 6e20 9042 1000 0e00」。
4.位元組碼轉換
使用位元組碼轉換引擎將所保護函式對應的位元組碼轉換成新的位元組碼。
位元組碼轉換引擎的運算:首先隨機生成運算碼(opcode)的映射表,然後根據該映射表對原來的位元組碼進行映射,生成新的自定義的位元組碼,例如:
Demo函式的位元組碼轉換如下:
原位元組碼:6200031e 1a01 9408 6e20 9042 1000 0e00
映射後的新位元組碼:c2000b1e 0301 9c08 a720 b142 1000 e300
5.生成自定義的位元組碼對應的原生函式(意即native函式)、直譯器和註冊部分
創建C++語言檔案,其內容為(1)新的位元組碼用C++實作的原生函式,它用一個陣列(如codebuf)保存轉換後的位元組碼,然後將該位元組碼交給直譯器(vmpInterpret函式)執行;(2)直譯器是一個功 能函式,主要作用是:讀取新的位元組碼,然後根據位元組碼的語意進行直譯(直譯器的詳細實作在後面會詳細介紹);(3)註冊上述原生函式的註冊部分。
例如,Demo方法(函式)的native函式實作如下:
註冊部分內容為:(1)為每個要註冊的函式生成本地註冊函式結構;JNINativeMethod結構描述了Java方法(函式)和C函式的對應關係,並建立聯繫;(2)使用JNI的函式FindClass得到該方法(函式)所對應的類別(class);(3)使用JNI的函式RegisterNatives將(1)和(2)得到的內容向JVM註冊本地函式。
對於上例中的Demo方法(函式),註冊部分內容如下:
程式碼的格式和函式名、參數等都是符合JNI規範的,其中,JNINativeMethod的結構如下:
此外,直譯器的實作也在此檔案內,以方便生成動態連結函式庫。
6.新的動態連結函式庫
採用安卓平台的NDK將原生函式、直譯器和註冊部分,編譯生成新的動態連結函式庫(so檔案)。這樣,註冊函式將C/C++層面的函式「com_bangcle_helloworld_Demo_Demo」與Java方法(函式)Demo建立註冊關係,當Demo方法(函式)被呼叫的時候,Dalvik或者ART虛擬機器會實際呼叫到C層面的「com_bangcle_helloworld_Demo_Demo」函式。
7.生成新的apk檔案
將新的classes.dex檔案替換掉原APK中的classes.dex檔案,將動態連結函式庫檔案(so檔案)***原APK中。這樣組成的新的APK應用程式套件就是實施保護後的APK應用程式套件。
8.直譯器的虛擬碼(pseudocode)如下圖:
Dalvik虛擬機器的位元組碼是一種基於暫存器的指令集。因此自定義虛擬機器也需要構造出分配出一段記憶體作為運行時使用的暫存器陣列。Dalvik虛擬機器對於每個方法(函式)會指明該方法(函式)所需要的最大暫存器數目。
自定義直譯器首先會分配一段記憶體,記憶體大小等於(最大暫存器的個數* 4字節),作為後續執行過程中使用到的暫存器陣列。然後將PC指標指向codebuf的首地址,然後進入一個無限迴圈中,在此迴圈中,解析每條指令的opcode,然後執行該opcode的語意,執行完後,讀取codebuf中的下一條指令,賦予PC。如果沒有指令,則退出該無限迴圈。
自定義直譯器的難點在於如何實作每個opcode的語意。
安卓平台的位元組碼可以分為兩種類型:(1)不涉及Java語意的基本運算,如基本的算術運算、基本的暫存器賦值運算、條件跳轉、return運算等。(2)涉及Java語意的運算,如物件的生成運算、物件屬性的讀取運算、陣列的運算、函式呼叫運算、鎖(Lock)的運算。
下面詳述這兩類運算的不同實作
(1)不涉及Java語意的基本運算
這類運算基本上是在暫存器上進行運算,不涉及和Java物件的互動。
●基本的算術運算
此類運算包含加減乘除、移位運算、強制轉換運算等。基本的處理模式就是解析指令中的參數,得到運算的是哪幾個暫存器,然後在幾個暫存器上執行相應的運算。
例子:「add-int vAA,vBB,vCC」的實作
●基本的暫存器賦值運算
此類運算主要是以move為前序的指令,基本語意是從將一個暫存器的值賦給另外一個暫存器。
例子:move vA,vB
●條件跳轉
這類指令主要是以IF為前序的一些指令,主要的區別是會修改PC值,如果條件滿足,PC值等於當前PC+偏移量(如下例的CCCC的值)。
例子:IF-EQ vA,vB+CCCC
●return運算
這類指令主要是以RETURN為前序的一些指令,主要工作是 設置返回值,然後從直譯器中返回。
例子:return vAA
(2)涉及Java語意的基本運算
這類運算涉及Java的物件的運算。在C/C++層面不能直接訪問Java物件,但是Java提供了JNI介面,通過JNI介面可以對Java物件進行運算,因此這類的運算要通過JNI函式的呼叫來建構對指令的正確運算。
●物件以及陣列的生成運算
該運算生成一個新的Java物件或者Java陣列,有「new-instance」、「new-array」兩個指令。「new-instance」實作的核心是使用JNI的「AllocObject」函式來生成新的Java物件。
「new-array」指令實作的核心是根據指令的參數,使用不同的「New[type]Array」來生成對應類型的物件,例如:如果參數是物件,使用「NewObjectArray」,如果參數是boolean,則使用「NewBooleanArray」等。
例子:new-instance vAA,class@BBBB
●物件屬性的讀取運算
這類指令是對物件裡面的屬性進行讀寫運算。包含.
「iget/iput」是對物件中的非靜態(non-static)屬性進行讀取運算,這類指令使用JNI函式「Get[type]Field」系列函式來實作。
「sget/sput」是對物件中的靜態(static)屬性進行讀取運算,這類指令使用JNI函式「GetStatic[type]Field」系列函式來實作。
例子:iget-obiect vA,vB,field@CCCC
●陣列的讀寫運算
這類指令是對陣列裡某個元素進行讀寫,包含.
「aget/aput」系列的指令,通過使用JNI的「Get[Type]ArrayElements」等一系列的函式來實作。
例子:aget-object vAA,vBB,vCC
●函式呼叫運算
這類運算主要是對Java層面的函式進行呼叫,包含:
「invoke-static」系列的指令呼叫Java的靜態函式,使用JNI介面中「CallStatic[type]Method」系列函式來實作。
「invoke-virtual」、「invoke-interface」系列的指令呼叫Java的成員函式、介面等,使用JNI介面中「Call[type]method」系列函式來實作。
「invoke-super」和「invoke-direct」系列的指令呼叫Java的父類別、private函式等,使用JNI介面中「CallNonvirtual[type]Method」系列函式來實作。
例子:invoke-virtual vB,{vD,vE,vF,vG,vA}, meth@CCCC
●鎖的運算
這類指令主要有兩個「Monitor-enter(進入臨界區)」和「moniter-exit(退出臨界區)」。採用JNI函式「env->MonitorEnter」和「env->MoniterExit」來實作。
●例外(exception)處理的運算
Java支持例外的處理,這類指令有「move-exception」、「throw」等,這類指令可以採用「env->ExceptionClear」、「env->ExceptionOccurred」、「env->ThrowNew」以及「env->Throw」等JNI的函式進行實作。
(3)JNI物件引用表的問題
在自定義直譯器執行過程中,會產生大量的臨時Java物件(jobject),在Android JNI的規範中,一個native函式最多只能有512個Java物件的引用,如果超過512個,則會報「JNIERROR(app bug):local reference table overflow(max=512)」錯誤,因此自定義直譯器需要處理這種情況。
JNI介面提供了「DeleteLocalRef」來手動刪除不再使用jobject的引用。
在本發明中採用類似於垃圾收集的方式來處理這種情況。其思想是在自定義直譯器執行過程中,如果一個jobject不在當前的暫存器陣列中,則可以安全的刪除。
演算法如下:
本方法也可以應用在PC(個人計算機)上,例如通過對J2SE的jar檔案進行同樣的或類似的運算,即可實作可執行程式的保護。
最後應說明的是,以上實施例僅用以描述本發明的技術方案而不是對本技術方法進行限制,本發明在應用上可以延伸為其他的修改、變化、應用和實施例,並且因此認為所有這樣的修改、變化、應用、實施例都在本發明的精神和教導範圍內。

Claims (5)

  1. 一種用於安卓(Android)平台上之一可執行程式之保護方法,該保護方法包含以下步驟:步驟1,確定並修改一APK應用程式套件(Android application package)中之一第一classes.dex檔案中所需要保護之一欲保護函式,形成新的一第二classes.dex檔案;步驟2,編寫該欲保護函式的一C/C++語言實作,將該欲保護函式的該C/C++語言實作編譯成一動態連結函式庫(dynamic-link library;DLL),其中該步驟2更進一步包含以下步驟:步驟21,保存在該第一classes.dex檔案中之該欲保護函式所對應之一位元組碼(bytecode),採用一位元組碼轉換引擎將該欲保護函式所對應之該位元組碼轉換成一新的位元組碼,其中該位元組碼轉換引擎係根據隨機生成之一運算碼映射表,將該位元組碼轉換成該新的位元組碼;步驟22,建立一C/C++語言檔案,該C/C++語言檔案之內容包含:一陣列,該陣列用於保存該新的位元組碼;一原生函式,該原生函式用於使用C/C++程式語言實作該新的位元組碼;一直譯器執行函式,該直譯器執行函式由該原生函式所呼叫,以用於根據該新的位元組碼之一語意進行直譯;和一註冊部分,該註冊部分用於將該原生函式與該欲保護函 式建立一註冊關係;以及步驟23,採用安卓平台的一原生開發套件(native development kit;NDK)將該C/C++語言檔案編譯以生成該動態連結函式庫;以及步驟3,在該APK應用程式套件中,用該第二classes.dex檔案替換該第一classes.dex檔案,將該動態連結函式庫加入該APK應用程式套件中。
  2. 如請求項1所述之保護方法,其中該步驟1更進一步包含以下步驟:步驟11,反編譯該第一classes.dex檔案,得到一第一檔案;步驟12,確定該第一檔案中所需要保護之該欲保護函式;步驟13,清空該第一檔案之該欲保護函式之內容,並在該欲保護函式之函式名前增加native字串,使該欲保護函式轉變為一native函式;以及步驟14,編譯該第一檔案,形成該第二classes.dex檔案。
  3. 如請求項1所述之保護方法,其中該直譯器執行函式的實作步驟包含:步驟41,分配記憶體:步驟42,將一程式計數器指標指向該陣列的一首地址,進入一無限迴圈;步驟43,在該無限迴圈中,取出該陣列中的一指令後,解析該指令的一運算碼(opcode),執行該運算碼代表的一語意;以及步驟44,讀取一下一條指令,如果不存在該下一條指令則退出該無限迴圈。
  4. 如請求項3所述之保護方法,其中該運算碼如果不涉及Java語意之運算,則在暫存器上進行運算。
  5. 如請求項3所述之保護方法,其中該運算碼如果涉及Java語意之運算,則透過一JNI介面(Java native interface)對一Java物件進行運算。
TW106128965A 2017-04-19 2017-08-25 安卓平台上可執行程式的保護方法 TWI648648B (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CN201710257478.6A CN108733988B (zh) 2017-04-19 2017-04-19 安卓平台上可执行程序的保护方法
??201710257478.6 2017-04-19

Publications (2)

Publication Number Publication Date
TW201839644A TW201839644A (zh) 2018-11-01
TWI648648B true TWI648648B (zh) 2019-01-21

Family

ID=63856464

Family Applications (1)

Application Number Title Priority Date Filing Date
TW106128965A TWI648648B (zh) 2017-04-19 2017-08-25 安卓平台上可執行程式的保護方法

Country Status (3)

Country Link
CN (1) CN108733988B (zh)
TW (1) TWI648648B (zh)
WO (1) WO2018192025A1 (zh)

Families Citing this family (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108932406B (zh) * 2017-05-18 2021-12-17 北京梆梆安全科技有限公司 虚拟化软件保护方法和装置
CN109543369B (zh) * 2018-11-23 2022-03-25 杭州哲信信息技术有限公司 一种dex的保护方法
CN110046479B (zh) * 2019-03-21 2023-02-28 腾讯科技(深圳)有限公司 一种基于安卓操作***的链接库文件反调试方法及装置
CN110298146B (zh) * 2019-06-27 2022-04-22 北京奇艺世纪科技有限公司 一种应用程序的处理、运行方法及装置
US10783082B2 (en) 2019-08-30 2020-09-22 Alibaba Group Holding Limited Deploying a smart contract
CN110675256B (zh) * 2019-08-30 2020-08-21 阿里巴巴集团控股有限公司 部署和执行智能合约的方法及装置
CN112860224B (zh) * 2019-11-28 2023-12-12 北京达佳互联信息技术有限公司 一种函数执行环境构建方法、装置、电子设备及存储介质
CN111274551B (zh) * 2019-12-30 2023-06-27 上海上讯信息技术股份有限公司 基于编译器的java代码保护方法、装置及电子设备
CN111597514B (zh) * 2020-04-15 2023-10-13 卓望数码技术(深圳)有限公司 安卓源代码保护方法和装置
CN112114809B (zh) * 2020-08-07 2022-09-09 厦门安胜网络科技有限公司 一种程序代码安全防护方法、装置及存储介质
CN112306584A (zh) * 2020-10-19 2021-02-02 北京字节跳动网络技术有限公司 一种应用程序运行控制方法、装置、介质和设备
CN112486496A (zh) * 2020-11-25 2021-03-12 上海连尚网络科技有限公司 一种用于生成和运行so文件的方法与设备
CN112506569B (zh) * 2020-12-14 2023-06-20 杭州趣链科技有限公司 一种字节码执行方法、字节码执行装置及终端设备
CN112667975B (zh) * 2020-12-29 2024-04-26 西北工业大学 一种基于混合加固Android***应用软件安全防护方法
CN112947929B (zh) * 2021-01-28 2023-11-24 抖音视界有限公司 应用程序安装包的构建方法、装置、计算机设备和介质
CN115080006A (zh) * 2021-03-15 2022-09-20 武汉斗鱼网络科技有限公司 一种数据调用方法及相关设备
CN113296834B (zh) * 2021-05-21 2023-11-03 南京大学 一种基于逆向工程的安卓闭源服务类型信息提取方法
CN113220314B (zh) * 2021-05-31 2023-07-21 北京奇艺世纪科技有限公司 App资源加载及apk生成方法、装置、设备及介质
CN113419734B (zh) * 2021-06-17 2022-10-04 网易(杭州)网络有限公司 应用程序加固的方法、装置及电子设备

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102760219A (zh) * 2011-12-20 2012-10-31 北京安天电子设备有限公司 一种Android平台软件保护***、方法及设备
CN104573490A (zh) * 2013-10-29 2015-04-29 桂林电子科技大学 Android平台上已安装软件保护方法
CN106228041A (zh) * 2016-07-21 2016-12-14 北京理工大学 一种针对Android预编译的代码保护方法

Family Cites Families (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101114320A (zh) * 2006-07-28 2008-01-30 上海山丽信息安全有限公司 应用程序保护装置和方法
CN102087605B (zh) * 2011-01-28 2014-05-07 宇龙计算机通信科技(深圳)有限公司 一种基于android平台应用安装控制方法及***
CN102136053B (zh) * 2011-03-14 2014-12-10 中兴通讯股份有限公司 对可执行文件源代码保护的方法及装置
CN102236757A (zh) * 2011-06-30 2011-11-09 北京邮电大学 一种适用于Android***的软件保护方法及***
CN102231117B (zh) * 2011-07-08 2013-08-14 盛乐信息技术(上海)有限公司 一种在嵌入式平台安装软件的方法和***
US8892876B1 (en) * 2012-04-20 2014-11-18 Trend Micro Incorporated Secured application package files for mobile computing devices
CN103914637B (zh) * 2013-01-07 2017-06-09 北京洋浦伟业科技发展有限公司 一种安卓平台的可执行程序加密方法
US9116712B2 (en) * 2013-02-28 2015-08-25 Microsoft Technology Licensing, Llc Compile based obfuscation
CN103413075B (zh) * 2013-07-10 2016-05-04 北京深思数盾科技股份有限公司 一种通过虚拟机保护java可执行程序的方法及设备
CN103324872B (zh) * 2013-07-12 2016-04-27 上海交通大学 基于指令混淆的Android应用程序保护方法及***
CN104932902B (zh) * 2015-07-09 2019-07-12 魅族科技(中国)有限公司 一种生成apk文件的方法及终端
CN106557350B (zh) * 2015-09-30 2019-12-13 北京金山安全软件有限公司 应用程序安装包中java字节码转换方法、装置及设备
CN106203006A (zh) * 2016-08-31 2016-12-07 北京鼎源科技有限公司 基于dex与so文件动态执行的Android应用加固方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102760219A (zh) * 2011-12-20 2012-10-31 北京安天电子设备有限公司 一种Android平台软件保护***、方法及设备
CN104573490A (zh) * 2013-10-29 2015-04-29 桂林电子科技大学 Android平台上已安装软件保护方法
CN106228041A (zh) * 2016-07-21 2016-12-14 北京理工大学 一种针对Android预编译的代码保护方法

Also Published As

Publication number Publication date
TW201839644A (zh) 2018-11-01
CN108733988A (zh) 2018-11-02
WO2018192025A1 (zh) 2018-10-25
CN108733988B (zh) 2023-01-24

Similar Documents

Publication Publication Date Title
TWI648648B (zh) 安卓平台上可執行程式的保護方法
CN108932406B (zh) 虚拟化软件保护方法和装置
Watson et al. Capability hardware enhanced RISC instructions: CHERI instruction-set architecture (version 7)
US9891900B2 (en) Generation of specialized methods based on generic methods and type parameterizations
CN108681457B (zh) 基于代码下沉与残码解释的Android应用程序保护方法
Chan et al. Advanced obfuscation techniques for Java bytecode
Zeng et al. Obfuscation resilient binary code reuse through trace-oriented programming
EP2076863B1 (en) Virtualization for diversified tamper resistance
CN107924326B (zh) 对经更新的类型的迁移方法进行覆盖
Low Java control flow obfuscation
BRPI0614089A2 (pt) método para evitar engenharia reversa de software, modificação não autorizada e interceptação de dados de tempo de execução
Watson et al. Capability hardware enhanced RISC instructions: CHERI instruction-set architecture
Cimato et al. Overcoming the obfuscation of Java programs by identifier renaming
Luckow et al. HVMTP: a time predictable and portable java virtual machine for hard real-time embedded systems
Okhravi et al. One giant leap for computer security
Tilevich et al. Transparent program transformations in the presence of opaque code
Foket et al. Pushing java type obfuscation to the limit
Roussel et al. Android 292: implementing invokedynamic in Android
Singer Towards Secure MicroPython on Morello (WIP)
Tullmann The Alta operataing system
Altidor et al. Refactoring Java generics by inferring wildcards, in practice
Larmuseau et al. Implementing a secure abstract machine
Puder et al. Towards an XML-based bytecode level transformation framework
Staursky Lambda Calculus for Binary Security and Analysis
Hansen Flow logic for language-based safety and security