CN113641361B - 一种基于Clang的代码隐藏方法及装置 - Google Patents
一种基于Clang的代码隐藏方法及装置 Download PDFInfo
- Publication number
- CN113641361B CN113641361B CN202110717183.9A CN202110717183A CN113641361B CN 113641361 B CN113641361 B CN 113641361B CN 202110717183 A CN202110717183 A CN 202110717183A CN 113641361 B CN113641361 B CN 113641361B
- Authority
- CN
- China
- Prior art keywords
- function
- clang
- code
- file
- inline
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 65
- 230000006870 function Effects 0.000 claims abstract description 113
- 238000012216 screening Methods 0.000 claims abstract description 14
- 230000003068 static effect Effects 0.000 claims abstract description 10
- 238000006243 chemical reaction Methods 0.000 claims abstract description 5
- 238000012545 processing Methods 0.000 claims description 8
- 238000004590 computer program Methods 0.000 claims description 3
- 230000008569 process Effects 0.000 description 7
- 230000009471 action Effects 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 2
- 230000004075 alteration Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000013024 troubleshooting Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于Clang的代码隐藏方法及装置,具体包括以下主要步骤:步骤一、函数转换;步骤二、分析得到语法树;步骤三、函数筛选;步骤四、添加编译属性和函数关键字;步骤五、最终编译,本发明涉及软件程序代码保护技术领域。该基于Clang的代码隐藏方法及装置,利用Clang对代码的语法书进行自动化分析,利用Clang重写将Objective‑C方法改写为C方法,用Clang自动化为函数添加强制内联属性及静态函数关键字,最后使用编译器对最终处理完的源代码文件进行编译,得到隐藏了Objective‑C语言的方法和C语言的函数的可执行文件,从而避免了黑客通过符号对可执行文件的篡改。自动化处理,几乎不需要额外的人工投入,提高效率,降低成本,提高效率。
Description
技术领域
本发明涉及软件程序代码保护技术领域,具体为一种基于Clang的代码隐藏方法及装置。
背景技术
随着移动开发的越来越普遍,程序暴露出来的安全问题越来越多,源代码中包含很多Objective-C语言方法和C语言函数,这些方法和函数在源代码经过编译后会符号,并保存在编译生成的可执行文件中,黑客可以通过逆向工程,获得这些符号,并根据符号对原来可执行文件进行篡改。
针对上面的痛点,目前的一般做法是通过人工先将Objective-C核心函数或方法修改成C函数后,再手动将源码中所有重要的C函数后添加内联属性标记,从而让编译器再编译源代码的时候不生成相关C函数的符号,最终使黑客无法通过逆向工程从可执行文件中获取到符号,从无法对可执行文件进行篡改,
基于对上述资料的检索,可以看出,常规的隐藏方法过程繁琐,需要人工投入大量时间,非常低效,为此,特提出一种基于Clang的代码隐藏方法及装置,过程自动化处理,基本不需要人工投入,降低成本,提高效率。
发明内容
(一)解决的技术问题
针对现有技术的不足,本发明提供了一种基于Clang的代码隐藏方法及装置,解决了常规的隐藏方法过程繁琐,需要人工投入大量时间,非常低效的问题。
(二)技术方案
为实现以上目的,本发明通过以下技术方案予以实现:一种基于Clang的代码隐藏方法,具体包括以下步骤:
步骤一、函数转换:获取源代码中的待处理的代码文件,利用Clang将所有代码文件中的Objective-C方法转化为C函数,得到一份没有自定义Objective-C方法的临时源代码A,同时记录下由自定义Objective-C转化来的C函数名称到待处理列表中;
步骤二、分析得到语法树:利用Clang工具对新的源代码A进行分析,得到抽象语法树,根据预设标记遍历抽象语法树,得到所有自定义的C函数声明和定义,根据是否在文件中有引用实例来判断是自定义的C函数,否则不继续进行下面的处理,并将这个自定义C函数的函数名称记录到步骤一中的待处理列表中;
步骤三、函数筛选:利用Clang对步骤二中待处理列表中的函数进行遍历筛选,筛选的条件是根据语法书中函数声明中是否有强制内联always_inline属性,如果有,则从列表中删除,通过上述的操作,待处理列表中获取到的都是没有声明强制内联的自定义C函数;
步骤四、添加编译属性和函数关键字:利用Clang给步骤三中最终获得的没有声明了内联自定义C函数的声明部分添加上编译器强制内联属性和静态函数关键字,将处理后的函数的声明和定义移到一个新的文件中,供原来所在的文件引用;
步骤五、最终编译:利用修改后的抽象语法树获得生成处理后的源代码文件,使用LLVM对最终的源码进行编译,获得的可执行文件中的Objective-C方法和C函数的符号即被隐藏,从而防止黑客通过符号对可执行文件的篡改。
优选的,所述步骤一中通过遍历待处理的源代码,获取源代码中的每一个代码文件。
优选的,所述步骤一中利用Clang工具中的Rewirte-ObjC功能,把每一个代码文件中的Objective-C代码文件中的自定义Objective-C方法转化为C函数,得到一份没有自定义Objective-C临时的源代码A。
优选的,所述步骤二中遍历临时的源代码A后,使用Clang对每一个代码文件进行编译,得到对应文件的抽象语法树。
优选的,所述步骤二中的预设标记形式为利用Clang工具遍历语法树中的所有声明,获得每一个语法树中声明的游标Cursor,根据游标Cursor的类型,匹配出类型为C函数声明的声明。
优选的,所述步骤四中使用Clang中添加属性的接口对步骤三中最终获得的没有声明了强制内联属性的自定义C函数的声明部分添加强制内联always_inline属性以及静态函数关键字。
优选的,所述步骤四中将处理后的函数的声明和定义移到一个新的文件中时,删除原来文件中的函数声明和定义,并将新创建的独立文件提供给原来引用了这些函数的代码文件中引用。
本发明还公开了一种基于Clang的代码隐藏装置,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述程序数据在被处理器执行时,用以实现上述的代码隐藏方法。
(三)有益效果
本发明提供了一种基于Clang的代码隐藏方法及装置。具备以下有益效果:
该基于Clang的代码隐藏方法及装置,通过利用Clang对代码的语法书进行自动化分析,利用Clang重写将Objective-C方法改写为C方法,用Clang自动化为函数添加强制内联属性及静态函数关键字,最后使用编译器对最终处理完的源代码文件进行编译,得到隐藏了Objective-C语言的方法和C语言的函数的可执行文件,从而避免了黑客通过符号对可执行文件的篡改。整个过程可自动化处理,几乎不需要额外的人工投入,提高效率,降低成本,提高效率。此外,最终输出处理后的源代码文件便于排查和分析问题。
附图说明
图1为本发明的流程示意图;
图2为本发明的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1-2,本发明实施例提供以下两种技术方案:
实施例一、
一种基于Clang的代码隐藏方法,具体包括以下步骤:
步骤一、函数转换:获取源代码中的待处理的代码文件,利用Clang将所有代码文件中的Objective-C方法转化为C函数,得到一份没有自定义Objective-C方法的临时的源代码A,同时记录下由自定义Objective-C方法转化来的C函数名称到待处理列表中;
步骤二、分析得到语法树:利用Clang工具对新的源代码A进行分析,得到抽象语法树,根据预设标记遍历抽象语法树,得到所有自定义的C函数声明和定义,根据是否在文件中有引用实例来判断是自定义的C函数,否则不继续进行下面的处理,并将这个自定义C函数的函数名称记录到步骤一种的待处理列表中;
步骤三、函数筛选:利用Clang对步骤二中待处理列表中的函数进行遍历筛选,筛选的条件是根据语法书中函数声明中是否有强制内联always_inline属性,如果有,则从列表中删除,通过上述的操作,待处理列表中获取到的都是没有声明强制内联的自定义C函数;
步骤四、添加编译属性和函数关键字:利用Clang给步骤三中最终获得的没有声明了内联自定义C函数的声明部分添加上编译器强制内联属性和静态函数关键字,将处理后的函数的声明和定义移到一个新的文件中,供原来所在的文件引用;
步骤五、最终编译:利用修改后的抽象语法树获得生成处理后的源代码文件,使用LLVM对最终的源码进行编译,获得的可执行文件中的Objective-C方法和C函数的符号即被隐藏,从而防止黑客通过符号对可执行文件的篡改。
实施例二、
一种基于Clang的代码隐藏方法,具体包括以下步骤:
步骤一、函数转换:遍历待处理的源代码,获取源代码中的每一个代码文件,利用Clang工具中的Rewirte-ObjC功能,把每一个代码文件中的Objective-C方法的代码文件中的自定义Objective-C方法转化为C函数,得到一份没有自定义Objective-C方法临时的源代码A,同时记录下由自定义Objective-C转化来的C函数名称到待处理列表中;
步骤二、分析得到语法树:利用Clang工具对新的源代码A进行分析,使用Clang对每一个代码文件进行编译,得到对应文件的抽象语法树,利用Clang工具遍历语法树中的所有声明,获得每一个语法树中声明的游标Cursor,根据游标Cursor的类型,匹配出类型为C函数声明的声明,根据是否在文件中有引用实例来判断是自定义的C函数,否则不继续进行下面的处理,并将这个自定义C函数的函数名称记录到步骤一种的待处理列表中;
步骤三、函数筛选:利用Clang对步骤二中待处理列表中的函数进行遍历筛选,筛选的条件是根据语法书中函数声明中是否有强制内联always_inline属性,如果有,则从列表中删除,通过上述的操作,待处理列表中获取到的都是没有声明强制内联的自定义C函数;
步骤四、添加编译属性和函数关键字:使用Clang中添加属性的接口对步骤三中最终获得的没有声明了内联自定义C函数的声明部分添加强制内联always_inline属性以及静态函数关键字,将处理后的函数的声明和定义移到一个新的文件中,删除原来文件中的函数声明和定义,并将新创建的独立文件提供给原来引用了这些函数的代码文件中引用,从而使编译器在编译链接的时候,让引用了这些函数的代码文件函能链接到这些函数;
步骤五、最终编译:利用修改后的抽象语法树获得生成处理后的源代码文件,使用LLVM对最终的源码进行编译,获得的可执行文件中的Objective-C方法和C函数的符号即被隐藏,从而防止黑客通过符号对可执行文件的篡改。
上述的一种基于Clang的代码隐藏装置,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述程序数据在被处理器执行时,用以实现上述的代码隐藏方法。
其中,Low Level Virtual Machine(LLVM)是一个开源的编译器架构。其中,Clang工具是LLVM的一个编译器前端,它目前支持C,C++,Objective-C以及Objective-C++等编程语言。Clang对源程序进行词法分析和语义分析,并将分析结果转换为抽象语法树,最后使用LLVM作为编译后端代码的生成器。
本发明的流程主要可以划分为:获取源代码中的待处理的代码文件、利用Clang将所有代码文件中的Objective-C方法转化为C函数、利用Clang工具对新的源代码进行分析得到语法树、根据预设标记遍历抽象语法树、得到所有自定义的C函数声明和定义、利用Clang给函数的声明部分添加上编译器强制内联属性和静态函数标记、将处理后的函数的生命和定义移到一个新的文件中供原来所在的文件引用和利用修改的后的抽象语法树获得生成处理后的源代码文件。
综上所述,本发明通过利用Clang将待处理的源代码中的Objective-C方法转化为C函数得到新的源代码;利用Clang工具对新的源代码进行分析,得到语法树;对语法树进行遍历,筛选出源代码中没有强制内联的自定义C函数的引用列表;再对所有自定义C函数的声明部分添加上编译器强制内联属性和静态函数关键字;并将这些函数的声明和定义部分放到同一个头文件里,提供给原来的引用这些方法和函数的文件使用,得到最终的源代码文件;最后使用编译器对最终的源代码文件进行编译,得到隐藏了Objective-C语言的方法和C语言的函数的可执行文件,从而避免了黑客通过符号对可执行文件的篡改。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下。由语句“包括一个......限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素”。
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。
Claims (8)
1.一种基于Clang的代码隐藏方法,其特征在于:具体包括以下步骤:
步骤一、函数转换:获取源代码中的待处理的代码文件,利用Clang将所有代码文件中的Objective-C方法转化为C函数,得到一份没有自定义Objective-C方法的临时源代码A,同时记录下由自定义Objective-C方法转化来的C函数名称到待处理列表中;
步骤二、分析得到语法树:利用Clang工具对新的源代码A进行分析,得到抽象语法树,根据预设标记遍历抽象语法树,得到所有自定义的C函数声明和定义,根据是否在文件中有引用实例来判断是自定义的C函数,否则不继续进行下面的处理,并将这个自定义C函数的函数名称记录到步骤一中的待处理列表中;
步骤三、函数筛选:利用Clang对步骤二中待处理列表中的函数进行遍历筛选,筛选的条件是根据语法树中函数声明中是否有强制内联always_inline属性,如果有,则从列表中删除,待处理列表中获取到的都是没有声明强制内联的自定义C函数;
步骤四、添加编译属性和函数关键字:利用Clang给步骤三中最终获得的没有声明了内联自定义C函数的声明部分添加上编译器强制内联属性和静态函数关键字,将处理后的函数的声明和定义移到一个新的文件中,供原来所在的文件引用;
步骤五、最终编译:利用修改后的抽象语法树获得生成处理后的源代码文件,使用LLVM对最终的源码进行编译,获得的可执行文件中的Objective-C方法和C函数的符号即被隐藏,从而防止黑客通过符号对可执行文件的篡改。
2.根据权利要求1所述的一种基于Clang的代码隐藏方法,其特征在于:所述步骤一中通过遍历待处理的源代码,获取源代码中的每一个代码文件。
3.根据权利要求1所述的一种基于Clang的代码隐藏方法,其特征在于:所述步骤一中利用Clang工具中的Rewrite-ObjC功能,把每一个代码文件中的Objective-C代码文件中的自定义Objective-C方法转化为C函数,得到一份没有自定义Objective-C临时的源代码A。
4.根据权利要求1所述的一种基于Clang的代码隐藏方法,其特征在于:所述步骤二中遍历临时的源代码A后,使用Clang对每一个代码文件进行编译,得到对应文件的抽象语法树。
5.根据权利要求1所述的一种基于Clang的代码隐藏方法,其特征在于:所述步骤二中的预设标记形式为利用Clang工具遍历语法树中的所有声明,获得每一个语法树中声明的游标Cursor,根据游标Cursor的类型,匹配出类型为C函数声明的声明。
6.根据权利要求1所述的一种基于Clang的代码隐藏方法,其特征在于:所述步骤四中使用Clang中添加属性的接口对步骤三中最终获得的没有声明了强制内联属性的自定义C函数的声明部分添加强制内联always_inline属性以及静态函数关键字。
7.根据权利要求1所述的一种基于Clang的代码隐藏方法,其特征在于:所述步骤四中将处理后的函数的声明和定义移到一个新的文件中时,删除原来文件中的函数声明和定义,并将新创建的独立文件提供给原来引用了这些函数的代码文件中引用。
8.一种基于Clang的代码隐藏装置,其特征在于:包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序在被处理器执行时,用以实现如权利要求1-7任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110717183.9A CN113641361B (zh) | 2021-06-28 | 2021-06-28 | 一种基于Clang的代码隐藏方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110717183.9A CN113641361B (zh) | 2021-06-28 | 2021-06-28 | 一种基于Clang的代码隐藏方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113641361A CN113641361A (zh) | 2021-11-12 |
CN113641361B true CN113641361B (zh) | 2024-01-26 |
Family
ID=78416368
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110717183.9A Active CN113641361B (zh) | 2021-06-28 | 2021-06-28 | 一种基于Clang的代码隐藏方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113641361B (zh) |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110222512A (zh) * | 2019-05-21 | 2019-09-10 | 华中科技大学 | 一种基于中间语言的软件漏洞智能检测与定位方法与系统 |
CN110471666A (zh) * | 2019-07-18 | 2019-11-19 | 五八有限公司 | 代码自动转换方法和装置、代码转换器及介质 |
CN110569628A (zh) * | 2019-09-09 | 2019-12-13 | 北京智游网安科技有限公司 | 一种代码的混淆方法以及装置、计算机设备、存储介质 |
CN110598379A (zh) * | 2019-09-23 | 2019-12-20 | 北京智游网安科技有限公司 | 一种实现字符串混淆的方法、系统、设备及存储介质 |
CN110609693A (zh) * | 2019-08-15 | 2019-12-24 | 平安国际智慧城市科技股份有限公司 | 基于数据标准化的代码更新方法、装置及终端设备 |
CN110673852A (zh) * | 2019-09-20 | 2020-01-10 | 北京智游网安科技有限公司 | 一种基于编译器前端实现控制流平坦的方法、系统及设备 |
CN110825384A (zh) * | 2019-10-28 | 2020-02-21 | 国电南瑞科技股份有限公司 | 一种基于llvm的st语言编译方法及编译系统和编译器 |
US10656940B1 (en) * | 2019-02-04 | 2020-05-19 | Architecture Technology Corporation | Systems, devices, and methods for source code generation from binary files |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA3028506A1 (en) * | 2018-12-24 | 2020-06-24 | Fornux Inc. | Source to source compiler, compilation method, and computer-readable medium for predictable memory management |
-
2021
- 2021-06-28 CN CN202110717183.9A patent/CN113641361B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10656940B1 (en) * | 2019-02-04 | 2020-05-19 | Architecture Technology Corporation | Systems, devices, and methods for source code generation from binary files |
CN110222512A (zh) * | 2019-05-21 | 2019-09-10 | 华中科技大学 | 一种基于中间语言的软件漏洞智能检测与定位方法与系统 |
CN110471666A (zh) * | 2019-07-18 | 2019-11-19 | 五八有限公司 | 代码自动转换方法和装置、代码转换器及介质 |
CN110609693A (zh) * | 2019-08-15 | 2019-12-24 | 平安国际智慧城市科技股份有限公司 | 基于数据标准化的代码更新方法、装置及终端设备 |
CN110569628A (zh) * | 2019-09-09 | 2019-12-13 | 北京智游网安科技有限公司 | 一种代码的混淆方法以及装置、计算机设备、存储介质 |
CN110673852A (zh) * | 2019-09-20 | 2020-01-10 | 北京智游网安科技有限公司 | 一种基于编译器前端实现控制流平坦的方法、系统及设备 |
CN110598379A (zh) * | 2019-09-23 | 2019-12-20 | 北京智游网安科技有限公司 | 一种实现字符串混淆的方法、系统、设备及存储介质 |
CN110825384A (zh) * | 2019-10-28 | 2020-02-21 | 国电南瑞科技股份有限公司 | 一种基于llvm的st语言编译方法及编译系统和编译器 |
Non-Patent Citations (2)
Title |
---|
基于LLVM的函数内联优化技术研究;安龙飞;《中国优秀硕士学位论文全文数据库 信息科技辑》(第07期);I138-1092 * |
基于语义学习的二进制漏洞代码克隆检测;杨鑫;《中国优秀硕士学位论文全文数据库 信息科技辑》(第02期);I138-460 * |
Also Published As
Publication number | Publication date |
---|---|
CN113641361A (zh) | 2021-11-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10698682B1 (en) | Computerized software development environment with a software database containing atomic expressions | |
US9122540B2 (en) | Transformation of computer programs and eliminating errors | |
JP4619698B2 (ja) | コードセグメント作成方法及びそのシステム | |
CN109684838B (zh) | 一种针对以太坊智能合约的静态代码审计系统及方法 | |
US11579856B2 (en) | Multi-chip compatible compiling method and device | |
CN106843840B (zh) | 一种基于相似度分析的源代码版本演化注释复用方法 | |
US6934940B2 (en) | Source code transformation-temporary object reduction | |
Al-Omari et al. | Detecting clones across microsoft. net programming languages | |
Bulychev et al. | Duplicate code detection using anti-unification | |
CN109491658A (zh) | 计算机可执行代码数据的生成方法及装置 | |
US20180081655A1 (en) | Metadata-Driven Binding of Converted Source Code to Original Source Code | |
Dean et al. | Using design recovery techniques to transform legacy systems | |
Park et al. | JISET: javascript ir-based semantics extraction toolchain | |
CN112379917A (zh) | 浏览器兼容性提升方法、装置、设备及存储介质 | |
CN115309451A (zh) | 代码克隆检测方法、装置、设备、存储介质及程序产品 | |
CN116450616A (zh) | 一种基于解析树的通用异构关系型数据库sql迁移方法 | |
CN113641361B (zh) | 一种基于Clang的代码隐藏方法及装置 | |
CN110633084B (zh) | 基于单个样例的代码转换推导方法和装置 | |
US8914782B2 (en) | Optimization of declarative queries | |
CN111796832B (zh) | 热补丁文件生成方法、装置、设备及存储介质 | |
CN113946339A (zh) | 应用工程文件的处理方法、装置、电子设备及可读介质 | |
CN114816356A (zh) | 基于接口文档生成http请求代码的系统及方法 | |
CN110018816B (zh) | 一种基于c/c++编译系统的虚拟机控制系统及其控制方法 | |
Yang et al. | A function level Java code clone detection method | |
Szőke | Automating the refactoring process |
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 |