一种实现hook的方法及装置制造方法及图纸

技术编号:19023729 阅读:30 留言:0更新日期:2018-09-26 19:08
本申请涉及Android安全技术领域,尤其涉及一种实现hook的方法及装置,用以解决现有技术中存在的进行APK加固的时间过长,加固服务器的开销和配置复杂度也较大的问题。本申请实施例提供的实现hook的方法,包括:确定需要生成的hook函数的返回值类型;针对每一种返回值类型,生成参数类型为可变参数且具有该返回值类型的hook函数;基于各个返回值类型对应的hook函数,生成so库;并针对每一个需要进行hook的安卓安装包APK,提取该APK中每一个需要被hook的Java函数的返回值类型并保存在该APK中。

【技术实现步骤摘要】
一种实现hook的方法及装置
本专利技术涉及Android安全
,尤其涉及一种实现hook的方法及装置。
技术介绍
目前,关于Android上的应用程序(Application,APP)加固技术已经进入了虚机加固(VirtualMachineProtect,VMP)阶段。在采用VMP进行APP加固工作时,往往需要利用钩子(Hook)技术,将原函数转换为一套由内部加固虚拟机来解释的指令码,即将需要被hook的原函数替换为一个内部加固虚拟机可执行的hook函数。在现有技术中常采用RegisterNatives技术来实现上述Hook,具体做法为:针对Android安装包(AndroidPackage,APK)中每个要Hook的Java函数,首先在APK的Dex文件中将函数方法修改为本地方法,即native方法,然后在HookFunction.c文件中生成一个与Java函数对应的C函数,即生成一个与需要被Hook的Java函数相对应的Hook函数,后续可以通过调用RegisterNatives方法,将生成的C函数注册为被Hook的Java函数,并使用本地开发程序包(NativeDevelopmentKit,NDK)将HookFunction.c文件以及用于加固的C/C++源文件编译成so库,最后将修改后的Dex文件和编译出的共享库(sharedobject,so)库打包为新的APK。需要注意的是,上述方法中在生成C函数即生成Hook函数时,C函数中的参数和返回值一般与原Java函数的参数和返回值相对应。比如,一个参数和返回值均为整型(int型)且函数名为sensitiveFunction的Java函数:“privateintsensitiveFunction(intvalue){}”,在HookFunction.c文件中生成的与其对应的C函数为:“jintsensFunction(JNIEnv*env,jobjectthiz,jintvalue){}”,这里,C函数的函数名不限,并且函数中前两个参数为固定的JNIEnv对象和this对象,而第三个参数必须为对应原Java函数中int型参数的jint型参数,并且该函数的返回值也必须为jint型。另外,在将生成的C函数注册为需要被Hook的Java函数时,需要建立一个数组,将原Java函数与生成的C函数之间建立起对应关系,并根据数组中定义的函数对应关系,调用RegisterNatives方法来进行注册。由此可见,现有技术中在对APK包中Java函数进行Hook时,是针对每一个APK,编译so库,并且生成的so库中被Hook函数和Hook函数的参数和返回值信息以及函数的对应关系等信息已经被绑定,这就使得生成的so库无法适用于其它APK包中。因此,用户每次提交一个APK进行加固时,还需要重新编译一个so库,相应地,加固服务器还需要为每一个需要进行加固的APK重新配置NDK环境,这就导致进行APK加固的时间过长,加固服务器的开销和配置复杂度也较大。
技术实现思路
本申请实施例提供一种实现hook的方法及装置,用以解决现有技术中存在的进行APK加固的时间过长,加固服务器的开销和配置复杂度也较大的问题。本申请实施例提供的一种实现hook的方法,包括:确定需要生成的hook函数的返回值类型;针对每一种返回值类型,生成参数类型为可变参数且具有该返回值类型的hook函数;基于各个返回值类型对应的hook函数,生成so库;并针对每一个需要进行hook的安卓安装包APK,提取该APK中每一个需要被hook的Java函数的返回值类型并保存在该APK中,以便终端在运行该APK时,从所述so库中选择一个与该需要被hook的Java函数的返回值类型相同且未被使用的hook函数,并将选择的hook函数与该需要被hook的Java函数之间建立链接关系。可选地,所述确定需要生成的hook函数的返回值类型,包括:确定Java函数的返回值类型的种类;确定需要生成的hook函数的返回值类型种类为与确定出的Java函数的返回值类型的种类相同。可选地,所述生成具有该返回值类型且参数类型均为可变参数的hook函数,包括:针对每一种返回值类型,根据预先配置的hook函数的所需总个数以及该返回值类型的hook函数所占比例,生成具有该返回值类型且参数类型为可变参数的hook函数;并,为生成的每一个hook函数分配一个唯一标识,用于标记该hook函数。可选地,所述方法还包括:针对每一个需要被hook的Java函数,将所述APK的可执行文件中与该Java函数对应的方法设置为本地方法;将所述生成的so库保存在该APK中,并在所述可执行文件中添加用于加载so库的指令。本申请又一实施例提供的一种实现hook的方法,包括:终端设备根据需要进行hook的安卓安装包APK中包含的用于加载so库的指令,加载so库,其中,所述so库中包含有不同返回值类型且参数类型均为可变参数的hook函数;针对所述APK中每一个需要被hook的Java函数,执行以下操作:从所述so库中选择一个与该Java函数的返回值类型相同且未被使用的hook函数;将选择出的hook函数与该需要被hook的Java函数之间建立链接关系。可选地,所述方法还包括:根据选择出的hook函数的唯一标识,确定该唯一标识与所述需要被hook的Java函数之间的映射关系,并存储所述映射关系;当执行所述选择出的hook函数时,基于存储的所述映射关系以及所述选择出的hook函数的唯一标识,确定与该选择出的hook函数对应的原Java函数。本申请实施例提供的一种实现hook的装置,包括:确定模块,用于确定需要生成的hook函数的返回值类型;第一生成模块,用于针对每一种返回值类型,生成参数类型为可变参数且具有该返回值类型的hook函数;第二生成模块,用于基于各个返回值类型对应的hook函数,生成so库;提取模块,用于针对每一个需要进行hook的安卓安装包APK,提取该APK中每一个需要被hook的Java函数的返回值类型并保存在该APK中,以便终端在运行该APK时,从所述so库中选择一个与该需要被hook的Java函数的返回值类型相同且未被使用的hook函数,并将选择的hook函数与该需要被hook的Java函数之间建立链接关系。可选地,所述确定模块具体用于:确定Java函数的返回值类型的种类;确定需要生成的hook函数的返回值类型种类为与确定出的Java函数的返回值类型的种类相同。可选地,所述第一生成模块具体用于:针对每一种返回值类型,根据预先配置的hook函数的所需总个数以及该返回值类型的hook函数所占比例,生成具有该返回值类型且参数类型为可变参数的hook函数;并,为生成的每一个hook函数分配一个唯一标识,用于标记该hook函数。可选地,所述装置还包括:处理模块,用于针对每一个需要被hook的Java函数,将所述APK的可执行文件中与该Java函数对应的方法设置为本地方法;并将所述生成的so库保存在该APK中,并在所述可执行文件中添加用于加载so库的指令。本申请又一实施例提供的一种实现hook的装置,包括:加载模块,用于根据需要进行hook的安卓安装包APK中包含的本文档来自技高网
...

【技术保护点】
1.一种实现hook的方法,其特征在于,该方法包括:确定需要生成的hook函数的返回值类型;针对每一种返回值类型,生成参数类型为可变参数且具有该返回值类型的hook函数;基于各个返回值类型对应的hook函数,生成so库;并针对每一个需要进行hook的安卓安装包APK,提取该APK中每一个需要被hook的Java函数的返回值类型并保存在该APK中,以便终端在运行该APK时,从所述so库中选择一个与该需要被hook的Java函数的返回值类型相同且未被使用的hook函数,并将选择的hook函数与该需要被hook的Java函数之间建立链接关系。

【技术特征摘要】
1.一种实现hook的方法,其特征在于,该方法包括:确定需要生成的hook函数的返回值类型;针对每一种返回值类型,生成参数类型为可变参数且具有该返回值类型的hook函数;基于各个返回值类型对应的hook函数,生成so库;并针对每一个需要进行hook的安卓安装包APK,提取该APK中每一个需要被hook的Java函数的返回值类型并保存在该APK中,以便终端在运行该APK时,从所述so库中选择一个与该需要被hook的Java函数的返回值类型相同且未被使用的hook函数,并将选择的hook函数与该需要被hook的Java函数之间建立链接关系。2.如权利要求1所述的方法,其特征在于,所述确定需要生成的hook函数的返回值类型,包括:确定Java函数的返回值类型的种类;确定需要生成的hook函数的返回值类型种类为与确定出的Java函数的返回值类型的种类相同。3.如权利要求1所述的方法,其特征在于,所述生成具有该返回值类型且参数类型均为可变参数的hook函数,包括:针对每一种返回值类型,根据预先配置的hook函数的所需总个数以及该返回值类型的hook函数所占比例,生成具有该返回值类型且参数类型为可变参数的hook函数;并,为生成的每一个hook函数分配一个唯一标识,用于标记该hook函数。4.如权利要求1所述的方法,其特征在于,所述方法还包括:针对每一个需要被hook的Java函数,将所述APK的可执行文件中与该Java函数对应的方法设置为本地方法;将所述生成的so库保存在该APK中,并在所述可执行文件中添加用于加载so库的指令。5.一种实现hook的方法,其特征在于,该方法包括:终端设备根据需要进行hook的安卓安装包APK中包含的用于加载so库的指令,加载so库,其中,所述so库中包含有不同返回值类型且参数类型均为可变参数的hook函数;针对所述APK中每一个需要被hook的Java函数,执行以下操作:从所述so库中选择一个与该Java函数的返回值类型相同且未被使用的hook函数;将选择出的hook函数与该需要被hook的Java函数之间建立链接关系。6.如权利要求5所述的方法,其特征在于,所述方法还包括:根据选择出的hook函数的唯一标识,确定该唯一标识与所述需要被hook的Java函数之间的映射关系,并存储所述映射关系;当执行所述选择出的hook函数时,基于存储的所述映射关系以及所述选择出的hook函数的唯一标识,确定与该选择出的hook函数对应的原Java函数。7.一种实现hook的装置,...

【专利技术属性】
技术研发人员:曾英佩
申请(专利权)人:中移杭州信息技术有限公司中国移动通信集团公司
类型:发明
国别省市:浙江,33

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1