CN108733988B - 安卓平台上可执行程序的保护方法 - Google Patents

安卓平台上可执行程序的保护方法 Download PDF

Info

Publication number
CN108733988B
CN108733988B CN201710257478.6A CN201710257478A CN108733988B CN 108733988 B CN108733988 B CN 108733988B CN 201710257478 A CN201710257478 A CN 201710257478A CN 108733988 B CN108733988 B CN 108733988B
Authority
CN
China
Prior art keywords
function
native
file
protected
new
Prior art date
Legal status (The legal status 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 status listed.)
Active
Application number
CN201710257478.6A
Other languages
English (en)
Other versions
CN108733988A (zh
Inventor
阚志刚
陈彪
王卫民
朱丹
程显龙
卢佐华
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Bangcle Technology Co ltd
Original Assignee
Beijing Bangcle Technology Co ltd
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 Beijing Bangcle Technology Co ltd filed Critical Beijing Bangcle Technology Co ltd
Priority to CN201710257478.6A priority Critical patent/CN108733988B/zh
Priority to PCT/CN2017/083952 priority patent/WO2018192025A1/zh
Priority to TW106128965A priority patent/TWI648648B/zh
Publication of CN108733988A publication Critical patent/CN108733988A/zh
Application granted granted Critical
Publication of CN108733988B publication Critical patent/CN108733988B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

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

Abstract

本申请提供一种安卓平台上可执行程序的保护方法,包括:确定APK文件包中的classes.dex文件中要保护的函数,修改后形成新的classes.dex文件;编写函数的C/C++语言实现;将函数的C/C++语言实现编译为动态库;在APK文件包中,用新的classes.dex文件替换原classes.dex文件,将动态库加入APK文件包。本发明不但加大了逆向分析的难度,而且极大增加了还原代码的难度。

Description

安卓平台上可执行程序的保护方法
技术领域
本发明涉及软件处理技术,更具体地,涉及一种用于安卓平台的可执行程序的保护方法。
背景技术
Android平台上采用Java语言进行开发,Java语言是一种跨平台的,解释性的语言,Java的源代码编译为一种“字节码”形式的中间代码,这种字节码保留了很多源代码的信息,例如方法名,变量名等,从而Java字节码的反编译变得非常容易。为了保护Android程序的应用版权等,需要对应用程序进行保护。
1.Android平台基本介绍
APK是android平台上的可执行程序,其本质是一个zip文件,主要包括以下几类文件:classes.dex、so文件、AndroidManifest.xml、其他资源文件(图片、xml等)
(1)classes.dex是Dalvik的可执行程序,该文件里面存放了所有的java源代码经过编译后的字节码。也是本发明要保护的对象。
Dalvik是Google公司自己设计用于Android平台的虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
Java源代码编译为dex文件的过程如图1所示。在Android平台上,Java的源代码通过Javac编译器先编译为.class文件(标准的Java字节码),然后利用Android提供的工具dx将多个class文件转换为一个dex文件
Classes.dex的格式如图2所示,主要由几个部分组成----头部(Dex Header)、各类表(Table)、数据段(Data Section)等。头部包含了每个区域的大小及偏移信息,各类表包含各种数据,如字符串表、类名表、函数表等等,字节码里面通过表的索引来进行编码。
数据段包括了字节码等信息,例如以下语句
100b64:1a01 9408|0002:const-string v1,"Hello world"//string@0894
1a01 9408是真正的Raw的字节码,1a为OPCode,表示const-string,01代表寄存器v1,9408代表在字符串表中的第894项
(2)So文件。Android平台除了Java平台外,还允许使用C/C++语言进行混合编程。同时提供了JNI接口(Java native interface)。JNI接口提供了一系列的接口允许从C/C++语言中操作Java语言中的对象,如设置某个Java对象的域(Field)、调用Java中的函数(method)等。
C/C++编写的源代码通过Android NDK编译为动态库(so文件)。
APK在安装的时候,Android系统使用虚拟机(Dalvik或者ART)读取dex文件,然后执行dex文件中的字节码。
2.传统的软件保护技术
传统的Android平台上软件代码保护技术主要包括代码混淆和软件加壳这两种技术。代码混淆是指将计算机程序的代码转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆并不能真正阻止逆向工程,只能增大其理解难度。软件加壳是另一种应用极其普遍的软件保护技术。所谓“壳”,即包裹在程序外的一层代码,这层代码在被保护代码执行前执行,执行解密代码、反调试等操作,完成这些任务后,再将执行权转交给目标代码。软件加壳能有效地阻止静态分析,但很难阻止动态分析,因为最后的解密后的代码最终要在内存中执行,只要破解者能够在内存中找到解密后的代码的地址,那么脱壳就很容易。
基于虚拟机的软件保护技术是在2005年之后流行起来的PC端软件保护技术,是目前PC端最有效也是最流行的软件保护技术,如Vmprotect[1]等。
3.Android平台上的软件保护技术
目前在Android平台市面上的保护方案与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文件,形成新的classes.dex文件;步骤2,生成自定义的字节码与所要保护的函数相对应的原生函数;编写所述原生函数的C/C++语言实现,将所述原生函数native的C/C++语言实现编译为动态库;所述的动态库至少包括由所述自定义的字节码的原生函数构成的解释器;和步骤3,在APK文件包中,用新的classes.dex文件替换原classes.dex文件,将动态库加入APK文件包。
进一步的,步骤1包括:步骤11,反编译classes.dex文件,得到第一文件;步骤12,确定第一文件中要保护的函数;步骤13,在第一文件中将要保护的函数变为native函数,并清空函数内容;和步骤14,编译第一文件,形成新的classes.dex文件。
进一步的,步骤2中所述的原生函数为native函数。
进一步的,步骤2中所述的原生函数,由不涉及Java语义的基本算术操作函数、或者基本寄存器赋值操作函数、或者条件跳转操作函数构成。
进一步的,步骤2中所述的原生函数,由涉及Java语义的对象生成操作函数、或者对象域读取操作函数、或者数组操作函数、或者函数调用操作函数、或锁的操作函数构成。
进一步的,步骤2包括:步骤21,保存在原classes.dex中要保护的函数对应的字节码,采用字节码转换引擎将要保护的函数对应的字节码转换为新的字节码;步骤22,建立C/C++语言文件,C/C++语言文件的内容包括:
数组,数组用于保存新的字节码;
原生函数,原生函数用于使用C/C++实现新的字节码;
解释器执行函数,解释器执行函数由原生函数调用,以用于根据新的字节码的语义进行解释执行;和注册部分,注册部分用于将原生函数与要保护的函数建立注册关系;
步骤23,采用Android平台的NDK将C/C++语言文件编译生成动态库。
进一步的,解释器执行函数的实现步骤包括:步骤41,分配内存:步骤42,将PC指针指向数组的首地址,进入无限循环;步骤43,在无限循环中,取出数组中的指令后,解析指令的操作数,执行操作数代表的语义;和步骤44,读取下一条指令,如果没有指令则退出无限循环。
本发明的保护方案主要具有以下优点:
(1)安全性高。被保护的方法其字节码由标准的字节码转换成了自定义的字节码格式,对于破解者来说,即使在内存中拿到了自定义的字节码的内容,还需要去分析和理解这种自定义的字节码格式,因此,破解者需要花费大量的时间来逆向自定义的解释引擎。
另外,本发明是基于函数级别的保护,因此,还可以构建多套不同的解释引擎,不同的函数采用不同的自定义的字节码,可以进一步提高安全性。
(2)灵活性好。用户可以选择某些关键的函数进行保护,从而在性能和安全性间得到平衡。
(3)后向的兼容性。由于自定义的解释器都是采用标准的JNI函数来构建,JNI函数时Java的一个标准规范,Android上的虚拟机,无论Dalvik虚拟机或者ART虚拟机,都会实现这套函数接口,因此,自定义的解释器不依赖于具体虚拟机是如何实现的,具有后向的兼容性。
附图说明
图1为Java程序编译流程;
图2classes.dex文件的格式;
图3是根据本发明实施例的可执行程序的保护方法的流程图。
如图所示,为了能明确实现本发明的实施例的流程,在图中描述了特定的设备和运行顺序,但这仅为示意需要,并非意图将本发明限定在该特定设备、顺序、器件和环境中,根据具体需要,本领域的普通技术人员可以将这些器件和环境进行调整或者修改,所进行的调整或者修改仍然包括在后附的权利要求的范围中。
具体实施方式
下面结合附图和具体实施例对本发明提供的一种安卓平台的可执行程序的保护方法进行详细描述。
在以下的描述中,将描述本发明的多个不同的方面,然而,对于本领域内的普通技术人员而言,可以仅仅利用本发明的一些或者全部结构或者流程来实施本发明。为了解释的明确性而言,阐述了特定的数目、配置和顺序,但是很明显,在没有这些特定细节的情况下也可以实施本发明。在其他情况下,为了不混淆本发明,对于一些众所周知的特征将不再进行详细阐述。
本发明的基本原理是将classes.dex的字节码转化成一种新的自定义格式的字节码,然后使用一个针对这种自定义格式字节码的解释器来解释执行新的字节码,如图3所示。
根据本发明的提供的Android平台上保护方法,包括:步骤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,采用Android平台的NDK将C/C++语言文件编译生成动态库。
进一步的,解释器执行函数的实现步骤包括:步骤41,分配内存:步骤42,将PC指针指向数组的首地址,进入无限循环;步骤43,在无限循环中,取出数组中的指令后,解析指令的操作数,执行操作数代表的语义;和步骤44,读取下一条指令,如果没有指令则退出无限循环。
下面以一个具体的例子说明本发明的技术方案。
1.对于一个APK文件包,首先找到classes.dex文件,通过反编译将其变成可以读的文件,即人可以识别的文件。
反编译方法和工具有很多,这里以smali工具为例进行示范和说明。
在反编译后的文件中扫描函数,找出该文件中所有的函数名。
假设APK里面有如下Java函数(Demo函数)需要保护,采用smali反编译后代码格式如下:
Figure GDA0003917469370000081
2.将函数的代码删除,并在函数名前增加native,结果如下:
.method public static native Demo()V
.end method
将此文件再重新编译为新的classes.dex。
3.在原classes.dex文件中找到所保护函数对应的字节码,如上面Demo函数的字节码如下:
Figure GDA0003917469370000091
竖线的前后两部分分别为字节码,和字节码对应的助记符。
demo函数的字节码为:6200 031e 1a01 9408 6e20 9042 1000 0e00
4.字节码转换
使用字节码转换引擎将所保护函数对应的字节码转换成新的字节码。
字节码转换引擎的操作:首先随机化生成操作数(opcode)的映射表,然后根据该映射表对原来的字节码进行映射,生成新的自定义的字节码,例如:
助记符 原操作数 新操作数
const-string 1a 03
sget-object 62 c2
invoke-virtual 6e a7
return-void 0e e3
那么Demo函数的字节码转换如下:
原字节码:6200 031e 1a01 9408 6e20 9042 1000 0e00
映射后的新字节码:c200 0b1e 0301 9c08 a720 b142 1000 e300
5.生成自定义的字节码对应的原生函数(即native函数)、解释器和注册部分
创建C++语言文件,其内容为(1)新的字节码用C++实现的原生函数,它用一个数组(如codebuf)保存转换后的字节码,然后将该字节码交给解释器(vmpInterpret函数)执行;(2)解释器是一个功能函数,主要作用是:读取新的字节码,然后根据字节码的语义进行解释执行(解释器的详细实现在后面会详细介绍);(3)注册上述原生函数的注册部分。
例如:Demo函数的native函数实现如下:
Figure GDA0003917469370000101
注册部分内容如下:
(1)为每个要注册的函数生成本地注册函数结构;JNINativeMethod结构描述了Java函数和C函数的对应关系,并建立联系;
(2)使用JNI的函数FindClass得到该方法所对应的类;
(3)使用JNI的函数RegisterNatives将(1)和(2)得到的内容向JVM注册本地函数。
对于上例中的demo函数,注册部分内容如下:
Figure GDA0003917469370000102
代码的格式和函数名、参数等都是符合JNI规范的,其中,
JNINativeMethod的结构如下:
Figure GDA0003917469370000103
另外,解释器的实现也在此文件内,以方便生成动态库。
6.新的动态库
采用Android平台的NDK(Android原生开发工具包)将原生函数、解释器和注册部分,编译生成新的动态库(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.解释器的伪代码如下图:
Figure GDA0003917469370000111
Dalvik虚拟机的字节码是一种基于寄存器的指令集。因此自定义虚拟机也需要构造出分配出一段内存作为运行时使用的寄存器数组。Dalvik虚拟机对于每个方法会指明该方法所需要的最大寄存器数目。
自定义解释器首先会分配一段内存,内存大小等于(最大寄存器的个数*4字节),作为后续执行过程中使用到的寄存器数组。然后将PC指针指向codebuf的首地址,然后进入一个无限循环中,在此循环中,解析每条指令的opcode,然后执行该opcode的语义,执行完后,读取codebuf中的下一条指令,赋给PC。如果没有指令,则退出该无限循环。
自定义解释器的难点在于如何实现每个Opcode的语义。
Android平台的字节码可以分为两种类型:
(1)不涉及Java语义的基本操作,如基本的算术操作、基本的寄存器赋值操作、条件跳转、return操作等。
(2)涉及Java语义的操作,对象的生成操作、对象域的读取操作、数组的操作、函数调用操作、锁的操作。
下面详述这两类操作的不同实现
(1)不涉及Java语义的基本操作
这类操作基本是在寄存器上进行操作,不涉及和java对象的交互。
·基本的算术操作
此类操作包括加减乘除、移位操作、强制转换操作等。基本的处理模式就是解析指令中的参数,得到操作的是哪几个寄存器,然后在几个寄存器上执行相应的操作。
例子:add-int vAA,vBB,vCC的实现
Figure GDA0003917469370000121
·基本的寄存器赋值操作
此类操作主要是以move为前缀的指令,基本语义是从将一个寄存器的值赋给另外一个寄存器。
例子:move vA,vB
Figure GDA0003917469370000131
·条件跳转
这类指令主要是以IF为前缀的一些指令,主要的区别是会修改PC值如果条件满足,PC值等于当前PC+偏移量(如下例的CCCC的值)。
例子:IF-EQ vA,vB+CCCC
Figure GDA0003917469370000132
·return操作
这类指令主要是以RETURN为前缀的一些指令,主要工作是设置返回值,然后从解释器中返回。
例子:return vAA
Figure GDA0003917469370000133
Figure GDA0003917469370000141
(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
Figure GDA0003917469370000142
·对象域的读取操作
这类指令是对对象里面的域进行读写操作。包括:
iget/iput是对对象中的非静态域进行读取操作,这类指令使用JNI函数Get[type]Field系列函数来实现。
sget/sput是对对象中的静态域进行读取操作,这类指令使用JNI函数GetStatic[type]Field系列函数来实现。
例子:iget-object vA,vB,field@CCCC
Figure GDA0003917469370000151
·数组的读写操作
这类指令是对数组里某个元素进行读写,包括:
AGET/APUT系列的指令,通过使用JNI的Get[Type]ArrayElements等一系列的函数来实现。
例子aget-object vAA,vBB,vCC
Figure GDA0003917469370000152
·函数调用操作
这类操作主要是对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
Figure GDA0003917469370000161
·锁的操作
这类指令主要有两个Monitor-enter(进入临界区)和moniter-exit(退出临界区)。采用JNI函数env->MonitorEnter和env->MoniterExit来实现。
·异常处理的操作
Java支持异常的处理,这类指令有move-exception,throw等,这类指令可以采用env->ExceptionClear,env->ExceptionOccurred,env->ThrowNew,env->Throw等JNI的函数进行实现。
(3)JNI对象引用表的问题
在自定义解释器执行过程中,会产生大量的临时Java对象(jobject),在AndroidJNI的规范中,一个native函数最多只能有512个Java对象的引用,如果超过512个,则会报“JNI ERROR(app bug):local reference table overflow(max=512)”错误,因此自定义解释器需要处理这种情况。
JNI接口提供了DeleteLocalRef来手动删除不再使用jobject的引用。
在本发明中采用类似于垃圾收集的方式来处理这种情况。其思想是在自定义解释器执行过程中,如果一个jobject不在当前的寄存器数组中,则可以安全的删除。
算法如下:
Figure GDA0003917469370000171
本方法也可以应用在PC机上,例如通过对J2SE的jar文件进行同样的或类似的操作,即可实现可执行程序的保护。
最后应说明的是,以上实施例仅用以描述本发明的技术方案而不是对本技术方法进行限制,本发明在应用上可以延伸为其他的修改、变化、应用和实施例,并且因此认为所有这样的修改、变化、应用、实施例都在本发明的精神和教导范围内。

Claims (9)

1.一种安卓平台上可执行程序的保护方法,包括:
步骤1,确定并修改APK文件包中classes.dex文件中要保护的函数;采用字节码转换引擎将所述要保护的函数的字节码转换为新的自定义的新的字节码;建立所有保护的函数的原字节码与新的自定义的映射;将对所要保护的函数修改后的classes.dex文件,形成新的classes.dex文件;
步骤2,生成自定义的字节码与所要保护的函数相对应的原生函数;编写所述原生函数的C/C++语言实现;将所述原生函数native的C/C++语言实现编译为动态库;所述的动态库至少包括由所述自定义的字节码的原生函数 构成的解释器;和
步骤3,在所述APK文件包中,用所述新的classes.dex文件替换原classes.dex文件,将所述动态库加入所述APK文件包。
2.根据权利要求1所述的方法,其中,所述步骤1包括:
步骤11,反编译所述classes.dex文件,得到第一文件;
步骤12,确定所述第一文件中要保护的函数;
步骤13,在所述第一文件中将所述要保护的函数变为native函数,并清空函数内容;和
步骤14,编译所述第一文件,形成新的classes.dex文件。
3.根据权利要求1所述的方法,其中,步骤2中所述的原生函数为native函数。
4.根据权利要求1所述的方法,其中,步骤2中所述的原生函数,由不涉及Java语义的基本算术操作函数、或者基本寄存器赋值操作函数、或者条件跳转操作函数构成。
5.根据权利要求1所述的方法,其中,步骤2中所述的原生函数,由涉及Java语义的对象生成操作函数、或者对象域读取操作函数、或者数组操作函数、或者函数调用操作函数、或锁的操作函数构成。
6.根据权利要求1所述的方法,其中,所述步骤2包括如下步骤:
步骤21,保存在原classes.dex中所述要保护的函数对应的字节码;
步骤22,建立C/C++语言文件,所述C/C++语言文件的内容包括:
数组,所述数组用于保存所述新的字节码;
原生函数,所述原生函数用于使用C/C++实现所述新的字节码;
解释器执行函数,所述解释器执行函数由所述原生函数调用,以用于根据所述新的字节码的语义进行解释执行;和
注册部分,所述注册部分用于将原生函数与所述要保护的函数建立注册关系;和
步骤23,采用Android 平台的NDK将所述C/C++语言文件编译生成动态库。
7.根据权利要求6所述的方法,其中,所述解释器执行函数的实现步骤包括:
步骤41,分配内存:
步骤42,将PC指针指向所述数组的首地址,进入无限循环;
步骤43,在所述无限循环中,取出数组中的指令后,解析指令的操作数,执行所述操作数代表的语义;和
步骤44,读取下一条指令,如果没有指令则退出所述无限循环。
8.根据权利要求7所述的方法,其中,所述操作数是不涉及Java语义的操作,则在寄存器上进行操作。
9.根据权利要求7所述的方法,其中,所述操作数是涉及Java语义的操作,则通过JNI接口对Java对象进行操作。
CN201710257478.6A 2017-04-19 2017-04-19 安卓平台上可执行程序的保护方法 Active CN108733988B (zh)

Priority Applications (3)

Application Number Priority Date Filing Date Title
CN201710257478.6A CN108733988B (zh) 2017-04-19 2017-04-19 安卓平台上可执行程序的保护方法
PCT/CN2017/083952 WO2018192025A1 (zh) 2017-04-19 2017-05-11 安卓平台上可执行程序的保护方法
TW106128965A TWI648648B (zh) 2017-04-19 2017-08-25 安卓平台上可執行程式的保護方法

Applications Claiming Priority (1)

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

Publications (2)

Publication Number Publication Date
CN108733988A CN108733988A (zh) 2018-11-02
CN108733988B true CN108733988B (zh) 2023-01-24

Family

ID=63856464

Family Applications (1)

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

Country Status (3)

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

Families Citing this family (17)

* 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 北京奇艺世纪科技有限公司 一种应用程序的处理、运行方法及装置
CN110675256B (zh) * 2019-08-30 2020-08-21 阿里巴巴集团控股有限公司 部署和执行智能合约的方法及装置
US10783082B2 (en) 2019-08-30 2020-09-22 Alibaba Group Holding Limited Deploying a smart contract
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 北京字节跳动网络技术有限公司 一种应用程序运行控制方法、装置、介质和设备
CN112506569B (zh) * 2020-12-14 2023-06-20 杭州趣链科技有限公司 一种字节码执行方法、字节码执行装置及终端设备
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 网易(杭州)网络有限公司 应用程序加固的方法、装置及电子设备

Family Cites Families (16)

* 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 盛乐信息技术(上海)有限公司 一种在嵌入式平台安装软件的方法和系统
CN102760219B (zh) * 2011-12-20 2015-12-16 北京安天电子设备有限公司 一种Android平台软件保护系统、方法及设备
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应用程序保护方法及系统
CN104573490A (zh) * 2013-10-29 2015-04-29 桂林电子科技大学 Android平台上已安装软件保护方法
CN104932902B (zh) * 2015-07-09 2019-07-12 魅族科技(中国)有限公司 一种生成apk文件的方法及终端
CN106557350B (zh) * 2015-09-30 2019-12-13 北京金山安全软件有限公司 应用程序安装包中java字节码转换方法、装置及设备
CN106228041B (zh) * 2016-07-21 2018-11-20 北京理工大学 一种针对Android预编译的代码保护方法
CN106203006A (zh) * 2016-08-31 2016-12-07 北京鼎源科技有限公司 基于dex与so文件动态执行的Android应用加固方法

Also Published As

Publication number Publication date
TW201839644A (zh) 2018-11-01
CN108733988A (zh) 2018-11-02
TWI648648B (zh) 2019-01-21
WO2018192025A1 (zh) 2018-10-25

Similar Documents

Publication Publication Date Title
CN108733988B (zh) 安卓平台上可执行程序的保护方法
CN108932406B (zh) 虚拟化软件保护方法和装置
CN108681457B (zh) 基于代码下沉与残码解释的Android应用程序保护方法
US11354144B2 (en) Java native interface and windows universal app hooking
Sharif et al. Automatic reverse engineering of malware emulators
US8090959B2 (en) Method and apparatus for protecting .net programs
CN108491235B (zh) 结合动态加载和函数Native化的DEX保护方法
US7353504B2 (en) System and method for efficiently generating native code calls from byte code in virtual machines
US20160239671A1 (en) Method and device for protecting an application and method and device for executing a protected application thus protected
CN107480476B (zh) 一种基于ELF感染的Android本地层指令编译虚拟化加壳方法
US20160357530A1 (en) Method and apparatus for intermediate representation of applications
WO2015164436A1 (en) Manual refinement of specialized classes
WO2013170724A1 (zh) 安卓系统中java应用程序的保护方法
CN104298534B (zh) 基于Lua语言的编程方法和装置
Yadavalli et al. Raising binaries to LLVM IR with MCTOLL (WIP paper)
CN110245467B (zh) 基于Dex2C与LLVM的Android应用程序保护方法
CN106228041B (zh) 一种针对Android预编译的代码保护方法
KR101861341B1 (ko) 애플리케이션 코드의 역난독화 장치 및 이를 이용한 애플리케이션 코드의 역난독화 방법
CN109598107A (zh) 一种基于应用安装包文件的代码转换方法及装置
CN111597514B (zh) 安卓源代码保护方法和装置
CN101030241A (zh) 基于Keil C51的软件保护开发的方法和系统
CN112052433A (zh) 一种Jar文件的虚拟化保护方法、终端及存储介质
KR101536920B1 (ko) Arm 프로세서 기반의 파일 난독화 방법
CN113626773B (zh) 一种基于中间语言的代码保护方法
CN107209815B (zh) 用于使用返回导向编程的代码混淆的方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
CB02 Change of applicant information
CB02 Change of applicant information

Address after: 100083 rooms 1-3, 20 / F, block a, Tiangong building, No.30 Xueyuan Road, Haidian District, Beijing

Applicant after: BEIJING BANGCLE TECHNOLOGY Co.,Ltd.

Address before: Room 01-05 and 19, 6/F, Block A, Tiangong Building, No. 30, Xueyuan Road, Haidian District, Beijing, 100083

Applicant before: BEIJING YANGPUWEIYE SCIE. & TECH. DEVE. Co.,Ltd.

GR01 Patent grant
GR01 Patent grant