CN114398192A - 一种检测绕过Windows控制流防护CFG的方法及装置 - Google Patents

一种检测绕过Windows控制流防护CFG的方法及装置 Download PDF

Info

Publication number
CN114398192A
CN114398192A CN202111639472.8A CN202111639472A CN114398192A CN 114398192 A CN114398192 A CN 114398192A CN 202111639472 A CN202111639472 A CN 202111639472A CN 114398192 A CN114398192 A CN 114398192A
Authority
CN
China
Prior art keywords
cfg
control flow
windows
module
detecting
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.)
Granted
Application number
CN202111639472.8A
Other languages
English (en)
Other versions
CN114398192B (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.)
Anxin Wangdun Beijing Technology Co ltd
Original Assignee
Anxin Wangdun Beijing 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 Anxin Wangdun Beijing Technology Co ltd filed Critical Anxin Wangdun Beijing Technology Co ltd
Priority to CN202111639472.8A priority Critical patent/CN114398192B/zh
Publication of CN114398192A publication Critical patent/CN114398192A/zh
Application granted granted Critical
Publication of CN114398192B publication Critical patent/CN114398192B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/547Remote procedure calls [RPC]; Web services
    • 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/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/544Remote
    • 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/034Test or assess a computer or a system

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Storage Device Security (AREA)

Abstract

本发明提供一种检测绕过Windows控制流防护CFG的方法和装置,所述方法包括以下步骤:步骤S1,对Windows模块的存放CFG检测函数的地址变量设置写断点;步骤S2,注册异常处理函数;步骤S3,当存放CFG检测函数的地址变量的内容被改写时,触发写断点,操作系统执行所述异常处理函数;步骤S4,所述异常处理函数判断发生的异常是否是步骤S1触发的,如果是,则检测到绕过Windows控制流防护CFG的攻击。本发明针对新的绕过CFG的方法提出了一种新的检测手段。

Description

一种检测绕过Windows控制流防护CFG的方法及装置
技术领域
本发明涉及计算机信息安全领域,尤其涉及一种检测绕过Windows控制流防护CFG的方法及装置。
背景技术
控制流防护CFG(Control Flow Guard)是微软从Windows 8.1开始推出的一种防止利用内存漏洞攻击的缓解措施,用于阻止攻击者对可执行代码的间接调用。传统的绕过CFG的方法通常需要构造返回导向编程ROP(Return-oriented programming)链,现有技术中也已经存在多种通过构造ROP链绕过CFG的攻击检测方法。
随着系统攻击技术的发展,最新的绕过CFG的方法不再构造ROP链,而是利用Windows RPC(Remote Procedure Call,远程调用)来绕过CFG,RPC是一种C/S架构的客户端/服务器功能调用的方案。基于Windows RPC,客户端可以调用与本地函数调用相同的服务器功能。对于这种新出现的绕过CFG的方法,现有技术中针对通过构造ROP链绕过CFG攻击的检测方法均失效了,目前现有技术中针对这种利用Windows RPC来绕过CFG的方法,还没有很好的检测手段。
发明内容
为解决上述技术问题,本发明提出了一种检测绕过Windows控制流防护CFG的方法及装置,用以解决现有技术中针对利用Windows RPC来绕过CFG的方法,还没有很好的检测手段的技术问题。
根据本发明的第一方面,提供了一种检测绕过Windows控制流防护CFG的方法,包括以下步骤:
步骤S1,对Windows模块的存放CFG检测函数的地址变量设置写断点;
步骤S2,注册异常处理函数;
步骤S3,当存放CFG检测函数的地址变量的内容被改写时,触发写断点,操作系统执行所述异常处理函数;
步骤S4,所述异常处理函数判断发生的异常是否是步骤S1触发的,如果是,则检测到绕过Windows控制流防护CFG的攻击。
进一步地,所述存放CFG检测函数的地址变量为Windows系统模块的__guard_check_icall_fptr变量。
进一步地,所述异常处理函数为通过VEH或SEH设置的异常处理函数。
进一步地,所述写断点为内存写断点或硬件写断点。
根据本发明第二方面,提供一种检测绕过Windows控制流防护CFG的装置,所述装置包括:
设置写断点模块,用于对Windows模块的存放CFG检测函数的地址变量设置写断点;
注册模块,用于注册异常处理函数;
触发模块,用于当存放CFG检测函数的地址变量的内容被改写时,触发写断点,操作系统执行所述异常处理函数;
检测模块,用于所述异常处理函数判断发生的异常是否是所述设置写断点模块触发的,如果是,则检测到绕过Windows控制流防护CFG的攻击。
进一步地,所述存放CFG检测函数的地址变量为Windows系统模块的__guard_check_icall_fptr变量。
进一步地,所述异常处理函数为通过VEH或SEH设置的异常处理函数。
进一步地,所述写断点为内存写断点或硬件写断点。
根据本发明第三方面,提供一种检测绕过Windows控制流防护CFG的系统,包括处理器和存储器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行如前所述的检测绕过Windows控制流防护CFG的方法。
根据本发明第四方面,提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序用于由处理器加载并执行如前所述的检测绕过Windows控制流防护CFG的方法。
根据本发明的上述方案,能够获得以下技术效果:首先,针对最新出现的利用Windows RPC来绕过CFG的方法,提出了一种有效的检测手段。其次,本发明的检测手段效果显著,能够在漏洞利用关键阶段就能检测并让攻击利用失败,从而为系统提供保护。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,并可依照说明书的内容予以实施,以下以本发明的较佳实施例并配合附图详细说明如后。
附图说明
构成本发明的一部分的附图用来提供对本发明的进一步理解,本发明提供如下附图进行说明。在附图中:
图1为本发明一个实施方式的利用Windows RPC来绕过CFG的方法流程图;
图2为本发明一个实施方式的利用Windows RPC来绕过CFG的装置结构框图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明具体实施例及相应的附图对本发明技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
首先介绍基于Windows RPC的绕过CFG的新方法。远程调用RPC(Remote ProcedureCall),是一种C/S架构的客户端/服务器功能调用的方案。基于Windows RPC,客户端可以调用与本地函数调用相同的服务器功能。客户端/服务器程序将调用参数或返回值传递给较低级的Stub函数,Stub函数负责将数据封装为NDR格式,客户端和服务器的通信是由Windows的rpcrt4.dll这个系统动态库负责。利用Windows RPC绕过CFG的新方法是通过构造虚假的RPC_MESSAGE,设置要调用的函数指针和函数参数,然后手动调用rpcrt4.dll这个系统动态库的导出函数NdrServerCall2以实现任意函数调用。然而从Windows 8.1开始,NdrServerCall2中对这个函数调用进行了CFG检查。因此新的绕过CFG方法中使用伪造的RPC_MESSAGE,通过调用NdrServerCall2调用系统模块kernel32.dll中的VirtualProtect函数,所述VirtualProtect函数是修改内存属性的函数,将rpcrt4的系统检测CFG的函数地址存放在__guard_check_icall_fptr变量里。通过VirtualProtect函数将__guard_check_icall_fptr的内存属性修改为可读、可写、可执行,并将rpcrt4.dll的__guard_check_icall_fptr处保存的指针替换为系统模块ntdll.dll中的KiFastSystemCallRet函数,由于KiFastSystemCallRet函数只是一条简单的退出指令ret,因此在要执行CFG检查的时候执行退出,从而达到了绕过CFG检查的目的。本发明提出的攻击检测方法,正是针对上述的Windows RPC的绕过CFG的新方法提出的一种全新的检测手段,能够有效检测并防御这一新的绕过CFG的方法。
上述的__guard_check_icall_fptr存放的是Windows系统的CFG检测函数,通过上述攻击,__guard_check_icall_fptr这个变量已经被替换成ntdll.dll中的KiFastSystemCallRet函数,而KiFastSystemCallRet是一个空函数(里面没有任何代码),因此Windows系统的CFG检测流程就此瘫痪了,从而绕过系统的CFG检测。
下面结合图1说明本发明一个实施方式的检测绕过Windows控制流防护CFG的方法流程图。如图1所示,所述方法包括以下步骤:
步骤S1,对Windows模块的存放CFG检测函数的地址变量设置写断点;
在该步骤中,所述存放CFG检测函数的地址变量为Windows系统模块的__guard_check_icall_fptr变量。设置的写断点可以为硬件写断点、内存写断点。
步骤S2,注册异常处理函数;
在该步骤中,所述异常处理函数为通过VEH或SEH设置的异常处理函数。
步骤S3,当存放CFG检测函数的地址变量的内容被改写时,触发写断点,操作系统执行所述异常处理函数;
步骤S4,所述异常处理函数判断发生的异常是否是步骤S1触发的,如果是,则检测到绕过Windows控制流防护CFG的攻击。
在步骤S3和S4中,当新的绕过CFG方法试图替换rpcrt4.dll的__guard_check_icall_fptr指针时,硬件断点或内存断点会被触发,这样程序控制流就会走到先前安装的VEH或者SEH异常处理函数,在VEH或者SEH异常处理函数里判断异常类型是单步异常或内存访问异常且被写的地址是rpcrt4.dll的__guard_check_icall_fptr指针时,则认为是有新的绕过CFG手段发生,进而检测到新的绕过CFG的方法,这时可结束此进程,或者发出告警,从而达到防御目的。
本发明实施例针对新的绕过CFG的方法提出新的检测手段,检测效果显著,能够在漏洞利用关键阶段就能检测并让攻击利用失败,从而起到保护系统安全的作用。
本发明实施例进一步给出一种检测绕过Windows控制流防护CFG的装置,如图2所示,所述装置包括:
设置写断点模块,用于对Windows模块的存放CFG检测函数的地址变量设置写断点;
注册模块,用于注册异常处理函数;
触发模块,用于当存放CFG检测函数的地址变量的内容被改写时,触发写断点,操作系统执行所述异常处理函数;
检测模块,用于所述异常处理函数判断发生的异常是否是所述设置写断点模块触发的,如果是,则检测到绕过Windows控制流防护CFG的攻击。
进一步地,所述存放CFG检测函数的地址变量为Windows系统模块的__guard_check_icall_fptr变量。
进一步地,所述异常处理函数为通过VEH或SEH异常处理函数。
进一步地,所述写断点为内存写断点或硬件写断点。
本实施例中的检测绕过Windows控制流防护CFG的装置各功能模块所执行的功能与前述实施例中的检测绕过Windows控制流防护CFG方法的步骤相对应,在此不再赘述。
本发明实施例进一步给出一种检测绕过Windows控制流防护CFG的系统,包括处理器和存储器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行如前所述的检测绕过Windows控制流防护CFG的方法。
本发明实施例进一步给出一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序用于由处理器加载并执行如前所述的检测绕过Windows控制流防护CFG的方法。
需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
在本发明所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括计算机程序用以使得一台计算机装置(可以是个人计算机,实体机服务器,或者网络云服务器等,需安装Windows、WindowsServer、Linux所有版本操作系统)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。

Claims (10)

1.一种检测绕过Windows控制流防护CFG的方法,其特征在于,包括以下步骤:
步骤S1,对Windows模块的存放CFG检测函数的地址变量设置写断点;
步骤S2,注册异常处理函数;
步骤S3,当存放CFG检测函数的地址变量的内容被改写时,触发写断点,操作系统执行所述异常处理函数;
步骤S4,所述异常处理函数判断发生的异常是否是步骤S1触发的,如果是,则检测到绕过Windows控制流防护CFG的攻击。
2.如权利要求1所述的检测绕过Windows控制流防护CFG的方法,其特征在于,所述存放CFG检测函数的地址变量为Windows系统模块的__guard_check_icall_fptr变量。
3.如权利要求1或2所述的检测绕过Windows控制流防护CFG的方法,其特征在于,所述异常处理函数为通过VEH或SEH设置的异常处理函数。
4.如权利要求1或2所述的检测绕过Windows控制流防护CFG的方法,其特征在于,所述写断点为内存写断点或硬件写断点。
5.一种检测绕过Windows控制流防护CFG的装置,其特征在于,所述装置包括:
设置写断点模块,用于对Windows模块的存放CFG检测函数的地址变量设置写断点;
注册模块,用于注册异常处理函数;
触发模块,用于当存放CFG检测函数的地址变量的内容被改写时,触发写断点,操作系统执行所述异常处理函数;
检测模块,用于所述异常处理函数判断发生的异常是否是所述设置写断点模块触发的,如果是,则检测到绕过Windows控制流防护CFG的攻击。
6.如权利要求5所述的检测绕过Windows控制流防护CFG的装置,其特征在于,所述存放CFG检测函数的地址变量为Windows系统模块的__guard_check_icall_fptr变量。
7.如权利要求5或6所述的检测绕过Windows控制流防护CFG的装置,其特征在于,所述异常处理函数为通过VEH或SEH设置的异常处理函数。
8.如权利要求5或6所述的检测绕过Windows控制流防护CFG的装置,其特征在于,所述写断点为内存写断点或硬件写断点。
9.一种检测绕过Windows控制流防护CFG的系统,包括处理器和存储器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行如权利要求1-4任一项所述的检测绕过Windows控制流防护CFG的方法。
10.一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序用于由处理器加载并执行如权利要求1-4任一项所述的检测绕过Windows控制流防护CFG的方法。
CN202111639472.8A 2021-12-29 2021-12-29 一种检测绕过Windows控制流防护CFG的方法及装置 Active CN114398192B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111639472.8A CN114398192B (zh) 2021-12-29 2021-12-29 一种检测绕过Windows控制流防护CFG的方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111639472.8A CN114398192B (zh) 2021-12-29 2021-12-29 一种检测绕过Windows控制流防护CFG的方法及装置

Publications (2)

Publication Number Publication Date
CN114398192A true CN114398192A (zh) 2022-04-26
CN114398192B CN114398192B (zh) 2023-05-05

Family

ID=81229154

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111639472.8A Active CN114398192B (zh) 2021-12-29 2021-12-29 一种检测绕过Windows控制流防护CFG的方法及装置

Country Status (1)

Country Link
CN (1) CN114398192B (zh)

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8607328B1 (en) * 2005-03-04 2013-12-10 David Hodges Methods and systems for automated system support
CN106991324A (zh) * 2017-03-30 2017-07-28 兴华永恒(北京)科技有限责任公司 一种基于内存保护类型监控的恶意代码跟踪识别方法
CN108139921A (zh) * 2015-10-01 2018-06-08 微软技术许可有限责任公司 仿真器的性能优化
CN109558726A (zh) * 2018-09-29 2019-04-02 四川大学 一种基于动态分析的控制流劫持攻击检测技术与系统
CN111177727A (zh) * 2019-09-23 2020-05-19 腾讯科技(深圳)有限公司 漏洞检测方法及装置
CN111880903A (zh) * 2020-07-30 2020-11-03 浪潮云信息技术股份公司 一种基于DevOps的云平台虚拟机镜像自动化制作、测试及发布装置和方法
CN112685744A (zh) * 2020-12-28 2021-04-20 安芯网盾(北京)科技有限公司 一种利用栈相关寄存器检测软件漏洞的方法及装置

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8607328B1 (en) * 2005-03-04 2013-12-10 David Hodges Methods and systems for automated system support
CN108139921A (zh) * 2015-10-01 2018-06-08 微软技术许可有限责任公司 仿真器的性能优化
CN106991324A (zh) * 2017-03-30 2017-07-28 兴华永恒(北京)科技有限责任公司 一种基于内存保护类型监控的恶意代码跟踪识别方法
CN109558726A (zh) * 2018-09-29 2019-04-02 四川大学 一种基于动态分析的控制流劫持攻击检测技术与系统
CN111177727A (zh) * 2019-09-23 2020-05-19 腾讯科技(深圳)有限公司 漏洞检测方法及装置
CN111880903A (zh) * 2020-07-30 2020-11-03 浪潮云信息技术股份公司 一种基于DevOps的云平台虚拟机镜像自动化制作、测试及发布装置和方法
CN112685744A (zh) * 2020-12-28 2021-04-20 安芯网盾(北京)科技有限公司 一种利用栈相关寄存器检测软件漏洞的方法及装置

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
BLOGSCRT: "Exploiting a misused C++ shared pointer on Windows 10", 《HTTPS://BLOG.SCRT.CH/TAG/CONTROL-FLOW-GUARD/》 *
F01965: "CFG防护机制的简要分析", 《HTTPS://XZ.ALIYUN.COM/T/2587》 *
绿盟科技: "分析及防护:Win10 执行流保护绕过问题", 《HTTP://BLOG.NSFOCUS.NET/WIN10-CFG-BYPASS/》 *

Also Published As

Publication number Publication date
CN114398192B (zh) 2023-05-05

Similar Documents

Publication Publication Date Title
CN102799817B (zh) 用于使用虚拟化技术进行恶意软件保护的系统和方法
CN106991324B (zh) 一种基于内存保护类型监控的恶意代码跟踪识别方法
CN107330320B (zh) 应用进程监控的方法和装置
US8645923B1 (en) Enforcing expected control flow in program execution
CN103679032B (zh) 防御恶意软件的方法和装置
CN107066311A (zh) 一种内核数据访问控制方法与系统
KR101064164B1 (ko) 리눅스 커널 기반 스마트 플랫폼 내에서의 커널 무결성 검사 및 변조된 커널 데이터 복구 방법
CN111524007A (zh) 一种智能合约的嵌入式入侵检测方法及装置
CN116150739A (zh) 一种基于关键地址动态保护的栈溢出自动防御方法
US7620983B1 (en) Behavior profiling
CN106682512B (zh) 一种防止程序被修改的方法及其装置、系统
CN114398192A (zh) 一种检测绕过Windows控制流防护CFG的方法及装置
CN107818260B (zh) 保障系统安全的方法及装置
CN113518055B (zh) 数据安全防护的处理方法及装置、存储介质、终端
JP4643201B2 (ja) バッファオーバーフロー脆弱性分析方法、データ処理装置、分析情報提供装置、分析情報抽出処理用プログラムおよび分析情報提供処理用プログラム
CN105631317B (zh) 一种系统调用方法及装置
CN114238943A (zh) 应用程序防护方法、装置、设备及存储介质
CN114070580B (zh) 反序列化攻击检测方法、装置、电子设备、介质及程序
CN114741694B (zh) 一种检测shellcode执行的方法、装置、设备及存储介质
CN116910768B (zh) 一种防御攻击方法、系统、装置及介质
CN112395599B (zh) 系统内核数据的攻击检测方法及装置、存储介质、计算机设备
CN116010946A (zh) 一种数据处理方法、装置、电子设备及存储介质
CN106709552B (zh) 智能卡安全防护方法及装置
CN116684161A (zh) 程序运行方法、装置、电子设备及存储介质
CN115982672A (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