CN108830049B - 一种基于动态控制流图权重序列胎记的软件相似性检测方法 - Google Patents

一种基于动态控制流图权重序列胎记的软件相似性检测方法 Download PDF

Info

Publication number
CN108830049B
CN108830049B CN201810438268.1A CN201810438268A CN108830049B CN 108830049 B CN108830049 B CN 108830049B CN 201810438268 A CN201810438268 A CN 201810438268A CN 108830049 B CN108830049 B CN 108830049B
Authority
CN
China
Prior art keywords
software
similarity
dynamic
control flow
basic block
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
CN201810438268.1A
Other languages
English (en)
Other versions
CN108830049A (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.)
Sichuan University
Nuclear Power Institute of China
Beijing Tongtech Co Ltd
Original Assignee
Sichuan University
Nuclear Power Institute of China
Beijing Tongtech 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 Sichuan University, Nuclear Power Institute of China, Beijing Tongtech Co Ltd filed Critical Sichuan University
Priority to CN201810438268.1A priority Critical patent/CN108830049B/zh
Publication of CN108830049A publication Critical patent/CN108830049A/zh
Application granted granted Critical
Publication of CN108830049B publication Critical patent/CN108830049B/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
    • 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

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种基于动态控制流图权重序列胎记的软件相似性检测方法,先在动态插装平台DynamoRIO下,编写插件程序记录程序执行过程中基本块的首地址和基本块结束时的分支跳转地址;然后分析日志文件,构建程序动态控制流图,并赋予权重;建立权重序列胎记集合WSB,并将WSB长度之比作为参数,计算每对程序的相似度。本发明采用动态插装分析,提取软件运行时特征,可以避免软件抄袭检测中缺乏源码、逆向反汇编困难的问题;在动态插装分析中,仅记录基本块首地址和分支跳转情况,与其他基于动态数据流追踪等技术的胎记相比,开销更小;且能够对抗动态运行时无关干扰信息的影响,即使在软件使用加密壳加密,也能检测出程序相似。

Description

一种基于动态控制流图权重序列胎记的软件相似性检测方法
技术领域
本发明涉及软件安全和软件知识产权的技术领域,具体为一种基于动态控制流图权重序列胎记的软件相似性检测方法。
背景技术
软件盗版,是指对未经授权的软件进行非法复制、传播和使用。据2016年BSA(商业软件联盟)全球软件调查,在个人电脑上装载的软件有39%未经授权,其商业价值为522亿美元。而根据revulytics 2017年软件盗版统计,中国的软件盗版和滥用软件许可证案例位居全球首位。软件盗版已然成为软件产业和软件知识产权的一个严重问题,急需有效的软件相似性检测方法来保护软件知识产权并减少经济损失。
目前,研究人员提出的软件相似性检测方法可以分为三类:基于源码的、基于软件水印的和基于软件胎记的。源码检测方法分析源代码的组成成分和结构,但源代码通常使用混淆技术加以保护,因此源码检测的抗混淆能力较弱。当软件仅以二进制形式发布而不公开源码时,源码检测方法就难以使用。软件水印是一种著名的软件产权保护方法,它在软件发布时嵌入一个特殊的标记即软件水印,软件水印难以移除但容易验证,因此水印可以作为软件相似性检测的重要依据。但Collberg已证实一个足够耐心的攻击者将最终破解任何水印。软件胎记方法,首先从软件中提出特定的特征,然后计算其相似度来判定相似。因为软件胎记是从软件中直接提取的而不依赖于软件源代码和其他数据,所以该方法优于前两种方法。
根据特征提取方法,软件胎记可以分为静态软件胎记和动态软件胎记。静态胎记是从汇编代码或源码中提取的,而动态胎记是从软件运行时信息中提取的。当二进制软件因混淆技术而改变了其汇编代码的结构和内容时,静态胎记也难以处理,而且当软件反汇编失败时,静态胎记方法就失效了。动态胎记方法可以避开反汇编的问题并且具有很好的抗混淆能力。但是,当软件加壳时,原始程序中混入了解壳程序。当提取动态胎记时,混入的解壳程序特征如指令、API和系统调用等难以祛除。现有的大多数动态软件胎记都忽视了如何过滤这些不相关特征的问题。DKISB(动态关键指令序列胎记)使用了动态数据流追踪技术来消除与输入无关的信息,但其开销太大。当软件使用加密壳如MidgetPack时,DKISB需密码或密钥解密,同样会引入无关信息。
发明内容
针对上述问题,本发明的目的在于提供一种能够解决软件相似性检测缺乏源码、逆向反汇编困难、提取动态胎记开销大和祛除无关特征难的问题的基于动态控制流图权重序列胎记的软件相似性检测方法。技术方案如下:
一种基于动态控制流图权重序列胎记的软件相似性检测方法,包括以下步骤:
步骤1:在动态插装平台DynamoRIO下,编写插件程序,记录程序执行过程中基本块的首地址和基本块结束时的分支跳转地址,并输出到日志文件中;
步骤2:逐行分析日志文件,提取每个基本块的首地址,将基本块作为节点并以首地址标注;分析每个分支跳转,将分支跳转作为边,并统计跳转重复次数作为对应边的权重;对多线程程序,将日志文件逐个分析之后,将所得的节点、边合并,并对权重进行累计,得到一个综合的带权动态控制流图;最后将日志分析结果以邻接图的形式存到XML文本中;
步骤3:使用深度优先算法遍历所述带权动态控制流图,遍历的轨迹看成边的序列,而每条边以权重表示,因此遍历轨迹也是一个权重序列;然后使用n-gram方法处理权重序列得到一个权重序列n-gram集合,将集合中相似的项合并,得到权重序列胎记集合WSB;
步骤4:根据余弦计算公式,并将WSB长度之比作为参数,定义拓展的余弦相似度,计算每对程序的相似度;
步骤5:改变输入,对每对程序重复步骤1-4,得到其平均相似度,并与相似度阈值ε对比;当平均相似度大于或等于1-ε时,判定程序相似;当平均相似度小于或等于ε时,判定程序不相似;当平均相似度大于ε且小于1-ε时,对相似性不做判定。
进一步的,所述步骤2中,软件的带权动态控制流图为基于动态基本块粒度的软件结构图,表示为一个3元有向图:
WDCFG=(N,E,W)
其中,N表示节点集合,n∈N表示一个动态基本块;E表示节点集合,e(n0→n1)∈E表示基本块n1在n0执行后立即执行;W表示权重集合,w∈W与某条边相关联,表示这条边在程序执行过程中的重复次数。
更进一步的,所述步骤3中,权重序列n-gram集合表示为
Figure BDA0001655212850000021
其中
Figure BDA0001655212850000022
表示权重序列,V表示具有相同
Figure BDA0001655212850000023
值n-gram项的频数累计;为简化表示,
Figure BDA0001655212850000024
根据极坐标公式转换为K=(r,α),表示为:
Figure BDA0001655212850000025
其中,
Figure BDA0001655212850000026
表示单位向量;
WSB为基于软件带权动态控制流图权重序列特征的动态软件胎记,表示为集合<K,V>={<k0,v0>,<k1,v1>,…,<kn,vn>},其中V表示具有相同K值的n-gram项的频数累计,K是权重序列n-gram项的极坐标表示。
更进一步的,所述步骤4中:WSB相似性算法描述如下:对两个WSB A={<k0,v0>,<k1,v1>,…,<kn,vn>},B={<k‘0,v‘0>,<k‘1,v‘1>,…,<k‘m,v‘m>},
集合S=KeySet(A)∪KeySet(B);
根据以下规则构建A对应的向量
Figure BDA0001655212850000031
Figure BDA0001655212850000032
其中,0≤i≤r,vi表示A中si对应的值,si∈S;
同理,构建B对应的向量
Figure BDA0001655212850000033
然后根据以下公式计算向量
Figure BDA0001655212850000034
Figure BDA0001655212850000035
的拓展余弦值:
Figure BDA0001655212850000036
计算结果即表示两个WSB的相似度。
本发明的有益效果是:
本发明采用动态插装分析,提取软件运行时特征,可以避免软件相似性检测中缺乏源码、逆向反汇编困难的问题;
本发明在动态插装分析中,仅记录基本块首地址和分支跳转情况,与其他基于动态数据流追踪等技术的胎记相比,本发明中提出的胎记特征提取方法,开销更小;
本发明中提出的基于动态控制流图权重序列胎记,能够对抗动态运行时无关干扰信息的影响,即使在软件使用加密壳加密,也能检测出相似。与DKISB胎记相比,WSB对独立开发的软件也有较好的区分性。
附图说明
图1为本发明所述基于WSB的软件相似性检测框架。
图2为本发明所述带权DCFG示意图。
图3为本发明所述带权DCFG构建流程图。
图4为本发明所述N-gram项提取过程示意图。
具体实施方式
下面结合附图和具体实施例对本发明做进一步详细说明。如图1所示,一种基于动态控制流图权重序列胎记的软件相似性检测方法,包括下述步骤:
步骤1:在动态插装平台DynamoRIO下,编写插件程序记录程序执行过程中基本块的首地址和基本块结束时的分支跳转地址。指定测试程序的输入,在DynamoRIO平台中执行测试程序,插件程序将测试程序执行过程中的基本块首地址和分支跳转记录下来,并输出到日志文件中。每一个线程,都有一个专门的日志文件记录对应的测试程序运行时信息。
步骤2:构建程序动态控制流图,并赋予权重,图2是一个程序动态控制流图示意图。如图3分析日志文件,对每个日志文件逐行分析,提取每个基本块的首地址,将基本块作为节点并以首地址标注;分析每个分支跳转,将分支跳转作为边,并统计跳转重复次数作为对应边的权重。对多线程程序,将日志文件逐个分析之后,将所得的节点、边合并,并对权重进行累计,得到一个综合的带权动态控制流图。最后,将日志分析结果以邻接图的形式存到XML文本中。软件带权动态控制流图的定义如下:
软件带权动态控制流图是一种基于动态基本块粒度的软件结构图,可以表示成一个3元有向图WDCFG=(N,E,W),其中N,E,W定义如下:
N表示节点集合,n∈N表示一个动态基本块;
E表示节点集合,e(n0→n1)∈E表示基本块n1在n0执行后立即执行;
W表示权重集合,w∈W与某条边相关联,表示这条边在程序执行过程中的重复次数。
步骤3:如图4使用深度优先算法遍历步骤2所得的带权动态控制流图,遍历的轨迹可以看成是边的序列,而每条边以权重表示,因此遍历轨迹也是一个权重序列。然后使用n-gram方法处理权重序列得到一个权重序列n-gram集合,权重序列n-gram集合可以表示为
Figure BDA0001655212850000041
其中
Figure BDA0001655212850000042
表示权重序列,V表示具有相同
Figure BDA0001655212850000043
值n-gram项的频数累计。为简化表示,
Figure BDA0001655212850000044
可以根据极坐标公式转换为K=(r,α):
Figure BDA0001655212850000045
将集合中相似的项合并,所得集合即WSB(权重序列胎记)。WSB定义如下:
WSB是一种基于步骤2定义的软件带权动态控制流图权重序列特征的动态软件胎记。它可以表示为一个集合<K,V>={<k0,v0>,<k1,v1>,…,<kn,vn>},其中V表示具有相同K值的n-gram项的频数累计,K是权重序列n-gram项的极坐标表示。
步骤4:根据余弦计算公式,并将WSB长度之比作为参数,定义拓展的余弦相似度,计算每对程序的相似度。WSB相似算法描述:
对两个WSB:A={<k0,v0>,<k1,v1>,…,<kn,vn>},B={<k‘0,υ‘0>,<k‘1,υ‘1>,…,<k‘m,υ‘m>},集合S=KeySet(A)∪KeySet(B)。根据以下规则构建A对应的向量
Figure BDA0001655212850000046
Figure BDA0001655212850000047
其中,0≤i≤r,vi表示A中si对应的值。同理,可以构建B对应的向量
Figure BDA0001655212850000048
然后根据以下公式计算向量
Figure BDA0001655212850000049
Figure BDA00016552128500000410
的拓展余弦值:
Figure BDA0001655212850000051
计算结果即表示两个WSB的相似度。
步骤5:改变输入,对每对程序重复步骤1-4,得到其平均相似度,并与相似度阈值ε对比。当平均相似度大于或等于1-ε时,判定程序相似;当平均相似度小于或等于ε时,判定程序不相似;当平均相似度大于ε且小于1-ε时,对相似性不做判定。相似性判定可以归纳为以下公式:
Figure BDA0001655212850000052
表1 WSB和DKISB对加壳软件抗性对比试验结果
Figure BDA0001655212850000053
表1为WSB和DKISB对加壳软件抗性对比试验结果,可以看出,与DKISB胎记相比,WSB对独立开发的软件有更好的区分性。

Claims (3)

1.一种基于动态控制流图权重序列胎记的软件相似性检测方法,其特征在于,包括以下步骤:
步骤1:在动态插装平台DynamoRIO下,编写插件程序,记录程序执行过程中基本块的首地址和基本块结束时的分支跳转地址,并输出到日志文件中;
步骤2:逐行分析日志文件,提取每个基本块的首地址,将基本块作为节点并以首地址标注;分析每个分支跳转,将分支跳转作为边,并统计跳转重复次数作为对应边的权重;对多线程程序,将日志文件逐个分析之后,将所得的节点、边合并,并对权重进行累计,得到一个综合的带权动态控制流图;最后将日志分析结果以邻接图的形式存到XML文本中;
步骤3:使用深度优先算法遍历所述带权动态控制流图,遍历的轨迹看成边的序列,而每条边以权重表示,因此遍历轨迹也是一个权重序列;然后使用n-gram方法处理权重序列得到一个权重序列n-gram集合,将集合中相似的项合并,得到权重序列胎记集合WSB;
步骤4:根据余弦计算公式,并将WSB长度之比作为参数,定义拓展的余弦相似度,计算每对程序的相似度;
WSB相似性算法描述如下:对两个WSB A={<k0,v0>,<k1,v1>,…,<kn,vn>},B={<k‘0,v‘0>,<k‘1,v‘1>,…,<k‘m,v‘m>},
集合S=KeySet(A)∪KeySet(B);
根据以下规则构建A对应的向量
Figure FDA0003083934110000011
Figure FDA0003083934110000012
其中,0≤i≤r,vi表示A中si对应的值,si∈S;
同理,构建B对应的向量
Figure FDA0003083934110000013
然后根据以下公式计算向量
Figure FDA0003083934110000014
Figure FDA0003083934110000015
的拓展余弦值:
Figure FDA0003083934110000016
计算结果即表示两个WSB的相似度;
步骤5:改变输入,对每对程序重复步骤1-4,得到其平均相似度,并与相似度阈值ε对比;当平均相似度大于或等于1-ε时,判定程序相似;当平均相似度小于或等于ε时,判定程序不相似;当平均相似度大于ε且小于1-ε时,对相似性不做判定。
2.根据权利要求1所述基于动态控制流图权重序列胎记的软件相似性检测方法,其特征在于,所述步骤2中,软件的带权动态控制流图为基于动态基本块粒度的软件结构图,表示为一个3元有向图:
WDCFG=(N,E,W)
其中,N表示节点集合,n∈N表示一个动态基本块;E表示边集合,e(n0→n1)∈E表示基本块n1在n0执行后立即执行;W表示权重集合,w∈W与某条边相关联,表示这条边在程序执行过程中的重复次数。
3.根据权利要求2所述基于动态控制流图权重序列胎记的软件相似性检测方法,其特征在于,所述步骤3中,权重序列n-gram集合表示为
Figure FDA0003083934110000021
其中
Figure FDA0003083934110000022
表示权重序列,V表示具有相同
Figure FDA0003083934110000023
值n-gram项的频数累计;为简化表示,
Figure FDA0003083934110000024
根据极坐标公式转换为K=(r,α),表示为:
Figure FDA0003083934110000025
其中,
Figure FDA0003083934110000026
表示单位向量;
WSB为基于软件带权动态控制流图权重序列特征的动态软件胎记,表示为集合<K,V>={<k0,v0>,<k1,v1>,…,<kn,vn>},其中V表示具有相同K值的n-gram项的频数累计,K是权重序列n-gram项的极坐标表示。
CN201810438268.1A 2018-05-09 2018-05-09 一种基于动态控制流图权重序列胎记的软件相似性检测方法 Active CN108830049B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810438268.1A CN108830049B (zh) 2018-05-09 2018-05-09 一种基于动态控制流图权重序列胎记的软件相似性检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810438268.1A CN108830049B (zh) 2018-05-09 2018-05-09 一种基于动态控制流图权重序列胎记的软件相似性检测方法

Publications (2)

Publication Number Publication Date
CN108830049A CN108830049A (zh) 2018-11-16
CN108830049B true CN108830049B (zh) 2021-07-20

Family

ID=64147623

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810438268.1A Active CN108830049B (zh) 2018-05-09 2018-05-09 一种基于动态控制流图权重序列胎记的软件相似性检测方法

Country Status (1)

Country Link
CN (1) CN108830049B (zh)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109815699B (zh) * 2018-12-24 2023-06-20 南京大学 一种基于界面图标特征的安卓软件重打包检测方法
CN110764992B (zh) * 2019-08-26 2023-06-16 北京丁牛科技有限公司 测试方法及装置
CN110532739B (zh) * 2019-08-30 2021-04-30 西安邮电大学 一种基于频繁模式挖掘的多线程程序抄袭检测方法
CN111984311B (zh) * 2020-07-03 2022-04-22 华南理工大学 一种基于运行日志的软件结构复现的方法
CN116561017A (zh) * 2023-07-12 2023-08-08 北京太极信息系统技术有限公司 一种信创应用成熟度测评方法及信创应用开放平台
CN117251171B (zh) * 2023-11-20 2024-04-12 常熟理工学院 一种控制流图中谓词基本块检测方法及设备

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101727391A (zh) * 2009-12-14 2010-06-09 北京理工大学 一种软件漏洞特征操作序列的提取方法
CN103577323A (zh) * 2013-09-27 2014-02-12 西安交通大学 基于动态关键指令序列胎记的软件抄袭检测方法
CN103870721A (zh) * 2014-03-04 2014-06-18 西安交通大学 基于线程切片胎记的多线程软件抄袭检测方法
CN104636256A (zh) * 2015-02-17 2015-05-20 中国农业银行股份有限公司 一种内存访问异常的检测方法及装置
CN107506622A (zh) * 2017-08-25 2017-12-22 武汉大学 一种基于内存对象访问序列的软件动态胎记及抄袭检测方法
CN107967152A (zh) * 2017-12-12 2018-04-27 西安交通大学 基于最小分支路径函数胎记的软件局部抄袭证据生成方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7421586B2 (en) * 1999-05-12 2008-09-02 Fraunhofer Gesselschaft Protecting mobile code against malicious hosts
US20070239993A1 (en) * 2006-03-17 2007-10-11 The Trustees Of The University Of Pennsylvania System and method for comparing similarity of computer programs

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101727391A (zh) * 2009-12-14 2010-06-09 北京理工大学 一种软件漏洞特征操作序列的提取方法
CN103577323A (zh) * 2013-09-27 2014-02-12 西安交通大学 基于动态关键指令序列胎记的软件抄袭检测方法
CN103870721A (zh) * 2014-03-04 2014-06-18 西安交通大学 基于线程切片胎记的多线程软件抄袭检测方法
CN104636256A (zh) * 2015-02-17 2015-05-20 中国农业银行股份有限公司 一种内存访问异常的检测方法及装置
CN107506622A (zh) * 2017-08-25 2017-12-22 武汉大学 一种基于内存对象访问序列的软件动态胎记及抄袭检测方法
CN107967152A (zh) * 2017-12-12 2018-04-27 西安交通大学 基于最小分支路径函数胎记的软件局部抄袭证据生成方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
A Static Java Birthmark Based on Control Flow Edges;Hyun-il Lim 等;《2009 33rd Annual IEEE International Computer Software and Applications Conference》;20090724;第413-420页 *
基于k_gram的动态软件胎记研究;拜亚萌;《中国优秀硕士学位论文全文数据库 信息科技辑》;20081215(第12期);第I138-95页 *

Also Published As

Publication number Publication date
CN108830049A (zh) 2018-11-16

Similar Documents

Publication Publication Date Title
CN108830049B (zh) 一种基于动态控制流图权重序列胎记的软件相似性检测方法
Nagra et al. Threading software watermarks
Wang et al. Behavior based software theft detection
Myles et al. Software watermarking via opaque predicates: Implementation, analysis, and attacks
US20110214188A1 (en) Software watermarking techniques
US20050262490A1 (en) Method of introducing digital signature into software
Wang et al. Exception handling-based dynamic software watermarking
JP2009512051A (ja) 効率的な透かし検出
CN102855423A (zh) 一种文字作品的追踪方法和装置
CN111241576B (zh) 一种用于数据库分发保护的零水印方法
KR101373176B1 (ko) 복제 동영상정보 검출방법 및 장치, 저장매체
Chan et al. Jsbirth: Dynamic javascript birthmark based on the run-time heap
Bai et al. Dynamic k-gram based software birthmark
CN109241706B (zh) 基于静态胎记的软件抄袭检测方法
Bento et al. Towards a provably resilient scheme for graph-based watermarking
CN103377458A (zh) 一种基于字节流的地理空间数据水印方法
Chai et al. A robust and reversible watermarking technique for relational dataset based on clustering
CN103886540A (zh) 椭圆型图形特征的数字指纹嵌入与检测方法
Olliaro et al. Empirical analysis of the impact of queries on watermarked relational databases
Kumar et al. A comparative analysis of static java bytecode software watermarking algorithms
Lim A performance comparison on characteristics of static and dynamic software watermarking methods
Ma et al. Instruction-words based software birthmark
US20130191348A1 (en) Method and device for &#34;tracing multimedia file copies&#34;
Gao et al. Analyze and detect malicious code for compound document binary storage format
Kumar et al. A Comparative analysis of static and dynamic Java Bytecode watermarking algorithms

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