CN111353148B - 一种确定应用程序是否被重打包的方法及设备 - Google Patents

一种确定应用程序是否被重打包的方法及设备 Download PDF

Info

Publication number
CN111353148B
CN111353148B CN202010082638.XA CN202010082638A CN111353148B CN 111353148 B CN111353148 B CN 111353148B CN 202010082638 A CN202010082638 A CN 202010082638A CN 111353148 B CN111353148 B CN 111353148B
Authority
CN
China
Prior art keywords
application program
signature
block
check function
check
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
CN202010082638.XA
Other languages
English (en)
Other versions
CN111353148A (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.)
Beike Technology Co Ltd
Original Assignee
Beike 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 Beike Technology Co Ltd filed Critical Beike Technology Co Ltd
Priority to CN202010082638.XA priority Critical patent/CN111353148B/zh
Publication of CN111353148A publication Critical patent/CN111353148A/zh
Application granted granted Critical
Publication of CN111353148B publication Critical patent/CN111353148B/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/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/51Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems at application loading time, e.g. accepting, rejecting, starting or inhibiting executable software based on integrity or source reliability
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/03Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
    • G06F2221/033Test or assess software

Abstract

本发明实施例提供一种确定应用程序是否被重打包的方法及设备,该方法包括:客户端的一个应用程序启动后,加载安全动态库,并通过执行安全动态库的校验函数读取APK签名块中预设位置的数据信息;其中,预设位置为ID‑value结构体中非签名校验子块;判断数据信息是否与预设魔数一致,若一致,则应用程序未被重打包,应用程序继续执行;若不一致或为空,则应用程序被重打包,关闭应用程序。本发明实施例提供的确定应用程序是否被重打包的方法及设备,可以抵御攻击者通过Hook工具修改获取签名信息结果绕过防重打包,并可发现攻击者通过任一apk文件的修改而进行的重打包,从而提高了重打包防御的安全性。

Description

一种确定应用程序是否被重打包的方法及设备
技术领域
本发明涉及信息安全技术领域,具体涉及一种确定应用程序是否被重打包的方法及设备。
背景技术
随着移动互联网的迅猛发展和智能移动设备的快速普及,移动应用程序如雨后春笋层出不穷,由此引发的移动安全问题也日益凸显,形成了庞大的移动端攻击产业链,其中以插入恶意代码、插入非法广告、窃取用户隐私、吸资扣费耗费流量等恶意行为为目的的重打包问题便是产业链中的重要一环。
重打包是攻击者为了实现注入代码、修改应用逻辑、插入广告等恶意行为,对APP进行篡改的一种手段,重打包的步骤一般为:解包(反编译)-->插入/篡改代码-->生成新包-->重签名-->运行。
现有的防重打包方法主要有以下两种:
第一种是在应用安装包apk文件中添加检测代码,获取当前用户运行应用程序的签名信息并校验该信息是否为合法签名信息。由于应用程序在打包过程中会使用签名证书的私钥对应用摘要信息进行加密,放入签名文件中,因此若该应用程序为重打包程序,则可检测出签名信息不合法。
第二种是在应用程序的dex文件末尾添加数字水印信息,然后加载安全动态库,在安全动态库中执行数字水印信息的校验逻辑,若在dex文件末尾读取到的数字水印信息与添加的不一致,则说明当前应用为重打包。
Hook,又名钩子,在应用程序运行过程中,当运行至目标代码时,将其原本要执行的指令替换为攻击者的指令。针对第一种方法,因为对攻击者来说签名信息是公开的,攻击者可以通过Hook工具修改校验函数,将其获取到的签名信息改为合法签名信息,或直接注释掉调用校验函数的代码,若是so文件在加载时直接执行校验函数,则直接删除依赖的so文件,即可绕过校验。针对第二种方法,攻击者同样可以通过Hook校验方法,返回合法结果,或者注释掉调用安全动态库的Java代码,即可绕过校验。同时,在dex文件末尾添加水印信息,仅可实现dex文件的防篡改,无法保护资源文件和配置文件,而很多攻击手段可以通过修改或替换资源文件和配置文件来实现。
发明内容
为解决或至少部分解决现有技术中的问题,本发明实施例提供一种确定应用程序是否被重打包的方法及设备。
第一方面,本发明实施例提供一种确定应用程序是否被重打包的方法,所述方法应用于客户端,包括:所述客户端的一个应用程序启动后,加载安全动态库,并通过执行所述安全动态库的校验函数读取APK签名块中预设位置的数据信息;其中,所述预设位置为ID-value结构体所在区块中的非签名校验子块;判断所述数据信息是否与预设魔数一致,若一致,则所述应用程序未被重打包,继续执行所述应用程序;若不一致或为空,则所述应用程序被重打包,关闭所述应用程序。
进一步地,在Android系统中,所述非签名校验子块的ID值不为0x7109871a;其中,Android系统对apk文件的签名校验过程中仅校验所述区块中ID值为0x7109871a对应的value值,对所述区块中的其他ID-value值不进行任何处理。
进一步地,在所述加载安全动态库之后,所述方法还包括:判断所述校验函数是否被hook;若是,则关闭所述应用程序,若否,则再执行所述通过执行所述安全动态库的校验函数读取APK签名块中预设位置的数据信息。
进一步地,所述判断所述校验函数是否被hook,包括:通过反射检测Hook工具的作用方法列表中是否包含所述校验函数的校验函数名,若结果为包含,则确认所述校验函数被hook。
进一步地,在所述通过反射检测Hook工具的作用方法列表中是否包含所述校验函数的校验函数名之后,若结果为未包含,则进一步通过校验所述校验函数的第一句指令是否被替换为跳转指令,来判断所述校验函数是否被hook;若所述第一句指令被替换为跳转指令,则确认所述校验函数被hook,否则,确认所述校验函数未被hook。
进一步地,在所述加载安全动态库之后,所述方法还包括:调用所述安全动态库的加签函数生成签名字段,向服务端发起请求,并在所述请求中携带所述签名字段,以供所述服务端对所述签名字段进行校验,若所述签名字段为空或不正确,则获知所述安全动态库被删除或被替换,从而执行预设动作并返回预设信息;接收所述预设信息,关闭所述应用程序。
进一步地,所述预设动作包括阻断所述应用程序的通信进程,所述预设信息包括预设错误消息。
第二方面,本发明实施例提供一种确定应用程序是否被重打包的设备,该设备包括客户端,所述客户端包括初始化模块和魔数校验模块,其中:所述初始化模块用于启动应用程序并加载安全动态库;所述魔数校验模块用于:通过执行所述安全动态库的校验函数读取APK签名块中预设位置的数据信息;其中,所述预设位置为ID-value结构体所在区块中的非签名校验子块;判断所述数据信息是否与预设魔数一致,若一致,则所述应用程序未被重打包,继续执行所述应用程序;若不一致或为空,则所述应用程序被重打包,关闭所述应用程序。
第三方面,本发明实施例提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如第一方面或所提供的方法的步骤。
第四方面,本发明实施例提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如第一方面所提供的方法的步骤。
本发明实施例提供的确定应用程序是否被重打包的方法及设备,通过比较APK签名块的ID-value结构体中非签名校验子块的数据信息是否与预设魔数相一致或是否为空来判断应用程序是否被重打包,可以抵御攻击者通过Hook工具修改获取签名信息结果绕过防重打包,并可发现攻击者通过任一apk文件的修改而进行的重打包,从而提高了重打包防御的安全性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明一实施例提供的确定应用程序是否被重打包的方法流程图;
图2是本发明另一实施例提供的确定应用程序是否被重打包的方法流程图;
图3是本发明一实施例提供的确定应用程序是否被重打包的设备的结构示意图;
图4是本发明另一实施例提供的确定应用程序是否被重打包的设备的结构示意图;
图5是本发明一实施例提供的电子设备的实体结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1是本发明一实施例提供的确定应用程序是否被重打包的方法流程图。所述方法应用于客户端,如图1所示,所述方法包括:
步骤101、所述客户端的一个应用程序启动后,加载安全动态库,并通过执行所述安全动态库的校验函数读取APK签名块中预设位置的数据信息;其中,所述预设位置为ID-value结构体所在区块中的非签名校验子块;
步骤102、判断所述数据信息是否与预设魔数一致,若一致,则所述应用程序未被重打包,继续执行所述应用程序;若不一致,则所述应用程序被重打包,关闭所述应用程序。
安全动态库是在应用程序中用于进行安全校测的动态链接库,一般为so文件,使用C/C++实现,相比于java代码,破解难度大大提高。APK签名块即APK Signing Block,比如在Android系统的V2签名过程中,在zip格式的apk文件中生成的一个子块即APK签名块,用于存放应用程序的签名信息。
客户端在应用程序APK Signing Block的预设位置种植一个自定义的魔数,用于在安全动态库中校验当前应用是否为重打包应用,即从apk文件的APK Signing Block中读取数据信息,若与预先种下的魔数不一致,或读取到的结果为空,则说明当前应用程序为重打包应用。
在对应用程序进行打包和签名后,在APK Signing Block中种植魔数时,种植位置需基于APK Signing Block结构来选择,APK SigningBlock结构如表1所示:
表1
偏移 字节数 描述
@+0 8 这个Block的长度(本字段的长度不计算在内)
@+8 n 一组ID-value
@-24 8 这个Block的长度(和第一个字段一样值)
@-16 16 固定字段:“APK Sig Block 42”
该结构中,第1、3、4部分均为固定结构,不可修改,而第2部分的ID-value结构中包括8字节的长度标识、4字节的ID和该ID对应的负载内容。Android系统对apk文件的签名校验过程中仅校验ID为“0x7109871a”对应的value值,对这个区块中的其他ID-value值不进行任何处理。因此可以将魔数以ID-value的形式种植到这个区块中的其他ID-value值的存放区域,即非签名校验子块中,所述非签名校验子块为apk文件的签名校验过程中不进行校验的APK签名块中ID-value结构体所在区块中的子块。
以上是以Android系统为例,并且基于现有的Android系统对apk文件的签名校验过程中仅校验ID为“0x7109871a”对应的value值而得出。相应地,若系统设置改变,比如,Android系统对apk文件的签名校验过程中所校验的子块的ID发生改变,比如变化为“abc”,则魔数种植于ID值为非“abc”的子块中。可以理解的,本发明实施例并不局限应用于Android系统,对于其他系统,可以参照此原理做类似处理。
现有技术防重打包的第一种方法是在应用安装包apk文件中添加检测代码,获取当前用户运行应用程序的签名信息并校验该信息是否为合法签名信息。但由于对攻击者来说签名信息是公开的,攻击者可以通过Hook工具修改校验函数,将其获取到的签名信息改为合法签名信息从而绕过。而本发明实施例中在APK签名块中的非签名校验子块中种植的魔数为自定义字段,非常规防重打包方法中的签名信息,是hook工具所无法读取的,因此可抵御攻击者通过Hook工具修改获取签名信息结果的绕过方法。
另外,现有技术防重打包的第二种方法是在应用程序的dex文件末尾添加数字水印信息,通过校验水印信息判断是否重打包。dex文件作为zip格式的apk文件解压缩之后的一个子文件,在dex文件末尾添加水印信息,只能保护dex自身,没办法保护其他子文件,比如无法保护通过修改或替换资源文件和配置文件的重打包。而本发明实施例在APK签名块的ID-value结构体中非签名校验子块种植魔数,APK签名块是zip格式的签名字节块,是zip文件本身的特征,解压缩之后,这个特征就消失了。而攻击者要重打包,就得先解压缩apk,然后对其中的子文件做改动,然后重新压缩打包并签名,这时候之前在签名块里加的特征(比如魔数)就没了,而由于魔数无法被hook工具读取,因此hook工具也无法伪造魔数。所以,通过在APK签名块的ID-value结构体中非签名校验子块种植魔数可以实现所有文件的保护,即可以抵御通过对配置文件、资源文件等各类apk文件的修改进行的重打包操作。
本发明实施例通过比较APK签名块的ID-value结构体中非签名校验子块的数据信息是否预设魔数相一致或是否为空来判断应用程序是否被重打包,可以抵御攻击者通过Hook工具修改获取签名信息结果绕过防重打包,并可发现攻击者通过任一apk文件的修改而进行的重打包,从而提高了重打包防御的安全性。
进一步地,基于上述实施例,在Android系统中,所述非签名校验子块的ID值不为0x7109871a;其中,Android系统对apk文件的签名校验过程中仅校验所述区块中ID值为0x7109871a对应的value值,对所述区块中的其他ID-value值不进行任何处理。
在上述实施例的基础上,本发明实施例通过确定Android系统中的预设位置,实现了应用预设魔数对Android系统进行是否重打包的确定,从而实现Android系统的重打包防御。
进一步地,基于上述实施例,在所述加载安全动态库之后,所述方法还包括:判断所述校验函数是否被hook;若是,则关闭所述应用程序,若否,则再执行所述通过执行所述安全动态库的校验函数读取APK签名块中预设位置的数据信息。
上述通过比较APK签名块的ID-value结构体中非签名校验子块的数据信息是否与预先种植的魔数相一致或是否为空来判断应用程序是否被重打包的方法还存在一定的风险,这个风险包括hook工具可能会通过修改魔数与数据信息的识别结果(通过修改校验函数实现)进行绕过。比如,若设置所述数据信息和魔数一致则返回结果为“true”,若所述数据信息和魔数不一致则返回结果为“false”,Hook工具可以通过将“false”改为“true”进行绕过。
其中,所述校验函数被hook包括校验函数被Hook工具所修改。安全动态库并不属于apk文件,而是用于保护apk文件的,因此,安全动态库的校验函数被hook并不表示apk文件被修改。这时,单纯通过魔数就无法保护了。
为解决这个问题,本发明实施例在加载安全动态库之后,先进行所述校验函数是否被hook的判断,若所述校验函数被hook,则关闭所述应用程序,若所述校验函数未被hook,则再执行所述通过执行所述安全动态库的校验函数读取APK签名块中预设位置的数据信息,这样进一步提高了重打包防御的安全性。
在上述实施例的基础上,本发明实施例通过对校验函数进行防hook保护,来避免攻击者通过Hook工具修改校验函数返回值,从而绕过校验逻辑,从而进一步提高了重打包防御的安全性。
进一步地,基于上述实施例,所述判断所述校验函数是否被hook,包括:通过反射检测Hook工具的作用方法列表中是否包含所述校验函数的校验函数名,若结果为包含,则确认所述校验函数被hook。
可以通过反射检测Hook工具的作用方法列表中是否包含所述校验函数的校验函数名,若结果为包含,则确认所述校验函数被hook;若结果为不包含,则可以认为所述校验函数未被hook。
在通过反射检测Hook工具的作用方法列表中是否包含所述校验函数的校验函数名时,可以通过反射获取xposed hook框架的类,如能获取成功,则查看该类中的属性参数methodCache中是否包含防重打包校验函数名(校验函数的校验函数名),若包含,则说明校验函数被hook。
在上述实施例的基础上,本发明实施例通过反射检测Hook工具的作用方法列表中是否包含所述校验函数的校验函数名来判断校验函数是否被hook,从而在保证效率的基础上,进一步提高了重打包防御的安全性。
进一步地,基于上述实施例,在所述通过反射检测Hook工具的作用方法列表中是否包含所述校验函数的校验函数名之后,若结果为未包含,则进一步通过校验所述校验函数的第一句指令是否被替换为跳转指令,来判断所述校验函数是否被hook;若所述第一句指令被替换为跳转指令,则确认所述校验函数被hook,否则,确认所述校验函数未被hook。
在判断所述校验函数是否被hook时,若通过反射检测Hook工具的作用方法列表发现不包含所述校验函数的校验函数名,为抵御hook工具修改或隐藏校验函数名,可以进一步通过其他方法进行判断。比如,进一步通过校验所述校验函数的第一句指令是否被替换为跳转指令,来判断所述校验函数是否被hook;若所述第一句指令(起始指令)被替换为跳转指令,则确认所述校验函数被hook,立即关闭应用,否则,确认所述校验函数未被hook,则继续进程。
由于有的程序可能为循环,因此,获取起始指令可能较为耗时,这可能会牺牲一些时间成本,但是会得到更为准确可靠的校验函数是否被hook的结果。
在上述实施例的基础上,本发明实施例在通过反射检测Hook工具的作用方法列表中不包含校验函数的校验函数名之后,进一步通过校验校验函数的第一句指令是否被替换为跳转指令,来判断校验函数是否被hook,进一步提高了重打包防御的安全性。
本发明实施例对安全动态库so文件中的Native层校验函数进行两种防Hook保护,分别包括通过反射检测Hook工具的作用方法列表中是否包含所述校验函数的校验函数名来判断校验函数是否被hook以及通过校验所述校验函数的第一句指令是否被替换为跳转指令来判断校验函数是否被hook。需要说明的是,这两种方法可以选取其中的至少一种,并且顺序上可任意组合。
进一步地,基于上述实施例,在所述加载安全动态库之后,所述方法还包括:调用所述安全动态库的加签函数生成签名字段,向服务端发起请求,并在所述请求中携带所述签名字段,以供所述服务端对所述签名字段进行校验,若所述签名字段为空或不正确,则获知所述安全动态库被删除或被替换,从而执行预设动作并返回预设信息;接收所述预设信息,关闭所述应用程序。
除了校验函数被hook外,还可能有一种绕过防重打包的方式是注释掉调用校验函数的代码(替换安全动态库)或直接删除安全动态库。而本发明实施例中对于魔数与数据信息的一致性辨别也是通过校验函数实现。因此,若攻击者注释掉调用校验函数的代码或直接删除安全动态库则上述方案仍存在风险。
为解决这个问题,本发明实施例在加载安全动态库之后,另起一分支执行下述动作:运行于客户端的应用程序调用所述安全动态库的加签函数生成签名字段,向服务端发起请求,并在所述请求中携带所述签名字段;所述服务端对所述签名字段进行校验,若所述签名字段为空或不正确,则获知所述安全动态库被删除或被替换,从而执行预设动作并向所述应用程序返回预设信息;所述应用程序接收所述预设信息后,关闭所述应用程序。
在安全动态库中提供API接口的签名Native接口,签名算法中嵌入apk的合法签名信息,在应用程序与服务端进行通信交互时,调用该签名Native接口生成签名字段signature,可以放在请求的header中,服务端收到请求时,校验签名字段signature是否合法。无论是在java层还是在安全动态库中实现签名信息的校验,攻击者均可以通过注释掉java校验方法,或注释掉加载安全动态库的java代码,即可绕过校验,本发明实施例通过客户端与服务端的报文请求中签名字段的生成和校验,实现so文件和java层的耦合,使得攻击者无法通过注释掉调用校验函数的代码或直接删除安全动态库抵御防重打包。
在上述实施例的基础上,本发明实施例通过在客户端与服务端的通信中添加通过安全动态库的加签函数生成的签名字段,根据签名字段是否为空或不正确来进一步判断是否重打包,防止了攻击者通过删除或替换安全动态库抵御防重打包,进一步提高了重打包防御的安全性。
进一步地,基于上述实施例,所述预设动作包括阻断所述应用程序的通信进程。
客户端向服务端发送请求,附带签名字段sign。在应用程序与服务端进行通信时,调用安全动态库的签名生成接口,生成签名字段sign,放入请求报文中,发送至服务端。服务端对请求报文中的sign进行校验,若该字段为空,或不正确,则说明安全动态库被删除,或被替换,则阻断该应用连接。
在上述实施例的基础上,本发明实施例通过在服务端判断重打包后,阻断应用程序的通信进程,进一步提高了重打包防御的安全性。
进一步地,基于上述实施例,所述预设信息包括预设错误消息。
客户端向服务端发送请求,附带签名字段sign。在应用程序与服务端进行通信时,调用安全动态库的签名生成接口,生成签名字段sign,放入请求报文中,发送至服务端。服务端对请求报文中的sign进行校验,若该字段为空,或不正确,则说明安全动态库被删除,或被替换,则可在阻断该应用连接的同时,返回错误消息至客户端,由客户端关闭应用即可。
在上述实施例的基础上,本发明实施例通过在服务端判断重打包后,阻断应用程序的通信进程,并向客户端发送预设错误消息以使客户端关闭应用程序,进一步提高了重打包防御的安全性。
图2是本发明另一实施例提供的确定应用程序是否被重打包的方法流程图。如图2所示,所述方法包括:
a)应用程序启动。
b)加载安全动态库:在应用程序启动后,即在主进程中加载安全动态库。
c)判断校验函数是否被hook:可通过两种方案判断重打包校验函数是否被hook,首先通过反射获取xposed hook框架的类,如能获取成功,则查看该类中的属性参数methodCache中是否包含防重打包校验函数名,若包含,则说明函数被hook,立即关闭应用,若不包含,则进一步查看防重打包校验函数的起始指令是否被替换成了跳转指令,若是,则说明函数被hook,立即关闭应用,若不是,则继续进程。
d)执行校验函数,读取魔数:在防重打包校验函数没有被hook的前提下,继续执行,从apk文件的APK Signing Block子块的ID-value结构体中读取预先种入的魔数。
e)校验魔数是否合法:对读取到的魔数进行校验,若与预先种入的魔数一致,则说明没有被重打包,若不一致,则说明被重打包,立即关闭应用。
f)在执行c)步骤的同时,向服务端发送请求,附带签名字段sign:在应用程序与服务端进行通信时,调用安全动态库的签名生成接口,生成签名字段sign,放入请求报文中,发送至服务端。
g)服务端校验签名字段是否合法:服务端对请求报文中的sign进行校验,若该字段为空,或不正确,则说明安全动态库被删除或被替换,则阻断该应用连接,并返回错误消息至客户端,由客户端关闭应用即可。
本发明实施例提出的重打包校验方法,覆盖apk文件中的所有文件,同时对校验方法进行相应的防护,堵住攻击者可以绕过的所有路口,可以解决当前防重打包方案中可被绕过或仅可保护dex文件等问题。
图3是本发明一实施例提供的确定应用程序是否被重打包的设备的结构示意图。如图3所示,所述设备包括客户端1,所述客户端1包括初始化模块10和魔数校验模块20,其中,初始化模块10用于启动应用程序并加载安全动态库;所述魔数校验模块20用于:通过执行所述安全动态库的校验函数读取APK签名块中预设位置的数据信息;其中,所述预设位置为ID-value结构体所在区块中的非签名校验子块;判断所述数据信息是否与预设魔数一致,若一致,则所述应用程序未被重打包,继续执行所述应用程序;若不一致或为空,则所述应用程序被重打包,关闭所述应用程序。
本发明实施例通过比较APK签名块的ID-value结构体中非签名校验子块的数据信息是否与预设魔数相一致或是否为空来判断应用程序是否被重打包,可以抵御攻击者通过Hook工具修改获取签名信息结果绕过防重打包,并可发现攻击者通过任一apk文件的修改而进行的重打包,从而提高了重打包防御的安全性。
进一步地,基于上述实施例,在Android系统中,所述非签名校验子块的ID值不为0x7109871a;其中,Android系统对apk文件的签名校验过程中仅校验所述区块中ID值为0x7109871a对应的value值,对所述区块中的其他ID-value值不进行任何处理。
在上述实施例的基础上,本发明实施例通过确定Android系统中的预设位置,实现了应用预设魔数对Android系统进行是否重打包的确定,从而实现Android系统的重打包防御。
图4是本发明另一实施例提供的确定应用程序是否被重打包的设备的结构示意图。如图4所示,所述客户端1还包括防hook模块30,所述防hook模块30在初始化模块10启动应用程序并加载安全动态库之后,所述魔数校验模块20动作之前,用于:判断所述校验函数是否被hook;若是,则关闭所述应用程序,若否,则再触发魔数校验模块20执行所述通过执行所述安全动态库的校验函数读取APK签名块中预设位置的数据信息的动作。
在上述实施例的基础上,本发明实施例通过对校验函数进行防Hook保护,来避免攻击者通过Hook工具修改校验函数返回值,从而绕过校验逻辑,从而进一步提高了重打包防御的安全性。
进一步地,基于上述实施例,防hook模块30在用于判断所述校验函数是否被hook时,具体用于:通过反射检测Hook工具的作用方法列表中是否包含所述校验函数的校验函数名,若结果为包含,则确认所述校验函数被hook。
在上述实施例的基础上,本发明实施例通过反射检测Hook工具的作用方法列表中是否包含所述校验函数的校验函数名来判断校验函数是否被hook,从而在保证效率的基础上,进一步提高了重打包防御的安全性。
进一步地,基于上述实施例,防hook模块30在用于通过反射检测Hook工具的作用方法列表中是否包含所述校验函数的校验函数名之后,若结果为未包含,则进一步用于通过校验所述校验函数的第一句指令是否被替换为跳转指令,来判断所述校验函数是否被hook;若所述第一句指令被替换为跳转指令,则确认所述校验函数被hook,否则,确认所述校验函数未被hook。
在上述实施例的基础上,本发明实施例在通过反射检测Hook工具的作用方法列表中不包含校验函数的校验函数名之后,进一步通过校验校验函数的第一句指令是否被替换为跳转指令,来判断校验函数是否被hook,进一步提高了重打包防御的安全性。
进一步地,基于上述实施例,还可以包括一服务端2。所述客户端1和服务端2组成系统。所述客户端1还包括签名通信模块40,所述签名通信模块40在初始化模块10加载安全动态库之后,用于:调用所述安全动态库的加签函数生成签名字段,向服务端2发起请求,并在所述请求中携带所述签名字段;所述服务端2用于对所述签名字段进行校验,若所述签名字段为空或不正确,则获知所述安全动态库被删除或被替换,从而执行预设动作并向所述客户端1的签名通信模块40返回预设信息;所述签名通信模块40接收所述预设信息,关闭所述应用程序。
在上述实施例的基础上,本发明实施例通过在客户端与服务端的通信中添加通过安全动态库的加签函数生成的签名字段,根据签名字段是否为空或不正确来进一步判断是否重打包,防止了攻击者通过删除或替换安全动态库抵御防重打包,进一步提高了重打包防御的安全性。
进一步地,基于上述实施例,所述预设动作包括阻断所述应用程序的通信进程。
在上述实施例的基础上,本发明实施例通过在服务端判断重打包后,阻断应用程序的通信进程,进一步提高了重打包防御的安全性。
进一步地,基于上述实施例,所述预设信息包括预设错误消息。
在上述实施例的基础上,本发明实施例通过在服务端判断重打包后,阻断应用程序的通信进程,并向客户端发送预设错误消息以使客户端关闭应用程序,进一步提高了重打包防御的安全性。
本发明实施例提供的设备和系统是用于上述方法的,具体功能可参照上述方法流程,此处不再赘述。
图5是本发明一实施例提供的电子设备的实体结构示意图。如图5所示,该电子设备可以包括:处理器(processor)510、通信接口(Communications Interface)520、存储器(memory)530和通信总线540,其中,处理器510,通信接口520,存储器530通过通信总线540完成相互间的通信。处理器510可以调用存储器530中的逻辑指令,以执行如下方法:客户端的一个应用程序启动后,加载安全动态库,并通过执行所述安全动态库的校验函数读取APK签名块中预设位置的数据信息;其中,所述预设位置为ID-value结构体所在区块中的非签名校验子块;判断所述数据信息是否与预设魔数一致,若一致,则所述应用程序未被重打包,继续执行所述应用程序;若不一致或为空,则所述应用程序被重打包,关闭所述应用程序。
此外,上述的存储器530中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务端,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
另一方面,本发明实施例还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各实施例提供的方法,例如包括:客户端的一个应用程序启动后,加载安全动态库,并通过执行所述安全动态库的校验函数读取APK签名块中预设位置的数据信息;其中,所述预设位置为ID-value结构体所在区块中的非签名校验子块;判断所述数据信息是否与预设魔数一致,若一致,则所述应用程序未被重打包,继续执行所述应用程序;若不一致或为空,则所述应用程序被重打包,关闭所述应用程序。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务端,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (10)

1.一种确定应用程序是否被重打包的方法,其特征在于,所述方法应用于客户端,包括:
所述客户端的一个应用程序启动后,加载安全动态库,并通过执行所述安全动态库的校验函数读取APK签名块中预设位置的数据信息;其中,所述预设位置为ID-value结构体所在区块中的非签名校验子块;所述非签名校验子块为APK文件的签名校验过程中不进行校验的APK签名块中ID-value结构体所在区块中的子块;
判断所述数据信息是否与预设魔数一致,若一致,则所述应用程序未被重打包,继续执行所述应用程序;若不一致或为空,则所述应用程序被重打包,关闭所述应用程序。
2.根据权利要求1所述的确定应用程序是否被重打包的方法,其特征在于,在Android系统中,所述非签名校验子块的ID值不为0x7109871a;其中,Android系统对apk文件的签名校验过程中仅校验所述区块中ID值为0x7109871a对应的value值,对所述区块中的其他ID-value值不进行任何处理。
3.根据权利要求1所述的确定应用程序是否被重打包的方法,其特征在于,在所述加载安全动态库之后,所述方法还包括:判断所述校验函数是否被hook;若是,则关闭所述应用程序,若否,则再执行所述通过执行所述安全动态库的校验函数读取APK签名块中预设位置的数据信息。
4.根据权利要求3所述的确定应用程序是否被重打包的方法,其特征在于,所述判断所述校验函数是否被hook,包括:通过反射检测Hook工具的作用方法列表中是否包含所述校验函数的校验函数名,若结果为包含,则确认所述校验函数被hook。
5.根据权利要求4所述的确定应用程序是否被重打包的方法,其特征在于,在所述通过反射检测Hook工具的作用方法列表中是否包含所述校验函数的校验函数名之后,若结果为未包含,则进一步通过校验所述校验函数的第一句指令是否被替换为跳转指令,来判断所述校验函数是否被hook;若所述第一句指令被替换为跳转指令,则确认所述校验函数被hook,否则,确认所述校验函数未被hook。
6.根据权利要求1至5任一所述的确定应用程序是否被重打包的方法,其特征在于,在所述加载安全动态库之后,所述方法还包括:
调用所述安全动态库的加签函数生成签名字段,向服务端发起请求,并在所述请求中携带所述签名字段,以供所述服务端对所述签名字段进行校验,若所述签名字段为空或不正确,则获知所述安全动态库被删除或被替换,从而执行预设动作并返回预设信息;
接收所述预设信息,关闭所述应用程序。
7.根据权利要求6所述的确定应用程序是否被重打包的方法,其特征在于,所述预设动作包括阻断所述应用程序的通信进程,所述预设信息包括预设错误消息。
8.一种确定应用程序是否被重打包的设备,包括客户端,其特征在于,所述客户端包括初始化模块和魔数校验模块,其中:
所述初始化模块用于启动应用程序并加载安全动态库;
所述魔数校验模块用于:通过执行所述安全动态库的校验函数读取APK签名块中预设位置的数据信息;其中,所述预设位置为ID-value结构体所在区块中的非签名校验子块;所述非签名校验子块为APK文件的签名校验过程中不进行校验的APK签名块中ID-value结构体所在区块中的子块;判断所述数据信息是否与预设魔数一致,若一致,则所述应用程序未被重打包,继续执行所述应用程序;若不一致或为空,则所述应用程序被重打包,关闭所述应用程序。
9.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至7任一项所述确定应用程序是否被重打包的方法的步骤。
10.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现如权利要求1至7任一项所述确定应用程序是否被重打包的方法的步骤。
CN202010082638.XA 2020-02-07 2020-02-07 一种确定应用程序是否被重打包的方法及设备 Active CN111353148B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010082638.XA CN111353148B (zh) 2020-02-07 2020-02-07 一种确定应用程序是否被重打包的方法及设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010082638.XA CN111353148B (zh) 2020-02-07 2020-02-07 一种确定应用程序是否被重打包的方法及设备

Publications (2)

Publication Number Publication Date
CN111353148A CN111353148A (zh) 2020-06-30
CN111353148B true CN111353148B (zh) 2022-10-14

Family

ID=71192211

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010082638.XA Active CN111353148B (zh) 2020-02-07 2020-02-07 一种确定应用程序是否被重打包的方法及设备

Country Status (1)

Country Link
CN (1) CN111353148B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112506878A (zh) * 2020-12-17 2021-03-16 深圳市欢太科技有限公司 文件处理方法、装置、存储介质及电子设备
CN117807605A (zh) * 2022-09-23 2024-04-02 华为技术有限公司 一种数据保护方法及电子设备

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105956456A (zh) * 2016-04-26 2016-09-21 南京邮电大学 一种对Android系统进行四重联合签名验证的实现方法
CN106022098A (zh) * 2016-05-10 2016-10-12 青岛海信传媒网络技术有限公司 一种应用程序的签名验证方法和装置
CN108683502A (zh) * 2018-03-30 2018-10-19 上海连尚网络科技有限公司 一种数字签名验证方法、介质及设备
CN110401717A (zh) * 2019-07-26 2019-11-01 上海优扬新媒信息技术有限公司 一种应用程序安装包生成方法及装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101944010B1 (ko) * 2012-02-24 2019-01-30 삼성전자 주식회사 애플리케이션의 변조 감지 방법 및 장치

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105956456A (zh) * 2016-04-26 2016-09-21 南京邮电大学 一种对Android系统进行四重联合签名验证的实现方法
CN106022098A (zh) * 2016-05-10 2016-10-12 青岛海信传媒网络技术有限公司 一种应用程序的签名验证方法和装置
CN108683502A (zh) * 2018-03-30 2018-10-19 上海连尚网络科技有限公司 一种数字签名验证方法、介质及设备
CN110401717A (zh) * 2019-07-26 2019-11-01 上海优扬新媒信息技术有限公司 一种应用程序安装包生成方法及装置

Also Published As

Publication number Publication date
CN111353148A (zh) 2020-06-30

Similar Documents

Publication Publication Date Title
CN102855274B (zh) 一种可疑进程检测的方法和装置
CN108683502B (zh) 一种数字签名验证方法、介质及设备
Zheng et al. DroidRay: a security evaluation system for customized android firmwares
CN110083604B (zh) 一种数据确权方法及装置
CN111353148B (zh) 一种确定应用程序是否被重打包的方法及设备
US20160142437A1 (en) Method and system for preventing injection-type attacks in a web based operating system
CN106529218B (zh) 一种应用校验方法和装置
US20150095653A1 (en) Method and apparatus of creating application package, method and apparatus of executing application package, and recording medium storing application package
CN108259479B (zh) 业务数据处理方法、客户端与计算机可读存储介质
CN108496323B (zh) 一种证书导入方法及终端
CN104751049A (zh) 一种应用程序安装方法及移动终端
CN107273742B (zh) 一种安卓应用的授权安装方法、扫码支付终端、服务器及系统
CN110830257B (zh) 一种文件签名方法、装置、电子设备及可读存储介质
CN110826092A (zh) 一种文件签名处理系统
CN111950035A (zh) 对apk文件完整性保护的方法、系统、设备及存储介质
CN109992966A (zh) 存储器子系统、安全客户端装置及其认证方法
US11574046B2 (en) Protecting a software program against tampering
CN109725985B (zh) 虚拟机模板的管理方法及装置
US8205094B2 (en) Tamper evident removable media storing executable code
CN112134905B (zh) 基于安卓系统的签名方法、装置以及设备
CN112149068A (zh) 基于访问的授权校验方法、信息的生成方法及装置、服务器
CN107145342B (zh) 应用的渠道信息的处理方法和装置
CN110581833B (zh) 一种业务安全保护方法及装置
CN109902500B (zh) 一种通过链接库实现业务调用数据安全的方法及系统
CN106888094A (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