CN108469997A - 一种基于动态特征的自定义堆管理函数的自动识别方法 - Google Patents
一种基于动态特征的自定义堆管理函数的自动识别方法 Download PDFInfo
- Publication number
- CN108469997A CN108469997A CN201711248935.1A CN201711248935A CN108469997A CN 108469997 A CN108469997 A CN 108469997A CN 201711248935 A CN201711248935 A CN 201711248935A CN 108469997 A CN108469997 A CN 108469997A
- Authority
- CN
- China
- Prior art keywords
- self
- manager function
- heap manager
- behavioral characteristics
- heap
- 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
- 238000000034 method Methods 0.000 title claims abstract description 47
- 230000003542 behavioural effect Effects 0.000 title claims abstract description 29
- 230000006870 function Effects 0.000 claims abstract description 110
- 230000008569 process Effects 0.000 claims abstract description 12
- 238000011084 recovery Methods 0.000 claims description 4
- 238000004458 analytical method Methods 0.000 abstract description 22
- 238000012216 screening Methods 0.000 description 4
- 230000007812 deficiency Effects 0.000 description 3
- 238000012545 processing Methods 0.000 description 3
- 229910002056 binary alloy Inorganic materials 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 239000012491 analyte Substances 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 235000013399 edible fruits Nutrition 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000007717 exclusion Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000008092 positive effect Effects 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3612—Software analysis for verifying properties of programs by runtime analysis
-
- 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/34—Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes
- G06F9/355—Indexed addressing
-
- 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5022—Mechanisms to release resources
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于动态特征的自定义堆管理函数的自动识别方法,主要包括:1)基于动态执行二进制指令记录进行离线分析,通过call‑ret匹配恢复函数边界信息;2)依次根据堆管理函数的返回值通常是堆指针、处理流程具有相似性、使用情况具有特点的动态特征,对候选函数进行筛选;3)对筛选出的自定义堆管理函数进行去重统计,实现自定义堆管理函数的自动识别。本发明实现了基于离线动态执行记录分析自动识别自定义的堆管理函数,识别准确性高、分析效率高。
Description
技术领域
本发明属于软件逆向技术领域,具体涉及一种基于动态特征的自定义堆管理函数的自动识别方法。
背景技术
基于性能和安全性等考虑,越来越多的程序采用自定义的堆管理函数来分配和管理内存,如Jemalloc、TCmalloc、MMgc等。这些自定义的堆管理函数给程序分析、特别是二进制程序分析带来了新的挑战。例如分析程序存在的堆溢出漏洞(heap overflow)或释放后重用漏洞(use after free)的时候,需要通过堆分配操作(标准系统接口,如malloc等)来确定分配的堆空间大小和时刻,根据堆释放操作(标准系统接口,如free等)来确定堆空间的生存周期。如果存在自定义的堆管理操作,程序会通过标准系统接口向系统申请一大段地址自己管理,堆状态的更新是根据自定义的堆管理函数接口确定的,不会调用标准系统接口,因此在二进制记录中无法发现这些操作,导致无法准确分析程序的运行状态和漏洞情况。
目前对自定义的堆管理函数的识别主要依赖于人工分析。基于源代码,分析人员可以通过跟踪内存分配和释放过程的代码,分析是否调用了自定义堆管理函数库;基于二进制程序,分析人员可以通过IDA pro等分析工具,对程序进行静态分析,发现其中的自定义堆管理函数。然而这种分析是耗时耗力的,主要依赖于分析人员的经验。阿姆斯特丹自由大学的Herbert等人尝试采用动态执行和特征匹配的方法,实现对堆管理函数进行自动化的识别(WCRE’13)。他们实现了原型系统MemBrush,通过提取堆分配、释放和重分配等操作的行为特征,在动态执行程序的同时测试和检测各项特征,识别堆管理函数。格勒诺布尔阿尔卑斯大学的Laurent Mounier等人在USENIX CSET’17上进一步提出了如何评价自定义堆管理函数的识别效果。
尽管自定义的堆管理函数识别方法已经取得了一些的研究进展和良好的应用效果,然而现有的方法仍然存在以下的不足:
1)在线分析方法效率偏低,同时可能造成分析下的程序执行和正常执行过程不同,缺少基于动态分析记录的离线识别方法;
2)之前工作中选取的堆管理函数的动态特征不完整导致识别存在不准确,且有些特征不适用于离线分析过程。
发明内容
针对现有技术中存在的技术问题,本发明的目的在于提供一种基于动态特征的自定义堆管理函数的自动识别方法,通过动态执行目标程序得到程序执行的二进制指令记录,根据调用栈信息逆向恢复函数边界,根据动态特征信息挑选符合的函数,同时提取函数相关的参数、返回值等信息,实现对自定义堆管理函数的自动识别。
一种基于动态特征的自定义堆管理函数的自动识别方法,其步骤如下:
1)获取目标程序动态执行过程的二进制指令记录;
2)通过call-ret指令配对,恢复二进制指令记录中函数边界信息,得到候选函数;
3)根据自定义堆管理函数的动态特征对候选函数进行筛选;
4)将筛选出的自定义堆管理函数进行统计去重,实现自定义堆管理函数的自动识别。
进一步地,步骤1)中在动态分析环境中执行目标程序来获取目标程序动态执行过程的二进制指令记录。
进一步地,所述二进制指令记录包括指令的EIP、相关寄存器(如EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)信息、指令的机器码、记录编号ID。
进一步地,步骤2)中所述call-ret指令配对是根据程序通常会采用的call指令调用函数、通过ret指令跳出函数。因此call指令标识函数的开始、ret指令标志着函数结束,通过call-ret指令配对,可以恢复函数边界信息,后续分析基于识别出的候选函数的语义进行筛选。
进一步地,步骤2)还包括程序未使用call指令进入函数或ret指令跳出函数的特殊情况。通过分析ret指令之后执行的下一条指令,采用比较ESP的值和EIP指令距离的方法对恢复得到的函数边界进行修正。使call指令的ESP的值小于下一条指令的ESP的值,且ret指令之后执行的下一条指令EIP等于call指令加call指令长度。
进一步地,步骤3)中所述动态特征包括返回值特征、处理流程特征和使用情况特征。
进一步地,步骤3)中根据返回值特征进行筛选,包括根据获得堆空间的系统接口的调用参数和返回值更新堆状态,筛选出返回值是指向堆空间的指针的函数作为候选函数。
进一步地,步骤3)中根据处理流程特征筛选的依据是自定义堆管理函数具有类似的内部处理流程的特征。比如函数根据申请空间的大小不同采用不同的流程(即存在判断申请大小的程序分支);当自定义堆空间不足时会向系统申请空间(即会调用系统接口);分配的堆空间会进行对齐操作(即存在对内存地址的对齐操作);在自定义的管理结构中维护堆状态,并保护该结构的读写一致(即采用互斥操作更新特定结构中的数据)。检测候选函数是否具有上述动态特征,筛选出包含的特征超过设定数量的函数作为下阶段的候选函数。
进一步地,步骤3)中根据使用情况进行筛选的依据是自定义堆管理函数在使用过程中存在特征。比如堆管理函数会被调用多次,且每次的返回地址应该不同;返回地址空间应该先写后读;自定义堆管理函数可能对返回地址空间进行初始化操作。检测候选函数是否具有上述动态特征,筛选出包含的特征超过设定数量的函数作为最终的候选函数。
进一步地,步骤4)中根据最终筛选出的自定义堆管理函数的入口地址、出口地址进行统计,并去除存在互相调用关系的候选函数中的子函数、保留外层函数。
本发明的优点和积极效果如下:
1、本发明实现了基于离线动态执行记录分析自动识别自定义的堆管理函数,尽可能的减少分析过程对执行过程的影响和分析的不确定性,提高了分析的效率。
2、本发明提出了更多、更具有操作性的自定义堆操作函数的动态特征,借助这些特征可以提高识别的准确性。
附图说明
图1为基于动态特征的自定义堆管理函数的自动识别方法的流程图。
图2为本发明获得的二进制执行指令记录示意图。
具体实施方式
下面结合附图详细说明本发明的技术方案:
如图1所示,一种基于动态特征的自定义堆管理函数的自动识别方法,包括步骤:
1、在动态分析环境中获得目标程序的二进制执行指令记录
本发明的分析对象是目标程序的动态执行记录,然而并不要求如何获得。
以基于QEMU的动态分析系统为例,在QEMU虚拟机中启动目标程序,打开测试样本并进行相关操作(如播放、编辑等),在程序动态执行的同时记录运行的指令,包括记录指令的上下文信息(如指令的EIP、相关寄存器(如EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)的内容、指令的汇编表示、指令的操作数、记录编号ID等),如图2所示。
2、通过call-ret指令配对恢复函数边界信息
分析二进制指令记录。通过call指令和ret指令恢复函数边界信息,维护一个影子栈记录函数调用情况。遇到call指令入栈,记录call指令的ID、EIP、ESP信息;遇到ret指令出栈,记录ret指令的ID、EIP、ESP信息。对call-ret指令进行匹配的过程中,考虑到实际程序中call指令和ret指令存在不完全匹配出现的情况(如jmp进入被调用函数),采用比较ESP的值和EIP指令距离的方法对识别的函数边界进行修正:分析ret指令的下一条指令,判断Next ESP是否大于等于对应call指令的ESP,Next EIP是否满足对应call指令的EIP加call指令长度,对函数调用栈进行修正。
3、根据堆管理函数的返回值进行筛选
在恢复函数边界信息的同时,基于堆空间的获得最初都是来自于系统接口(如malloc、free等),根据标准系统接口的调用参数和返回值更新堆状态表。对第2步中恢复得到的函数的返回值进行检查,筛选出返回值是堆状态表中的地址(即返回值为堆指针)的候选函数。
4、根据堆管理函数的处理过程进行筛选
再次对二进制指令记录进行分析,基于自定义堆管理函数具有类似的内部处理流程的特征,根据自定义的堆管理函数处理过程的特征进行筛选,比如函数根据申请空间的大小不同采用不同的流程(即存在判断申请大小的程序分支);当自定义堆空间不足时会向系统申请空间(即会调用系统接口);分配的堆空间会进行对齐操作(即存在对内存地址的对齐操作);在自定义的管理结构中维护堆状态,并保护该结构的读写一致(即采用互斥操作更新特定结构中的数据)。具体方法如,检查候选函数中是否存在和固定内存大小的“比较运算”;是否存在对内存地址的“与运算”;是否存在对标准系统接口的调用;是否存在通过互斥操作访问特定数据结构等,本方案中筛选包含3个特征以上的函数作为下阶段的候选函数。
5、根据堆管理函数的使用情况进行筛选
再次对二进制指令记录进行分析,基于自定义堆管理函数在使用过程中存在特征,根据自定义的堆管理函数的使用情况进行筛选。比如堆管理函数会被调用多次,且每次的返回地址应该不同;返回地址空间应该先写后读;自定义堆管理函数可能对返回地址空间进行初始化操作。具体方法如,统计候选函数的调用次数和返回值信息;跟踪函数返回值的使用是否符合先用作写地址;检查返回地址空间在写入之前是否被初始化等,本方案中筛选包含2个特征以上的函数作为最终筛选出的候选函数。
6、对最终筛选过的候选函数统计并去重
根据步骤3-5对候选函数进行筛选,统计筛选后的函数数量,根据函数入口地址、返回地址进行排序。考虑到有些候选函数可能存在互相调用的关系,分析其中是否存在互相包含的情况,去掉包含关系中的子函数,保留外层函数,最终实现自定义堆管理函数的自动识别。
本发明提出的基于动态特征的自定义堆管理函数的自动识别方法,对于本领域的技术人员而言,可以根据需要自己获取动态执行记录、添加更复杂的识别规则,从而达到提高分析效率和准确率的目的。
尽管为说明目的公开了本发明的具体实施例和附图,其目的在于帮助理解本发明的内容并据以实施,但是本领域的技术人员可以理解:在不脱离本发明及所附的权利要求的精神和范围内,各种替换、变化和修改都是可能的。因此,本发明不应局限于最佳实施例和附图所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。
Claims (10)
1.一种基于动态特征的自定义堆管理函数的自动识别方法,其步骤如下:
1)获取目标程序动态执行过程的二进制指令记录;
2)通过call-ret指令配对,恢复二进制指令记录中函数边界信息,得到候选函数;
3)根据自定义堆管理函数的动态特征对候选函数进行筛选;
4)将筛选出的自定义堆管理函数进行统计去重,实现自定义堆管理函数的自动识别。
2.如权利要求1所述的基于动态特征的自定义堆管理函数的自动识别方法,其特征在于,所述二进制指令记录包括指令的EIP、相关寄存器信息、指令的机器码、记录编号ID。
3.如权利要求2所述的基于动态特征的自定义堆管理函数的自动识别方法,其特征在于,所述寄存器包括EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP。
4.如权利要求3所述的基于动态特征的自定义堆管理函数的自动识别方法,其特征在于,步骤2)还包括分析ret指令之后执行的下一条指令,采用比较ESP的值和EIP指令距离的方法对恢复得到的函数边界进行修正。
5.如权利要求4所述的基于动态特征的自定义堆管理函数的自动识别方法,其特征在于,通过使call指令的ESP的值小于下一条指令的ESP的值,且ret指令之后执行的下一条指令EIP等于call指令加call指令长度对恢复得到的函数边界进行修正。
6.如权利要求1所述的基于动态特征的自定义堆管理函数的自动识别方法,其特征在于,步骤3)中所述动态特征包括返回值特征、处理流程特征和使用情况特征。
7.如权利要求6所述的基于动态特征的自定义堆管理函数的自动识别方法,其特征在于,步骤3)中根据返回值特征进行筛选,包括根据获得堆空间的系统接口的调用参数和返回值更新堆状态,筛选出返回值是指向堆空间的指针的函数作为候选函数。
8.如权利要求6所述的基于动态特征的自定义堆管理函数的自动识别方法,其特征在于,所述处理流程特征包括:函数根据申请空间的大小不同采用不同的流程;当自定义堆空间不足时向系统申请空间;分配的堆空间进行对齐操作;在自定义的管理结构中维护堆状态,并保护该结构的读写一致;步骤3)中筛选出包含的上述处理流程特征超过设定数量的函数作为候选函数。
9.如权利要求6所述的基于动态特征的自定义堆管理函数的自动识别方法,其特征在于,所述使用情况特征包括:堆管理函数被调用多次,且每次的返回地址不同;返回地址空间先写后读;自定义堆管理函数对返回地址空间进行初始化操作;步骤3)中筛选出包含的上述使用情况特征超过设定数量的函数作为候选函数。
10.如权利要求1所述的基于动态特征的自定义堆管理函数的自动识别方法,其特征在于,步骤4)中根据最终筛选出的自定义堆管理函数的入口地址、出口地址进行统计,并去除存在互相调用关系的候选函数中的子函数、保留外层函数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711248935.1A CN108469997B (zh) | 2017-12-01 | 2017-12-01 | 一种基于动态特征的自定义堆管理函数的自动识别方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711248935.1A CN108469997B (zh) | 2017-12-01 | 2017-12-01 | 一种基于动态特征的自定义堆管理函数的自动识别方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108469997A true CN108469997A (zh) | 2018-08-31 |
CN108469997B CN108469997B (zh) | 2021-10-26 |
Family
ID=63266944
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711248935.1A Active CN108469997B (zh) | 2017-12-01 | 2017-12-01 | 一种基于动态特征的自定义堆管理函数的自动识别方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108469997B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112783755A (zh) * | 2019-11-07 | 2021-05-11 | 上海蜚语信息科技有限公司 | 一种基于自然语言理解函数原型发现内存破坏漏洞的方法 |
CN117435440A (zh) * | 2023-12-20 | 2024-01-23 | 麒麟软件有限公司 | 一种程序堆空间的动态分析方法及系统 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040139272A1 (en) * | 2000-09-13 | 2004-07-15 | Gustavo Rodriguez-Rivera | Conservative garbage collectors that can be used with general memory allocators |
CN102521079A (zh) * | 2011-12-02 | 2012-06-27 | 华中科技大学 | 软件栈缓冲区溢出的容错方法 |
-
2017
- 2017-12-01 CN CN201711248935.1A patent/CN108469997B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040139272A1 (en) * | 2000-09-13 | 2004-07-15 | Gustavo Rodriguez-Rivera | Conservative garbage collectors that can be used with general memory allocators |
CN102521079A (zh) * | 2011-12-02 | 2012-06-27 | 华中科技大学 | 软件栈缓冲区溢出的容错方法 |
Non-Patent Citations (1)
Title |
---|
袁野: "基于内存管理的模式化软件关键行为跟踪技术", 《计算机工程与设计》 * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112783755A (zh) * | 2019-11-07 | 2021-05-11 | 上海蜚语信息科技有限公司 | 一种基于自然语言理解函数原型发现内存破坏漏洞的方法 |
CN112783755B (zh) * | 2019-11-07 | 2024-03-22 | 上海蜚语信息科技有限公司 | 一种基于自然语言理解函数原型发现内存破坏漏洞的方法 |
CN117435440A (zh) * | 2023-12-20 | 2024-01-23 | 麒麟软件有限公司 | 一种程序堆空间的动态分析方法及系统 |
CN117435440B (zh) * | 2023-12-20 | 2024-04-05 | 麒麟软件有限公司 | 一种程序堆空间的动态分析方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN108469997B (zh) | 2021-10-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111756575B (zh) | 存储服务器的性能分析方法及装置、电子设备 | |
CN108469984B (zh) | 一种基于虚拟机自省函数级虚拟机内核动态检测系统与方法 | |
US9965631B2 (en) | Apparatus and method for analyzing malicious code in multi-core environment using a program flow tracer | |
CN101645119A (zh) | 一种基于虚拟硬件环境的恶意代码自动分析方法及系统 | |
CN105718370A (zh) | 一种Android设备测试方法及测试装置 | |
CN106354630A (zh) | 一种基于动态符号执行的软件缺陷检测方法 | |
CN113268427B (zh) | 一种针对二进制程序的崩溃分析方法及系统 | |
CN111625833B (zh) | 一种高效的软件程序释放后重用漏洞判定方法和装置 | |
CN107368428A (zh) | 一种软件测试方法及软件测试系统 | |
US20240036841A1 (en) | Method and Apparatus for Compatibility Detection, Device and Non-transitory computer-readable storage medium | |
CN107526970A (zh) | 基于动态二进制平台检测运行时程序漏洞的方法 | |
CN108469997A (zh) | 一种基于动态特征的自定义堆管理函数的自动识别方法 | |
CN104715190A (zh) | 一种基于深度学习的程序执行路径的监控方法及系统 | |
CN111125697B (zh) | 基于缺陷摘要的智能合约缺陷可触发性检测方法及系统 | |
CN110704303B (zh) | 一种测试覆盖度信息的获取方法及装置 | |
CN108446235A (zh) | 结合路径标签数据变异的模糊测试关键数据定位方法 | |
CN111091863A (zh) | 一种存储设备故障检测方法及相关装置 | |
CN110737573B (zh) | 用户界面ui自动化测试的方法和装置 | |
CN114860586A (zh) | 一种基于动态插桩的二进制多执行体软件插桩方法 | |
CN110532776A (zh) | 基于运行时数据分析的Android恶意软件高效检测方法、系统及介质 | |
CN101937395B (zh) | 一种用于漏洞检测的检测对象程序特征提取方法 | |
CN104933105B (zh) | 数据库访问请求的分析方法和装置 | |
CN107506293A (zh) | 一种软件性能数据采集方法和装置 | |
CN107402883B (zh) | 一种数据测试处理方法和装置 | |
US10496524B2 (en) | Separating test coverage in software processes using shared memory |
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 |