CN106295326A - 一种用于获取显卡内容的内联hook方法和*** - Google Patents
一种用于获取显卡内容的内联hook方法和*** Download PDFInfo
- Publication number
- CN106295326A CN106295326A CN201610662988.7A CN201610662988A CN106295326A CN 106295326 A CN106295326 A CN 106295326A CN 201610662988 A CN201610662988 A CN 201610662988A CN 106295326 A CN106295326 A CN 106295326A
- Authority
- CN
- China
- Prior art keywords
- function
- hook
- video card
- game
- address
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/54—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by adding security routines or objects to programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4482—Procedural
- G06F9/4484—Executing subprograms
- G06F9/4486—Formation of subprogram jump address
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Two-Way Televisions, Distribution Of Moving Picture Or The Like (AREA)
Abstract
本发明涉及游戏直播领域,公开了一种用于获取显卡内容的内联hook方法,包括以下步骤:步骤S1,在目标函数所属模块的函数间查找一个空隙的地址;步骤S2,将hook功能逻辑函数写入另一个模块中,所述hook功能逻辑函数包括用以被目标函数执行的伪造函数;步骤S3,构造一条hook指令,且hook指令使目标函数跳转到步骤S1查找到的空隙地址中;步骤S4,目标函数再跳转到含有hook功能逻辑函数的模块中,同时目标函数执行hook功能逻辑函数中的伪造函数。本发明还公开了一种用于获取显卡内容的***。本发明能够避免安全检测程序对已认可的hook方式进行误判,有效减少游戏厂商繁琐的工作量。
Description
技术领域
本发明涉及游戏直播领域,具体涉及一种用于获取显卡内容的内联hook方法和***。
背景技术
在软件技术中,hook指修改程序的汇编代码,即:修改程序原函数的汇编指令为jmp指令,使程序跳转到伪造函数处,执行完伪造函数逻辑后,再跳转到原函数汇编指令继续执行原函数逻辑。
当前,为了给观众呈现较好的游戏直播画面,游戏直播软件均会采用游戏厂商所认可的hook方式,即主播直播时,游戏直播软件对游戏客户端进程DirectX 9动态链接库模块中的Present函数进行hook,游戏直播软件便能够获取显卡中的显示内容,并将显示内容通过网络发送给服务端;观众访问服务端,便能观看到高品质的主播的游戏直播画面。但游戏厂商会在游戏的客户端中加入安全检测程序,用以对检测客户端的游戏进程中的函数进行检测,判断函数是否被hook,如果被hook,则判断被hook的函数跳转的地址,若是跳转到函数所属模块外的其它模块中,则hook被判定为非法,并终止游戏的运行。
然而,游戏厂商为了加快游戏的推广,通常会和游戏直播公司进行合作,使游戏直播公司对自己的游戏进行直播推广。同时,为了游戏直播软件能够稳定运行,会对自身的安全检测程序进行相应修改,从而与游戏直播软件的hook方式进行适配,避免自身安全检测程序对游戏直播软件的hook方式产生误判。但各家游戏直播公司的游戏直播软件的hook方式均不相同,游戏厂商需要针对各个hook方式,对安全检测程序进行一一适应修改,从而一一适配,其工作量较为浩大,且极其繁琐。
发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种用于获取显卡内容的内联hook方法和***,避免安全检测程序对已认可的hook方式进行误判,有效减少游戏厂商繁琐的工作量。
为达到以上目的,本发明采取的技术方案是:包括以下步骤:
步骤S1,在目标函数所属模块的函数间查找一个空隙的地址;
步骤S2,将hook功能逻辑函数写入另一个模块中,所述hook功能逻辑函数包括用以被目标函数执行的伪造函数;
步骤S3,构造一条hook指令,且hook指令使目标函数跳转到步骤S1查找到的空隙地址中;
步骤S4,目标函数再跳转到含有hook功能逻辑函数的模块中,同时目标函数执行hook功能逻辑函数中的伪造函数。
在上述技术方案的基础上,所述目标函数为游戏组件的DirectX 9动态链接库模块中的Present函数。
在上述技术方案的基础上,所述步骤S1中空隙的地址的内存大于或等于5字节。
在上述技术方案的基础上,所述步骤S3中,构造所述hook指令之前,将目标函数的内存属性修改为可写。
在上述技术方案的基础上,所述hook指令为JMP Address汇编指令,其中Address为步骤S1中查找到的空隙的地址,JMP表示跳转。
在上述技术方案的基础上,所述步骤S4中,目标函数执行完所述伪造函数后,回到原先所属的模块中,然后将目标函数的内存属性修改为只读和执行。
本发明还提供一种用于获取显卡内容的***,该***包括:直播端、控制端和服务端;
所述直播端用于运行游戏组件、游戏直播软件和安全检测程序,所述游戏组件包括多个模块,且每个模块包括多个函数;
所述控制端用于在含有目标函数的模块中查找一个空隙的地址,并在另一个模块中写入hook功能逻辑函数,使目标函数先跳转到空隙地址中,再跳转到含有hook功能逻辑函数的模块中,并执行hook功能逻辑函数;执行完毕后,所述控制端还用于使游戏直播软件获取显卡中显示的游戏画面,并将获取的游戏画面发送给服务端;
所述服务端用于接收游戏直播软件发送的游戏画面。
在上述技术方案的基础上,所述目标函数为游戏组件的DirectX 9动态链接库模块中的Present函数。
在上述技术方案的基础上,所述直播端和控制端均位于游戏主播的PC中,且游戏主播的PC和服务端通过互联网进行通讯。
与现有技术相比,本发明的一种用于获取显卡内容的内联hook方法的优点在于:目标函数先跳转到自身模块中,通过游戏的安全检测程序的检测后,再跳转到其它模块中hook,执行伪造函数,使游戏直播软件获取到显卡中的游戏画面。采用二级跳转的方式,通过游戏安全检测程序的检测,避免游戏中的安全检测程序对本hook方式的误判,游戏厂商也不必对已经认可的hook方式,花费额外的精力来对安全检测程序进行适配修改,使对Present函数的hook通过安全检测程序的检测,即通过游戏厂商认可的、允许游戏直播软件修改非核心游戏组件,采用游戏直播软件自身适配安全检测程序的办法,使得游戏厂商不必针对各个游戏直播软件来对安全检测程序进行修改,有效减少游戏厂商编程人员的工作量,进而减少整个游戏的制作成本。
本发明的一种用于获取显卡内容的***的优点在于:控制端使直播端内存中的目标函数进行二次跳转,通过游戏的安全检测程序的检测,使得游戏直播软件正常获取主播显卡中的游戏画面,即避免安全检测程序对游戏厂商本身已经的认可的hook方式进行误判,也减轻了游戏厂商对安全检测程序作适配修改的工作量,同时也保证了游戏主播的正常直播。
附图说明
图1为本发明一种用于获取显卡内容的内联hook方法的流程图。
具体实施方式
以下结合附图对本发明作进一步详细说明。
参见图1所示,本发明提供一种用于获取显卡内容的内联hook方法,使游戏直播软件通过游戏厂商认可的hook方式来获取显卡显示的画面,该方法具体包括以下步骤:
步骤S1:在目标函数所属的模块中查找一空隙的地址,且空隙的地址的内存大于或等于5字节,本实施例中,该目标函数为游戏组件DirectX 9动态链接库模块中的Present函数,对该目标函数进行hook,然后游戏直播软件便能够获取到显卡中的游戏画面。被hook的目标函数所属的模块通常为一DLL(Dynamic Link Library,动态链接库)文件,且模块中的各个函数间是有空隙的,通常该空隙内填充的为16进制的0xCC数据,即填充的为未初始化的变量,因而可以很便捷的查找到一个内存大于或等于5字节的空隙的地址。
步骤S2:将hook功能逻辑函数写入到另一模块中,即将hook功能逻辑函数写入到目标函数所属模块外的其它模块中。hook功能逻辑函数包括有用以被目标函数执行的伪造函数,伪造函数具体的功能可以为:打印目标函数调用的参数、修改以及调用目标函数的参数以及改变目标函数的执行流程等。目标函数执行完伪造函数后,游戏直播软件便能够获取到显卡中的游戏画面。
步骤S3:调用Windows API函数中的VirtualProtect指令将目标函数的内存属性修改为可写,因为目标函数的代码段是只读而不可写的,所以在hook前需要将目标函数的内存属性修改为可写,然后构造一hook指令,hook指令使目标函数跳转到步骤S1查找到的空隙的地址中,hook指令为JMP Address汇编指令,此处Address为步骤S1中查找到的空隙的地址,JMP表示跳转。
步骤S4:目标函数跳转到含有hook功能逻辑函数的模块中,同时目标函数执行hook功能逻辑函数中的伪造函数,目标函数执行完伪造函数后回到原先所属的模块中,然后再将目标函数的内存属性修改为只读和执行。对于hook功能逻辑函数在模块中所处位置的内存地址,还需调用Windows API(Windows应用程序接口)函数中的VirtualProtect指令,将该内存地址的内存属性修改为可写,然后加入另一JMP Address指令,此处JMPAddress指令中的JMP表示跳转,此处JMP Address指令中的Address的功能为:保存当前运行的寄存器的值,调用伪造函数,恢复寄存器的值,执行目标函数的原始指令。然后再将内存地址的内存属性修改回只读和执行。这样,当目标函数跳转到含有hook功能逻辑函数的模块中时,便能够调出伪造函数,便于被目标函数执行,当目标函数执行完伪造函数后,使目标函数跳回到原先所属的模块中。
通过以上步骤,即采用二级跳转的方式,使目标函数先跳转到自身模块中,然后再跳转到其它模块中hook,执行伪造函数,从而通过安全检测程序的检测,避免游戏中的安全检测程序对本hook方式的误判,游戏厂商也不必对已经认可的hook方式,花费额外的精力来对安全检测程序进行适配修改,使对Present函数的hook通过安全检测程序的检测,即通过游戏厂商认可的,采用游戏直播软件自身适配安全检测程序的办法,使得游戏厂商不必针对各个游戏直播软件来对安全检测程序进行修改,有效减少游戏厂商编程人员的工作量,进而减少整个游戏的制作成本。游戏直播软件便能够获取到显卡中的游戏画面了。
本发明还提供一种基于上述内联hook方法的用于获取显卡内容的***,该***包括直播端、控制端和服务端。直播端和控制端均位于游戏主播的PC(personal computer,个人计算机)中,服务端位于直播公司的机房内,游戏主播的PC和服务端通过互联网进行通讯。
直播端运行有游戏的多个模块、游戏直播软件和安全检测程序;控制端用于在含有目标函数的模块中查找一个空隙的地址,并在另一模块中写入hook功能逻辑函数,然后使目标函数先跳转到空隙的地址中,目标函数为游戏组件的DirectX 9动态链接库模块中的Present函数,目标函数再跳转到含有hook功能逻辑函数的模块中,并执行hook功能逻辑函数,当执行完hook功能逻辑函数后,控制端使游戏直播软件获取显卡中显示的游戏画面,并将获取的显卡中显示的游戏画面发送给服务端;服务端用于接收游戏直播软件发送的游戏画面,观众通过智能设备或PC访问服务端,即可观看游戏主播的直播画面。
该***通过采用二级跳转的方式,对游戏客户端的游戏组件的DirectX 9动态链接库模块中的Present函数进行hook,通过游戏的安全检测程序的检测,使得游戏直播软件能够获取显卡中显示的游戏画面,避免安全检测程序对游戏厂商本身已经认可的非核心组件的修改进行误判,既减轻了游戏厂商对安全检测程序作适配修改的工作量,同时也保证了游戏主播的正常直播。
本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。
Claims (9)
1.一种用于获取显卡内容的内联hook方法,对目标函数进行hook后获取显卡内容,其特征在于,包括以下步骤:
步骤S1,在目标函数所属模块的函数间查找一个空隙的地址;
步骤S2,将hook功能逻辑函数写入另一个模块中,所述hook功能逻辑函数包括用以被目标函数执行的伪造函数;
步骤S3,构造一条hook指令,且hook指令使目标函数跳转到步骤S1查找到的空隙地址中;
步骤S4,目标函数再跳转到含有hook功能逻辑函数的模块中,同时目标函数执行hook功能逻辑函数中的伪造函数。
2.如权利要求1所述的一种用于获取显卡内容的内联hook方法,其特征在于:所述目标函数为游戏组件的DirectX 9动态链接库模块中的Present函数。
3.如权利要求1所述的一种用于获取显卡内容的内联hook方法,其特征在于:所述步骤S1中空隙的地址的内存大于或等于5字节。
4.如权利要求1所述的一种用于获取显卡内容的内联hook方法,其特征在于:所述步骤S3中,构造所述hook指令之前,将目标函数的内存属性修改为可写。
5.如权利要求4所述的一种用于获取显卡内容的内联hook方法,其特征在于:所述hook指令为JMP Address汇编指令,其中Address为步骤S1中查找到的空隙的地址,JMP表示跳转。
6.如权利要求1所述的一种用于获取显卡内容的内联hook方法,其特征在于:所述步骤S4中,目标函数执行完所述伪造函数后,回到原先所属的模块中,然后将目标函数的内存属性修改为只读和执行。
7.一种基于权利要求1所述内联hook方法的用于获取显卡内容的***,其特征在于,该***包括:直播端、控制端和服务端;
所述直播端用于运行游戏组件、游戏直播软件和安全检测程序,所述游戏组件包括多个模块,且每个模块包括多个函数;
所述控制端用于在含有目标函数的模块中查找一个空隙的地址,并在另一个模块中写入hook功能逻辑函数,使目标函数先跳转到空隙地址中,再跳转到含有hook功能逻辑函数的模块中,并执行hook功能逻辑函数;执行完毕后,所述控制端还用于使游戏直播软件获取显卡中显示的游戏画面,并将获取的游戏画面发送给服务端;
所述服务端用于接收游戏直播软件发送的游戏画面。
8.如权利要求7所述的一种用于获取显卡内容的***,其特征在于:所述目标函数为游戏组件的DirectX 9动态链接库模块中的Present函数。
9.如权利要求7所述的一种用于获取显卡内容的***,其特征在于:所述直播端和控制端均位于游戏主播的PC中,且游戏主播的PC和服务端通过互联网进行通讯。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610662988.7A CN106295326B (zh) | 2016-08-12 | 2016-08-12 | 一种用于获取显卡内容的内联hook方法和*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610662988.7A CN106295326B (zh) | 2016-08-12 | 2016-08-12 | 一种用于获取显卡内容的内联hook方法和*** |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106295326A true CN106295326A (zh) | 2017-01-04 |
CN106295326B CN106295326B (zh) | 2020-02-07 |
Family
ID=57669175
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610662988.7A Active CN106295326B (zh) | 2016-08-12 | 2016-08-12 | 一种用于获取显卡内容的内联hook方法和*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106295326B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108021357A (zh) * | 2017-11-20 | 2018-05-11 | 北京奇虎科技有限公司 | 程序调用的优化方法及装置 |
CN109344028A (zh) * | 2018-09-13 | 2019-02-15 | 西安交通大学 | 一种免超级用户权限的进程行为监控装置与方法 |
WO2019136861A1 (zh) * | 2018-01-09 | 2019-07-18 | 武汉斗鱼网络科技有限公司 | 一种基于高级程序设计语言实现钩子函数的方法及装置 |
CN111913742A (zh) * | 2018-07-03 | 2020-11-10 | 武汉斗鱼网络科技有限公司 | 一种程序处理方法及相关设备 |
CN113918935A (zh) * | 2021-12-15 | 2022-01-11 | 飞天诚信科技股份有限公司 | 一种函数被hook时的处理方法及装置 |
CN113975816A (zh) * | 2021-12-24 | 2022-01-28 | 北京蔚领时代科技有限公司 | 一种基于hook的通过DirectX接口使用显卡的显卡分配方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103823683A (zh) * | 2014-02-27 | 2014-05-28 | 北京六间房科技有限公司 | 一种视频录制装置及方法 |
CN105808251A (zh) * | 2016-03-03 | 2016-07-27 | 武汉斗鱼网络科技有限公司 | 一种基于虚函数表劫持绕过安全检测的方法与*** |
CN105808256A (zh) * | 2016-03-08 | 2016-07-27 | 武汉斗鱼网络科技有限公司 | 一种构造合法堆栈返回值绕过函数调用检测的方法与*** |
-
2016
- 2016-08-12 CN CN201610662988.7A patent/CN106295326B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103823683A (zh) * | 2014-02-27 | 2014-05-28 | 北京六间房科技有限公司 | 一种视频录制装置及方法 |
CN105808251A (zh) * | 2016-03-03 | 2016-07-27 | 武汉斗鱼网络科技有限公司 | 一种基于虚函数表劫持绕过安全检测的方法与*** |
CN105808256A (zh) * | 2016-03-08 | 2016-07-27 | 武汉斗鱼网络科技有限公司 | 一种构造合法堆栈返回值绕过函数调用检测的方法与*** |
Non-Patent Citations (1)
Title |
---|
贺新征: "《中国优秀硕士学位论文全文数据库 信息科技辑》", 31 July 2008 * |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108021357A (zh) * | 2017-11-20 | 2018-05-11 | 北京奇虎科技有限公司 | 程序调用的优化方法及装置 |
WO2019136861A1 (zh) * | 2018-01-09 | 2019-07-18 | 武汉斗鱼网络科技有限公司 | 一种基于高级程序设计语言实现钩子函数的方法及装置 |
CN111913742A (zh) * | 2018-07-03 | 2020-11-10 | 武汉斗鱼网络科技有限公司 | 一种程序处理方法及相关设备 |
CN109344028A (zh) * | 2018-09-13 | 2019-02-15 | 西安交通大学 | 一种免超级用户权限的进程行为监控装置与方法 |
CN109344028B (zh) * | 2018-09-13 | 2020-09-15 | 西安交通大学 | 一种免超级用户权限的进程行为监控装置与方法 |
CN113918935A (zh) * | 2021-12-15 | 2022-01-11 | 飞天诚信科技股份有限公司 | 一种函数被hook时的处理方法及装置 |
CN113918935B (zh) * | 2021-12-15 | 2022-04-01 | 飞天诚信科技股份有限公司 | 一种函数被hook时的处理方法及装置 |
CN113975816A (zh) * | 2021-12-24 | 2022-01-28 | 北京蔚领时代科技有限公司 | 一种基于hook的通过DirectX接口使用显卡的显卡分配方法 |
Also Published As
Publication number | Publication date |
---|---|
CN106295326B (zh) | 2020-02-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106295326A (zh) | 一种用于获取显卡内容的内联hook方法和*** | |
CN109951547B (zh) | 事务请求并行处理方法、装置、设备和介质 | |
CN102164050B (zh) | 日志解析方法及日志解析节点设备 | |
CN106302442B (zh) | 一种基于Java语言的网络通讯数据包解析方法 | |
CN112988400B (zh) | 显存优化方法、装置、电子设备以及可读存储介质 | |
CN110457123A (zh) | 一种区块处理任务的控制方法和装置 | |
CN110413386A (zh) | 多进程处理方法、装置、终端设备及计算机可读存储介质 | |
CN110149382A (zh) | 数据同步的方法、***、主服务器、同步客户端及介质 | |
CN105204789B (zh) | 一种api调试日志打印方法及装置 | |
WO2006053068A2 (en) | Method and system of retrieving avatar data unique to a user | |
CN103617066A (zh) | 一种工作流引擎及其实现方法 | |
CN106021445A (zh) | 一种加载缓存数据的方法及装置 | |
CN108021357B (zh) | 程序调用的优化方法及装置 | |
CN110968437A (zh) | 一种基于Java智能合约的单个合约并行执行的方法、装置、设备及介质 | |
US20020199171A1 (en) | Generic Java rule engine framework | |
CN103729384A (zh) | 信息过滤方法、***与装置 | |
CN104639650A (zh) | 一种细粒度分布式接口访问控制方法及装置 | |
WO2021190179A1 (zh) | 一种同步处理方法和相关装置 | |
CN108255585A (zh) | Sdk异常控制及应用程序运行方法、装置及其设备 | |
CN109358908A (zh) | 一种获取内存条的spd信息的方法、装置及存储介质 | |
CN101673217B (zh) | 一种实现远端程序调用的方法和*** | |
CN114328217A (zh) | 应用的测试方法、装置、设备、介质及计算机程序产品 | |
CN110659905A (zh) | 交易验证方法、装置、终端设备以及存储介质 | |
CN105404635A (zh) | 字符串匹配的方法、设备和异构计算*** | |
CN110262828A (zh) | ***业务模块配置方法、***、可读存储介质和设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |