CN113127004B - 一种安卓端vmp保护的实现方法及系统 - Google Patents
一种安卓端vmp保护的实现方法及系统 Download PDFInfo
- Publication number
- CN113127004B CN113127004B CN202110491133.3A CN202110491133A CN113127004B CN 113127004 B CN113127004 B CN 113127004B CN 202110491133 A CN202110491133 A CN 202110491133A CN 113127004 B CN113127004 B CN 113127004B
- Authority
- CN
- China
- Prior art keywords
- function
- codeitem
- interpreter
- module
- cpp
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
Abstract
本发明提供了一种安卓端VMP保护的实现方法,所述实现方法包括以下步骤:步骤S1、使用JAVA函数开发应用的功能,将JAVA函数或JNI函数编译后生成so文件的.cpp格式文件命名为pro.cpp;步骤S2、定义一个函数A,将函数A的CodeItem进行复制;步骤S3、将函数A的代码全部删除,且在函数A所在的类别下定义函数A同名的JNI函数;步骤S4、将安卓系统源代码中CodeItem的定义复制到该cpp文件中;步骤S5、在cpp文件定义函数A和解释器函数,且在函数A中调用解释器函数;步骤S6、在解释器函数中将CodeItem的字节数组转换成该cpp文件中定义的CodeItem然后定义虚拟寄存器;步骤S7、逐条取出CodeItem中的指令;步骤S8、通过编译器对APK进行编译;本发明能够在APP的开始时期就能完成对APP的VMP保护。
Description
技术领域
本发明涉及安卓端应用加固技术领域,特别是一种安卓端VMP保护的实现方法及系统。
背景技术
在安卓端,游戏和应用的安全性越来越重要。加固技术不断在迭代,从一代DEX整体加固,二代函数抽取到现在第三代引入VMP来加固应用(通过这个软件保护的代码部分在虚拟机上执行,这使得被保护的程序很难被分析与破解。反汇编程序与MAP文件的运用使您能快速选择需要保护从而避免破解的代码),加固游戏、应用的目的是让增加逆向分析的难度,保护游戏、应用数据不被修改或者运行逻辑不被利用破解,增加应用和游戏的收益。但是,第一代和第二代加固技术可以在网上找到资料,但是第一代和第二代保护力度对于现在来说已经算很弱了,稍微有点经验的逆向分析人员都能通过一些简单的脱壳方法和一些脱壳工具得到完整的源代码。第三代加固技术则在网上找不到很多有关资料,如果要使用VMP来加固应用,需要将自己的源APK文件上传到专门的加固平台进行加固才行。
这样做有以下几个缺点:
1、源APK无保护,上传到其他平台,APK安全性得不到保证,可能出现APK代码泄露,导致安全问题。
2、上传到其他加固平台,需要花钱进行加固,可能往往一个APP就是好几万一年,如果公司有几百个需要加固,那么每年花在VMP加固上的钱将会很多,很不划算。
3、使用其他平台进行VMP加固,那么加固完成之后的应用兼容性和性能得不到保证,可能出现加固之后的APK无法安装或者运行在安卓某些版本。
4、通常源APK一些涉及到与服务端通信或者数据传输的函数方法使用JNI编写,实现麻烦。
发明内容
为克服上述问题,本发明的目的是提供能够在APP的开始时期就能完成对APP的VMP保护的安卓端VMP保护的实现方法。
本发明采用以下方案实现:一种安卓端VMP保护的实现方法,所述实现方法包括以下步骤:
步骤S1、使用JAVA函数开发应用的功能,并且引入JNI函数,将JAVA函数或JNI函数编译后生成so文件的.cpp格式文件命名为pro.cpp;
步骤S2、定义一个函数A,查看函数A的CodeItem,并且将函数A的CodeItem进行复制;
步骤S3、将函数A的代码全部删除,且在函数A所在的类别下定义函数A同名的JNI函数,使其参数类型保持一致;
步骤S4、在pro.cpp中将CodeItem的全部16进制数据定义为字节数组,将安卓系统源代码中CodeItem的定义复制到该cpp文件中;
步骤S5、在cpp文件定义函数A和解释器函数,且在函数A中调用解释器函数;
步骤S6、在解释器函数中将CodeItem的字节数组转换成该cpp文件中定义的CodeItem然后定义虚拟寄存器,申请成功之后分配参数;
步骤S7、逐条取出CodeItem中的指令,根据指令的不同建立选择表,再根据指令的opcode来编写C++代码完成对应的译码工作;
步骤S8、完成代码编写后,通过编译器对APK进行编译,在开发过程中实现VMP对APK的保护作用。
进一步的,所述步骤S5进一步具体为:函数A能够便于传递参数到解释器里面和得到解释器函数的返回值,且便于调用;解释器函数能够对原来的A函数进行取指,译码实现最初函数A实现的功能;函数A和解释器函数参数个数和类型保持和JAVA代码中的A函数一致。
本发明还提供了一种安卓端VMP保护的实现系统,其特征在于:包括引用模块、定义模块、保持模块、复制模块、调用模块、分配模块、译码模块和编译模块;所述引用模块,即使用JAVA函数开发应用的功能,并且引入JNI函数,将JAVA函数或JNI函数编译后生成so文件的.cpp格式文件命名为pro.cpp;所述定义模块,即定义一个函数A,查看函数A的CodeItem,并且将函数A的CodeItem进行复制;所述保持模块,即将函数A的代码全部删除,且在函数A所在的类别下定义函数A同名的JNI函数,使其参数类型保持一致;所述复制模块,即在pro.cpp中将CodeItem的全部16进制数据定义为字节数组,将安卓系统源代码中CodeItem的定义复制到该cpp文件中;所述调用模块,即在cpp文件定义函数A和解释器函数,且在函数A中调用解释器函数;所述分配模块,即在解释器函数中将CodeItem的字节数组转换成该cpp文件中定义的CodeItem然后定义虚拟寄存器,申请成功之后分配参数;所述译码模块,即逐条取出CodeItem中的指令,根据指令的不同建立选择表,再根据指令的opcode来编写C++代码完成对应的译码工作;所述编译模块,即完成代码编写后,通过编译器对APK进行编译,在开发过程中实现VMP对APK的保护作用。
进一步的,所述调用模块进一步具体为:函数A能够便于传递参数到解释器里面和得到解释器函数的返回值,且便于调用;解释器函数能够对原来的A函数进行取指,译码实现最初函数A实现的功能;函数A和解释器函数参数个数和类型保持和JAVA代码中的A函数一致。
本发明的有益效果在于:本发明能够在APP的开始时期就能完成对APP的VMP保护,相较于现在的使用加固平台来加固APP来说,时机更早,更能降低VMP加固保护对APP造成的性能影响;本发明属于第三代加固保护,保护力度更大,使逆向分析人员逆向分析的难度进一步加大;此VMP保护全部基于安卓系统的取指译码过程,更能贴近系统;由于不用使用加固平台加固APP,使得APP源码泄露风险进一步减少,再者使用加固平台价格不菲,因此使用此VMP保护方案还能节约人力财力。就算还需使用加固平台加固该APP,也能最大限度降低APP源码泄露风险;在解释器函数被逆向分析人员拿到后,可以通过修改解释器中的CodeItem来实现解释器的多元化,使得逆向分析人员拿到的解释器函数失效。
附图说明
图1是本发明的方法流程示意图。
图2是本发明的系统原理框图。
具体实施方式
下面结合附图对本发明做进一步说明。
请参阅图1所示,本发明的一种安卓端VMP保护的实现方法,所述实现方法包括以下步骤:
步骤S1、使用JAVA函数开发应用的功能,并且引入JNI函数,将JAVA函数或JNI函数编译后生成so文件的.cpp格式文件命名为pro.cpp;
步骤S2、定义一个函数A,查看函数A的CodeItem,并且将函数A的CodeItem进行复制;
步骤S3、将函数A的代码全部删除,且在函数A所在的类别下定义函数A同名的JNI函数,使其参数类型保持一致;
步骤S4、在pro.cpp中将CodeItem的全部16进制数据定义为字节数组,将安卓系统源代码中CodeItem的定义复制到该cpp文件中;
步骤S5、在cpp文件定义函数A和解释器函数,且在函数A中调用解释器函数;
步骤S6、在解释器函数中将CodeItem的字节数组转换成该cpp文件中定义的CodeItem然后定义虚拟寄存器,申请成功之后分配参数;
步骤S7、逐条取出CodeItem中的指令,根据指令的不同建立选择表,再根据指令的opcode来编写C++代码完成对应的译码工作;
步骤S8、完成代码编写后,通过编译器对APK进行编译,在开发过程中实现VMP对APK的保护作用。
下面结合一实施例对本发明作进一步说明:
1、先正向开发应用,使用JAVA函数开发应用的全部功能,并且引入JNI(Java本地接口书写程序)函数,将其中一个编译之后生成so文件的.cpp格式文件命名为pro.cpp;
2、为了保护APP,对于一些在APP安全中重要级别比较高的函数需要采取VMP保护达到防治逆向人员得到完整代码甚至说不能被逆向分析人员逆向分析得到函数名,比如涉及到与服务端通信的客户端证书相关函数java.security.KeyStore.PrivateKeyEntry的调用,又或者https相关的java.net.SocketOutputStream和java.net.SocketInputStream的调用,使用使用安卓原生接口,安全风险较大,所以最好采用VMP保护。以函数A为例,查看函数A的CodeItem,将它的全部的CodeItem复制出来。
3、将函数A的代码全部删除,然后在A所在的类下(Class AParent)定义A的同名JNI函数,参数个数类型保持一致,比如A方法:public int A(int a,int b),那么同名函数即为public native int A(int a,int b)。并且在此类中定义pro.cpp生成的so的加载。
4、在pro.cpp中将CodeItem的全部16进制数据定义为字节数组,然后将安卓系统源代码中CodeItem的定义复制到该cpp文件中。
5、在该cpp文件中定义函数A(Java_com.example_AParent_A(JNIenv*env,jobject obj,jint a,jint b))和一个解释器函数,在函数A中调用解释器函数。函数A的作用是便于传递参数到解释器里面和得到解释器函数的返回值,还有就是便于调用;解释器函数的作用是为了对原来的A函数(public int A())进行取指,译码实现最初函数A实现的功能。函数A和解释器函数参数个数和类型保持和JAVA代码中的A函数一致。
6、在解释器函数中首先将CodeItem的字节数组转换成该cpp文件中定义的CodeItem然后定义虚拟寄存器,申请成功之后分配参数。
7、逐条取出CodeItem中的指令,根据指令的不同建立选择表(switch),然后根据指令的opcode来编写C++代码完成对应的译码工作。
8、在完成代码的编写之后,点击编译器(通常为android studio)的编译按钮进行APK编译,完成在开发过程中就实现VMP对APK的保护。
具体应用场景:
在某个应用的APP代码编写过程中,开发人员使用JAVA代码编写了一段解密函数int B(int a,int b)。该函数的安全级别很高,设计到用户的账号密码在本地存储的解密过程。由于函数是写在Java层,而且大多调用了安卓的原生解密函数,导致该函数在加固情况下很容易被逆向分析人员获取到完整代码,使应用安全受到威胁。这个时候,在函数B中定义public native int B(int a,int b);然后在B函数所在的类A中添加一个So文件的加载点public class A{static{System.loadLibrary(“protect”);}...。然后复制函数B的全部CodeItem,然后在protect.cpp文件中定义函数BJava_com_example_A_B(JNIEnv*env,jobject obj,jint a,jint b);同时定义解释器函数int Inp(JNIEnv*env,jobject obj,jint a,jint b);在函数B中定义一个16进制字节数组,里面包含全部函数B的CodeItem.Const unsigned char fun_B[];并且将安卓系统中的CodeItem定义复制过来(附图图1),将fun_B转换成CodeItem,CodeItem*codeItem=(CodeItem*)fun_B;接着定义虚拟寄存器,分配参数和寄存器,下一步逐条取出CodeItem中的指令,根据指令的不同建立选择表(switch),然后根据指令的opcode来编写C++代码完成对应的译码工作。例如函数B里面的一行代码int a=b*b;此行代码十六进制为92000606.opcode为92,在switch表的case 0x92中用谷歌原生的代码翻译该opcode。在完成函数B的VMP保护之后,编译APK上架之后。逆向分析人员拿到了该APK,逆向分析追踪到函数B的时候,由于函数B被VMP保护了,逆向分析人员因此看不到该函数的实现。这样就实现了函数的高级保护。
请参阅图2所示,本发明还提供了一种安卓端VMP保护的实现系统,其特征在于:包括引用模块、定义模块、保持模块、复制模块、调用模块、分配模块、译码模块和编译模块;所述引用模块,即使用JAVA函数开发应用的功能,并且引入JNI函数,将JAVA函数或JNI函数编译后生成so文件的.cpp格式文件命名为pro.cpp;所述定义模块,即定义一个函数A,查看函数A的CodeItem,并且将函数A的CodeItem进行复制;所述保持模块,即将函数A的代码全部删除,且在函数A所在的类别下定义函数A同名的JNI函数,使其参数类型保持一致;所述复制模块,即在pro.cpp中将CodeItem的全部16进制数据定义为字节数组,将安卓系统源代码中CodeItem的定义复制到该cpp文件中;所述调用模块,即在cpp文件定义函数A和解释器函数,且在函数A中调用解释器函数;所述分配模块,即在解释器函数中将CodeItem的字节数组转换成该cpp文件中定义的CodeItem然后定义虚拟寄存器,申请成功之后分配参数;所述译码模块,即逐条取出CodeItem中的指令,根据指令的不同建立选择表,再根据指令的opcode来编写C++代码完成对应的译码工作;所述编译模块,即完成代码编写后,通过编译器对APK进行编译,在开发过程中实现VMP对APK的保护作用。
所述调用模块进一步具体为:函数A能够便于传递参数到解释器里面和得到解释器函数的返回值,且便于调用;解释器函数能够对原来的A函数进行取指,译码实现最初函数A实现的功能;函数A和解释器函数参数个数和类型保持和JAVA代码中的A函数一致。
总之,本发明通过在APP的开始时期就能完成对APP的VMP保护,相较于现在的使用加固平台来加固APP来说,时机更早,更能降低VMP加固保护对APP造成的性能影响。
以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。
Claims (2)
1.一种安卓端VMP保护的实现方法,其特征在于,所述实现方法包括以下步骤:
步骤S1、使用JAVA函数开发应用的功能,并且引入JNI函数,将JAVA函数或JNI函数编译后生成so文件的.cpp格式文件命名为pro.cpp;
步骤S2、定义一个函数A,查看函数A的CodeItem,并且将函数A的CodeItem进行复制;
步骤S3、将函数A的代码全部删除,且在函数A所在的类别下定义函数A同名的JNI函数,使其参数类型保持一致;
步骤S4、在pro.cpp中将CodeItem的全部16进制数据定义为字节数组,将安卓系统源代码中CodeItem的定义复制到该cpp文件中;
步骤S5、在cpp文件定义函数A和解释器函数,且在函数A中调用解释器函数;
步骤S6、在解释器函数中将CodeItem的字节数组转换成该cpp文件中定义的CodeItem然后定义虚拟寄存器,申请成功之后分配参数;
步骤S7、逐条取出CodeItem中的指令,根据指令的不同建立选择表,再根据指令的opcode来编写C++代码完成对应的译码工作;
步骤S8、完成代码编写后,通过编译器对APK进行编译,在开发过程中实现VMP对APK的保护作用;所述步骤S5进一步具体为:函数A能够便于传递参数到解释器里面和得到解释器函数的返回值,且便于调用;解释器函数能够对原来的函数A进行取值,译码实现最初函数A实现的功能,函数A和解释器函数参数个数和类型保持和JAVA代码中的函数A一致。
2.一种安卓端VMP保护的实现系统,其特征在于:包括引用模块、定义模块、保持模块、复制模块、调用模块、分配模块、译码模块和编译模块;所述引用模块,即使用JAVA函数开发应用的功能,并且引入JNI函数,将JAVA函数或JNI函数编译后生成so文件的.cpp格式文件命名为pro.cpp;所述定义模块,即定义一个函数A,查看函数A的CodeItem,并且将函数A的CodeItem进行复制;所述保持模块,即将函数A的代码全部删除,且在函数A所在的类别下定义函数A同名的JNI函数,使其参数类型保持一致;所述复制模块,即在pro.cpp中将CodeItem的全部16进制数据定义为字节数组,将安卓系统源代码中CodeItem的定义复制到该cpp文件中;所述调用模块,即在cpp文件定义函数A和解释器函数,且在函数A中调用解释器函数;所述分配模块,即在解释器函数中将CodeItem的字节数组转换成该cpp文件中定义的CodeItem然后定义虚拟寄存器,申请成功之后分配参数;所述译码模块,即逐条取出CodeItem中的指令,根据指令的不同建立选择表,再根据指令的opcode来编写C++代码完成对应的译码工作;所述编译模块,即完成代码编写后,通过编译器对APK进行编译,在开发过程中实现VMP对APK的保护作用;所述调用模块进一步具体为:函数A能够便于传递参数到解释器里面和得到解释器函数的返回值,且便于调用;解释器函数能够对原来的函数A进行取值,译码实现最初函数A实现的功能;函数A和解释器函数参数个数和类型保持和JAVA代码中的函数A一致。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110491133.3A CN113127004B (zh) | 2021-05-06 | 2021-05-06 | 一种安卓端vmp保护的实现方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110491133.3A CN113127004B (zh) | 2021-05-06 | 2021-05-06 | 一种安卓端vmp保护的实现方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113127004A CN113127004A (zh) | 2021-07-16 |
CN113127004B true CN113127004B (zh) | 2022-08-16 |
Family
ID=76781539
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110491133.3A Active CN113127004B (zh) | 2021-05-06 | 2021-05-06 | 一种安卓端vmp保护的实现方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113127004B (zh) |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3801545B2 (ja) * | 2002-08-02 | 2006-07-26 | 松下電器産業株式会社 | コンパイラ用プログラム、コンパイラ装置及びコンパイル方法 |
CN105930735B (zh) * | 2016-04-22 | 2019-02-05 | 北京奇虎科技有限公司 | 一种文件加固方法及装置 |
CN107577925B (zh) * | 2017-08-11 | 2019-07-05 | 西北大学 | 基于双重ARM指令虚拟的Android应用程序保护方法 |
CN108846264A (zh) * | 2018-06-11 | 2018-11-20 | 北京奇虎科技有限公司 | 代码加固方法、装置、智能终端和计算机可读存储介质 |
CN111597514B (zh) * | 2020-04-15 | 2023-10-13 | 卓望数码技术(深圳)有限公司 | 安卓源代码保护方法和装置 |
CN112214266A (zh) * | 2020-10-12 | 2021-01-12 | 广州大学 | 欺骗调用链安卓脱壳方法、装置、存储介质及计算机设备 |
-
2021
- 2021-05-06 CN CN202110491133.3A patent/CN113127004B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN113127004A (zh) | 2021-07-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Yamashita et al. | Potential risks of hyperledger fabric smart contracts | |
US11868745B2 (en) | System and method for compiling high-level language code into a script executable on a blockchain platform | |
CN108733988B (zh) | 安卓平台上可执行程序的保护方法 | |
CN108614960B (zh) | 一种基于前端字节码技术的JavaScript虚拟化保护方法 | |
CN108932406B (zh) | 虚拟化软件保护方法和装置 | |
CN105068932B (zh) | 一种Android应用程序加壳的检测方法 | |
CN108681457B (zh) | 基于代码下沉与残码解释的Android应用程序保护方法 | |
US8607208B1 (en) | System and methods for object code hot updates | |
CN108491235B (zh) | 结合动态加载和函数Native化的DEX保护方法 | |
Dinh et al. | Favocado: Fuzzing the Binding Code of JavaScript Engines Using Semantically Correct Test Cases. | |
AU712005B2 (en) | System and method for runtime optimization of private variable function calls in a secure interpreter | |
Islam et al. | Dsc+ mock: A test case+ mock class generator in support of coding against interfaces | |
WO2006009287A1 (ja) | 自動変換用プログラムおよびプログラム変換サーバ | |
CN104298534B (zh) | 基于Lua语言的编程方法和装置 | |
CN100492387C (zh) | 基于Keil C51的软件保护开发的方法和系统 | |
CN112148278A (zh) | 可视化的区块链智能合约框架及智能合约开发部署方法 | |
CN110245467A (zh) | 基于Dex2C与LLVM的Android应用程序保护方法 | |
Ghezzi et al. | An evaluation of the adaptation capabilities in programming languages | |
Luckow et al. | HVMTP: a time predictable and portable java virtual machine for hard real-time embedded systems | |
CN113127004B (zh) | 一种安卓端vmp保护的实现方法及系统 | |
CN103106356B (zh) | 一种在安全环境中生成代码提高软件保护强度的方法 | |
CN113626773B (zh) | 一种基于中间语言的代码保护方法 | |
Arzt et al. | Towards cross-platform cross-language analysis with soot | |
CN112631656A (zh) | 一种基于源代码的智能合约优化方法及装置 | |
CN112214266A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |