一种安卓端抽取壳的实现方法及系统与流程

文档序号:26589753发布日期:2021-09-10 20:31阅读:400来源:国知局
一种安卓端抽取壳的实现方法及系统与流程

1.本发明涉及计算机技术领域,特别是一种安卓端抽取壳的实现方法及系统。


背景技术:

2.在安卓端,游戏和应用的安全性越来越重要。加固技术不断在迭代,从一代dex整体加固,二代对源apk的函数进行抽取,第三代引入vmp来加固应用(
3.通过这个软件保护的代码部分在虚拟机上执行,这使得被保护的程序很难被分析与破解,反汇编程序与map文件的运用使您能快速选择需要保护从而避免破解的代码),再到现在对源apk的函数进行抽取、vmp加固混合;加固游戏、应用的目的是让增加逆向分析的难度,保护游戏、应用数据不被修改或者运行逻辑不被利用破解,增加应用和游戏的收益。


技术实现要素:

4.为克服上述问题,本发明的目的是提供一种能够实现app抽取壳操作的安卓端抽取壳的实现方法。
5.本发明采用以下方案实现:一种安卓端抽取壳的实现方法,所述方法包括以下步骤:
6.步骤s1、对源apk的函数进行抽取,对dex文件的代码结构进行解析;
7.步骤s2、通过指定类的指定方法检索到其代码结构体信息,拿到被抽取函数的codeltem;
8.步骤s3、通过拿到被抽取函数的指令个数和指令偏移地址,构造空指令集,覆盖原指令,保存函数指令;
9.步骤s4、重新计算dex文件中的校验和checksum值,回填至被抽取的函数中;
10.步骤s5、函数回填后,禁用掉dex文件中的dex2oat,hook loadmethod函数拿到每个方法的artmethod对象指针和函数指令;
11.步骤s6、借助artmethod对象指针筛选和函数指令定位到的被抽取函数,回填被抽空函数的原指令。
12.进一步的,所述步骤s2进一步具体为:根据dex文件的结构遍历dex文件,通过指定类的指定方法检索到其代码结构体信息,就是根据dex文件的结构,逐字节解析dex文件,拿到被抽取函数的codeitem和函数指令。
13.进一步的,所述步骤s3进一步具体为:所述被抽取函数的codeltem的组成包括:ushort outssize:代码调用其它方法时需要的参数个数;ushort triessize:try_item结构的个数;uint debuginfooff:指向本段代码的debug信息存放位置,是一个debug_info_item结构偏移地址;uint insnssize:指令列表的大小,以16

bit为单位ushort insns:代码指令;ushort paddding:值为0,用于对齐字节;trylten tries:异常相关;encodedcatchhandlerlist异常相关;在每个函数方法中,由于codeitem前16个字节是固定的,所以构造空指令直接从代码指令开始,将此函数方法后面的指令全部置为空指令,也就
是说此方法的代码指令以及后面部分在16进制下面全部为00;然后将置空指令部分的指令保存。
14.进一步的,所述步骤s4进一步具体为:由于dex文件在加载的时候安卓的art模式会对dex文件的校验和checksum值进行校验,校验和不对的话就会停止加载,所以校验和checksum值需要重新计算;将抽取方法之后的dex文件重新计算校验和checksum值,拿到重新计算的校验和checksum值回填覆盖原来的校验和checksum值。
15.进一步的,所述步骤s5进一步具体为:由于dex文件中的dex2oat预编译过程会产生完整的dex文件,所以需要禁用掉dex文件中的dex2oat预编译过程,将execve函数方法在内核层hook就能禁用掉dex文件中的dex2oat预编译过程。
16.进一步的,所述步骤s6进一步具体为:在系统函数loadmethod函数执行时,根据artmethod对象指针得到函数指令,然后根据筛选到被抽空函数,根据被抽空函数的artmethod对象指针,找到被抽空函数在内存中的codeitem偏移,将保存的原指令回填回去。
17.本发明还提供了一种安卓端抽取壳的系统,包括抽取模块、检索模块、构造模块、计算模块、禁用模块和回填模块,所述抽取模块,即对源apk的函数进行抽取,对dex文件的代码结构进行解析;所述检索模块,即通过指定类的指定方法检索到其代码结构体信息,拿到被抽取函数的codeltem;所述构造模块,即通过拿到被抽取函数的指令个数和指令偏移地址,构造空指令集,覆盖原指令,保存函数指令;所述计算模块,即重新计算dex文件中的校验和checksum值,回填至被抽取的函数中;所述禁用模块,即函数回填后,禁用掉dex文件中的dex2oat,hook loadmethod函数拿到每个方法的artmethod对象指针和函数指令;所述回填模块,即借助artmethod对象指针筛选和函数指令定位到的被抽取函数,回填被抽空函数的原指令。
18.进一步的,所述检索模块进一步具体为:根据dex文件的结构遍历dex文件,通过指定类的指定方法检索到其代码结构体信息,就是根据dex文件的结构,逐字节解析dex文件,拿到被抽取函数的codeitem和函数指令。
19.进一步的,所述构造模块进一步具体为:所述被抽取函数的codeltem的组成包括:ushort outssize:代码调用其它方法时需要的参数个数;ushort triessize:try_item结构的个数;uint debuginfooff:指向本段代码的debug信息存放位置,是一个debug_info_item结构偏移地址;uint insnssize:指令列表的大小,以16

bit为单位ushort insns:代码指令;ushort paddding:值为0,用于对齐字节;trylten tries:异常相关;encodedcatchhandlerlist异常相关;在每个函数方法中,由于codeitem前16个字节是固定的,所以构造空指令直接从代码指令开始,将此函数方法后面的指令全部置为空指令,也就是说此方法的代码指令以及后面部分在16进制下面全部为00;然后将置空指令部分的指令保存。
20.进一步的,所述计算模块进一步具体为:由于dex文件在加载的时候安卓的art模式会对dex文件的校验和checksum值进行校验,校验和不对的话就会停止加载,所以校验和checksum值需要重新计算;将抽取方法之后的dex文件重新计算校验和checksum值,拿到重新计算的校验和checksum值回填覆盖原来的校验和checksum值。
21.进一步的,所述禁用模块进一步具体为:由于dex文件中的dex2oat预编译过程会
产生完整的dex文件,所以需要禁用掉dex文件中的dex2oat预编译过程,将execve函数方法在内核层hook就能禁用掉dex文件中的dex2oat预编译过程。
22.进一步的,所述回填模块进一步具体为:在系统函数loadmethod函数执行时,根据artmethod对象指针得到函数指令,然后根据筛选到被抽空函数,根据被抽空函数的artmethod对象指针,找到被抽空函数在内存中的codeitem偏移,将保存的原指令回填回去。
23.本发明的有益效果在于:本发明这种抽取壳实现之后,可以将源apk的函数抽取,使得逆向分析人员在静态逆向apk的时候,无法得到完整代码;增加app的应用安全;由于是在源app上进行dex的抽取和保护,所以对于这种方法来实现app的抽取壳,可以做成加固平台,对app进行批量函数抽取和保护;这种抽取壳保护效果显著,而且没有消耗app的运行性能就能实现保护效果,所以适用于各种app的保护。
附图说明
24.图1是本发明的方法流程示意图。
25.图2是本发明的系统原理框图。
具体实施方式
26.下面结合附图对本发明做进一步说明。
27.请参阅图1所示,本发明的一种安卓端抽取壳的实现方法,所述方法包括以下步骤:
28.步骤s1、对源apk的函数进行抽取,对dex文件的代码结构进行解析;
29.步骤s2、通过指定类的指定方法检索到其代码结构体信息,拿到被抽取函数的codeltem;
30.步骤s3、通过拿到被抽取函数的指令个数和指令偏移地址,构造空指令集,覆盖原指令,保存函数指令;
31.步骤s4、重新计算dex文件中的校验和checksum值,回填至被抽取的函数中;
32.步骤s5、函数回填后,禁用掉dex文件中的dex2oat,hook loadmethod函数拿到每个方法的artmethod对象指针和函数指令;
33.步骤s6、借助artmethod对象指针筛选和函数指令定位到的被抽取函数,回填被抽空函数的原指令。
34.下面通过一实施例对本发明作进一步说明:
35.1、根据dex文件的结构遍历dex文件,通过指定类的指定方法检索到其代码结构体信息,就是根据dex文件的结构,逐字节解析dex文件,拿到被抽取函数的codeitem和函数指令。
36.2、被抽取函数的codeltem的组成包括:ushort outssize:代码调用其它方法时需要的参数个数;ushort triessize:try_item结构的个数(这个大小是用来记录try

cache/finally信息的);uint debuginfooff:指向本段代码的debug信息存放位置,是一个debug_info_item结构偏移地址;uint insnssize:指令列表的大小,以16

bit为单位ushort insns:代码指令;ushort paddding:值为0,用于对齐字节;trylten tries:异常相关;
encodedcatchhandlerlist异常相关;在每个函数方法中,由于codeitem前16个字节是固定的,所以构造空指令直接从代码指令开始,将此函数方法后面的指令全部置为空指令,也就是说此方法的代码指令以及后面部分在16进制下面全部为00;然后将置空指令部分的指令保存。
37.3、由于dex文件在加载的时候安卓的art模式会对dex文件的校验和checksum值进行校验,校验和不对的话就会停止加载,所以他的校验和checksum值需要重新计算。计算方法为将dex文件从0x0c处开始读取到文件结束,将读取到的字节数组使用adler

32校验算法计算出结果即是校验和即checksum字段。将抽取方法之后的dex重新计算校验和checksum值,拿到重新计算的校验和checksum值回填覆盖原来的校验和checksum值。
38.4、由于dex文件的dex2oat预编译过程会产生完整的dex文件,如果应用不禁用掉dex文件的dex2oat预编译过程的话,抽取壳的实现是没有意义的,所以需要禁用掉dex文件的dex2oat预编译过程,即使用inline hook函数钩子的方法将execve函数方法内核层hook就能禁用掉dex文件的dex2oat预编译过程。
39.5、然后是回填指令的时机。这此处选择系统函数loadmethod函数执行时。在此处的好处是此处能得到将要执行函数的artmethod对象指针和它的函数指令(也就是函数方法的id编号,每个函数方法唯一)。
40.6、hook loadmethod函数,根据artmethod对象指针得到函数指令,然后根据筛选到被抽空函数,根据被抽空函数的artmethod对象指针,找到被抽空函数在内存中的codeitem偏移,将保存的原指令回填回去。
41.下面通过一具体实施例对本发明作进一步说明:
42.需要对某源app的一些函数进行函数保护,例如函数test(),即函数抽取壳保护。编写壳app,读取apk的dex文件。根据通过指定类的指定方法检索到test代码结构体信息,拿到test的codeitem,为03 00 01 00 02 00 00 00 30 08 14 00 80 00 00 00 1a 00 ed 34 1a 01 43 32 71 20 91 05 10 00 0e 00。共32个字节,根据codeitem的结构,前16个字节为固定字节。所以需要抽空的字节为后16字节,1a 00 ed 34 1a 01 43 32 71 20 91 05 10 00 0e 00。将其全部置空。所以test()的新codeitem为03 00 01 00 02 00 00 00 30 08 14 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00。将1a 00ed 34 1a 01 43 32 71 20 91 05 10 00 0e 00保存,然后同时保存test()的函数指令,这里为15203。然后查看源app的dex的checksum这里为89 12 84 6e,重新计算修改过后的dex的checksum为27 85 81 5e,将新得到的checksum覆盖原来的checksum壳app,禁用掉dex2oat函数,然后hook loadmethod函数,拿到loadmethod的以个参数,为函数方法的artmethod*dst,根据拿到的artmethod对象指针可以拿到函数的函数指令,筛选函数指令,当函数指令为15203的时候,证明拿到的artmethod对象指针为被抽取函数的,然后根据artmethod对象指针得到test()的在内存中的codeitem,然后将保存的1a 00 ed 34 1a 01 43 32 71 20 91 05 10 00 0e 00回填回去。
43.请参阅图2所示,本发明还提供了一种安卓端抽取壳的系统,包括抽取模块、检索模块、构造模块、计算模块、禁用模块和回填模块,所述抽取模块,即对源apk的函数进行抽取,对dex文件代码结构进行解析;所述检索模块,即通过指定类的指定方法检索到其代码结构体信息,拿到被抽取函数的codeltem;所述构造模块,即通过拿到被抽取函数的指令个
数和指令偏移地址,构造空指令集,覆盖原指令,保存函数指令;所述计算模块,即重新计算dex文件中的校验和checksum值,回填至被抽取的函数中;所述禁用模块,即函数回填后,禁用掉dex文件中的dex2oat,hook loadmethod函数拿到每个方法的artmethod对象指针和函数指令;所述回填模块,即借助artmethod对象指针筛选和函数指令定位到的被抽取函数,回填被抽空函数的原指令。
44.所述检索模块进一步具体为:根据dex文件结构遍历dex文件,通过指定类的指定方法检索到其代码结构体信息,就是根据dex文件的结构,逐字节解析dex文件,拿到被抽取函数的codeitem和函数指令。
45.所述构造模块进一步具体为:所述被抽取函数的codeltem的组成包括:ushort outssize:代码调用其它方法时需要的参数个数;ushort triessize:try_item结构的个数;uint debuginfooff:指向本段代码的debug信息存放位置,是一个debug_info_item结构偏移地址;uint insnssize:指令列表的大小,以16

bit为单位ushort insns:代码指令;ushort paddding:值为0,用于对齐字节;trylten tries:异常相关;encodedcatchhandlerlist异常相关;在每个函数方法中,由于codeitem前16个字节是固定的,所以构造空指令直接从代码指令开始,将此函数方法后面的指令全部置为空指令,也就是说此方法的代码指令以及后面部分在16进制下面全部为00;然后将置空指令部分的指令保存。
46.所述计算模块进一步具体为:由于dex文件在加载的时候安卓的art模式会对dex文件的校验和checksum值进行校验,校验和不对的话就会停止加载,所以校验和checksum值需要重新计算;将抽取方法之后的dex文件重新计算校验和checksum值,拿到重新计算的校验和checksum值回填覆盖原来的校验和checksum值。
47.所述禁用模块进一步具体为:由于dex文件中的dex2oat预编译过程会产生完整的dex文件,所以需要禁用掉dex文件中的dex2oat预编译过程,将execve函数方法在内核层hook就能禁用掉dex文件中的dex2oat预编译过程。
48.所述回填模块进一步具体为:在系统函数loadmethod函数执行时,根据artmethod对象指针得到函数指令,然后根据筛选到被抽空函数,根据被抽空函数的artmethod对象指针,找到被抽空函数在内存中的codeitem偏移,将保存的原指令回填回去。
49.以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1