CN109784008A - 一种用于移动代码的结构扁平方法和系统 - Google Patents
一种用于移动代码的结构扁平方法和系统 Download PDFInfo
- Publication number
- CN109784008A CN109784008A CN201711126681.6A CN201711126681A CN109784008A CN 109784008 A CN109784008 A CN 109784008A CN 201711126681 A CN201711126681 A CN 201711126681A CN 109784008 A CN109784008 A CN 109784008A
- Authority
- CN
- China
- Prior art keywords
- code
- basic block
- instruction
- flat structure
- moving
- 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.)
- Pending
Links
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供了一种用于移动代码的结构扁平方法,包括以下步骤:将函数内的所有第一基本块包含的指令进行分割,组成多个第二基本块;以及通过条件指令和跳转指令,将多个第二基本块重新排序。本发明提供用于移动代码的结构扁平方法,以函数为操作对象,以指令为粒度进行切割,组合成新的基本块;通过条件指令和跳转指令,打乱新的基本块的上下顺序并替换跳转。由此,可以将编译器的中间代码LLVM IR进行结构扁平变化,将原本的控制流平台化,随机化,可以达到膨胀代码增加逆向复杂度,对抗IDA Pro,控制流平坦随机化后上下文的代码顺序不是最终的执行顺序,增加人类阅读的难度。
Description
技术领域
本发明涉及移动终端应用安全技术领域,尤其涉及一种插件式的扫描配置处理方法和系统。
背景技术
近年来,随着智能手机的普及以及智能手机操作系统的发展,日常生活中手机成为了人们不可分离的一部分。而现今的手机已经不仅仅是一个通信的工具,通信已经成为了如今手机最基本的功能,娱乐功能以及生活工具已经成为了一部手机必不可少的功能。
但随着移动互联网的快速发展,应用的安全问题不断涌现出来,越来越多的应用遭到黑客的攻击被破解。在App保护解决方案领先供应商Arxan公布的年度移动App安全报告中显示,在排名前100位的付费苹果iOS应用当中,有87%的App已被黑客破解,安卓的更是不计其数,各种盗版软件遍布。于是越来越多的安卓应用开发者将核心代码由Java层转到Native层,但是有能力对苹果或者安卓应用进行代码保护的公司很少,一些开源加固方法只能对安卓Java代码进行加固,对苹果应用进行方法名混淆等,这些加固手段加固能力薄弱,无法抵御一些反编译软件和逆向人员的逆向分析。
对于现有的移动应用代码混淆技术,往往只做了简单的混淆,例如主流的移动终端系统苹果系统和安卓系统:
1.安卓系统许多应用往往只对Java代码做了混淆,但是Java代码混淆几乎没有效果,强大的反编译软件可以直接进行反编译;
2.部分安卓系统应用对Native层代码只做了简单的字符串加密等的数据混淆,没有做控制流混淆,代码结构依然清晰不变,在IDA Pro等软件中仍然可以轻松阅读,加固力度不大;
3.苹果系统应用大多数应用几乎没有代码保护,或者只对方法名做混淆,这种代码在IDA Pro等软件轻松可读。
4.部分开源的控制流混淆只做了简单的结构变化,但是还存在着代码顺序不变,结构混淆力度简单等缺点。
发明内容
针对现有处理机制存在的不足,本发明提供一种用于移动代码的结构扁平方法和系统。
一方面,本发明实施例提供一种用于移动代码的结构扁平方法,包括以下步骤:
将函数内的所有第一基本块包含的指令进行分割,组成多个第二基本块;以及
通过条件指令和跳转指令,将所述多个第二基本块重新排序。
在本发明提供的用于移动代码的结构扁平方法中,在将函数内的所有第一基本块包含的指令进行分割,组成多个第二基本块的所述步骤中,根据配置,以固定指令数为组将所述函数内的所有第一基本块的指令进行分割。
在本发明提供的用于移动代码的结构扁平方法中,通过条件指令和跳转指令,将所述多个第二基本块重新排序的所述步骤包括:
记录多个第二基本块的跳转执行顺序,为每个所述第二基本块随机分配一个Tag值;
构造While-Switch结构,将每个所述第二基本块放到一个随机顺序的Case语句内;
设置全局Flag值;
通过所述全局Flag值来控制多个Case语句的执行顺序。
在本发明提供的用于移动代码的结构扁平方法中,在记录多个第二基本块的跳转执行顺序,为每个所述第二基本块随机分配一个Tag值的所述步骤之后,还包括:
将所述多个第二基本块对应的多个Tag值随机排序。
在本发明提供的用于移动代码的结构扁平方法中,在通过所述全局Flag值来控制多个Case语句的执行顺序的所述步骤之后还包括:
在最后执行的第二基本块后插入返回指令,结束所述函数。
相应地,本发明还提供一种用于移动代码的结构扁平系统,包括:
分割模块,用于将函数内的所有第一基本块包含的指令进行分割,组成多个第二基本块;以及
扁平模块,用于通过条件指令和跳转指令,将所述多个第二基本块重新排序。
在本发明提供的用于移动代码的结构扁平系统中,所述分割模块用于根据配置,以固定指令数为组将所述函数内的所有第一基本块的指令进行分割。
在本发明提供的用于移动代码的结构扁平系统中,所述扁平模块包括:
记录单元,用于记录多个第二基本块的跳转执行顺序,为每个所述第二基本块随机分配一个Tag值;
构造单元,用于构造While-Switch结构,将每个所述第二基本块放到一个随机顺序的Case语句内;
设置单元,用于设置全局Flag值;
控制单元,用于通过所述全局Flag值来控制多个Case语句的执行顺序。
在本发明提供的用于移动代码的结构扁平系统中,所述扁平模块还包括:
排序单元,用于将所述多个第二基本块对应的多个Tag值随机排序。
在本发明提供的用于移动代码的结构扁平系统中,还包括:
结束单元,用于在最后执行的第二基本块后插入返回指令,结束所述函数。
实施本发明实施例,具有如下有益效果:本发明提供用于移动代码的结构扁平方法,以函数为操作对象,以指令为粒度进行切割,组合成新的基本块;通过条件指令和跳转指令,打乱新的基本块的上下顺序并替换跳转。由此,可以将编译器的中间代码LLVM IR进行结构扁平变化,将原本的控制流平台化,随机化,可以达到膨胀代码增加逆向复杂度,对抗IDA Pro,控制流平坦随机化后上下文的代码顺序不是最终的执行顺序,增加人类阅读的难度。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1所示是底层编译器中间语言的结构图;
图2所示为本发明实施例一提供的用于移动代码的结构扁平方法的流程图;
图3所示为本发明实施例二提供的用于移动代码的结构扁平方法的流程图;
图4所示是块拆分示意图;
图5所示为构造的新函数的结构图;
图6所示为本发明实施例三提供的用于移动代码的结构扁平系统的原理图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
基于底层编译器(LLVM)的Clang编译器,可支持C、C++、Objective-C等语言从源代码到二进制可执行文件的编译。如图1所示,LLVM中间语言(IR)由一个个块(Module)组成,一个Module里面有若干个函数(Function),Function由一系列基本块(Basic Block)组成,多条指令(Instruction)则构成了一个Basic Block,一个Basic Block最后一条指令必须是终止符指令。由图1可见,一个函数是按照基本块的顺序依次执行的。
图2所示为本发明实施例一提供的用于移动代码的结构扁平方法的流程图;如图2所示,本发明实施例提供的用于移动代码的结构扁平方法包括以下步骤:
步骤S110:将函数内的所有第一基本块包含的指令进行分割,组成多个第二基本块;以及
步骤S120:通过条件指令和跳转指令,将所述多个第二基本块重新排序。
在本实施例中,主要是以函数为操作对象,以指令为粒度进行切割,组合成新的基本块,并将新的基本块嵌套在类似Switch语句(在LLVM IR里通过条件指令和跳转指令实现)下面,打乱新的基本块的上下顺序并替换跳转。由此,对中间代码LLVM IR进行结构扁平变化。
实施例二
图3所示为本发明实施例一提供的用于移动代码的结构扁平方法的流程图;如图3所示,本发明实施例提供的用于移动代码的结构扁平方法包括以下步骤:
步骤S210:根据配置,以固定指令数为组将所述函数内的所有第一基本块的指令进行分割;
具体地,根据配置(例如,安全需要),将第一基本块进行划分,划分成更多的基本块,例如,如图4所示,原来有4个基本块,划分后变为n个基本块,由此可以膨胀代码增加逆向复杂度。其中,分割的最小粒度可以一条指令,新的基本块(即第二基本块)的终止符默认是跳转到下一个第二基本块。
步骤S220:记录多个第二基本块的跳转执行顺序,为每个所述第二基本块随机分配一个Tag值;
具体地,将原基本块分割为更多的新的基本块后,记录这些新的基本块的执行顺序,并为每个新的基本块分配一个Tag值,通过Tag值来表示该基本块的执行顺序。例如,为第一个第二基本块分配Tag值3,为第二个第二基本块分配Tag值5。这样,就形成了反应第二基本块执行顺序一个Tag值组[3,5,1,。。。]。
步骤S230:构造While-Switch结构,将每个所述第二基本块放到一个随机顺序的Case语句内;
步骤S240:设置全局Flag值;
步骤S250:通过所述全局Flag值来控制多个Case语句的执行顺序;
具体地,如图5所示,通过构造While-Switch结构,将分割后的每个新的基本块放到一个Case语句里面,通过执行Case语句来执行新的基本块中的内容。其中,如图5所示,Case顺序是打乱的随机顺序。进一步地,构造一个全局Flag值,在每个Case结尾通过给Flag值赋值每个第二基本块的Tag值来控制Case的执行顺序,由此可以保障代码的正常执行。
步骤S260:在最后执行的第二基本块后插入返回指令,结束所述函数。
具体地,在真正最后一个第二基本块后面插入原本的Ret返回指令,结束这个Function。
进一步地,在步骤S220之后,还包括将所述多个第二基本块对应的多个Tag值随机排序。通过打乱Tag值的排列顺序,可以进一步膨胀代码增加逆向复杂度。
本实施例提供的用于移动代码的结构扁平方法,以函数为操作对象,以指令为粒度进行切割,组合成新的基本块;通过条件指令和跳转指令,打乱新的基本块的上下顺序并替换跳转。由此,可以将编译器的中间代码LLVM IR进行结构扁平变化,将原本的控制流平台化,随机化,可以达到膨胀代码增加逆向复杂度,对抗IDA Pro,控制流平坦随机化后上下文的代码顺序不是最终的执行顺序,增加人类阅读的难度。
通过以上的方法实施例的描述,所属领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在二个存储介质中,包括若干指令用以使得二台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。丽前述的存储介质包括:只读存储器(ROM)、随机存取存储器(RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
实施例三
作为对上述各实施例的实现,本发明实施例还提供了一种用于移动代码的结构扁平系统:图6所示为本发明实施例三提供的用于移动代码的结构扁平系统的原理图,如图6所示,本发明提供的用于移动代码的结构扁平系统包括:
分割模块610,用于将函数内的所有第一基本块包含的指令进行分割,组成多个第二基本块;以及
扁平模块620,用于通过条件指令和跳转指令,将所述多个第二基本块重新排序。
进一步地,所述分割模块用于根据配置,以固定指令数为组将所述函数内的所有第一基本块的指令进行分割。
进一步地,所述扁平模块包括:
记录单元,用于记录多个第二基本块的跳转执行顺序,为每个所述第二基本块随机分配一个Tag值;
构造单元,用于构造While-Switch结构,将每个所述第二基本块放到一个随机顺序的Case语句内;
设置单元,用于设置全局Flag值;
控制单元,用于通过所述全局Flag值来控制多个Case语句的执行顺序。
进一步地,所述扁平模块还包括:
排序单元,用于将所述多个第二基本块对应的多个Tag值随机排序。
进一步地,还包括:
结束单元,用于在最后执行的第二基本块后插入返回指令,结束所述函数
关于上述实施例中的系统,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
本实施例提供的用于移动代码的结构扁平系统,以函数为操作对象,以指令为粒度进行切割,组合成新的基本块;通过条件指令和跳转指令,打乱新的基本块的上下顺序并替换跳转。由此,可以将编译器的中间代码LLVM IR进行结构扁平变化,将原本的控制流平台化,随机化,可以达到膨胀代码增加逆向复杂度,对抗IDA Pro,控制流平坦随机化后上下文的代码顺序不是最终的执行顺序,增加人类阅读的难度。
可以理解的是,本发明可用于众多通用或专用的计算系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络町、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。
本发明可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。二般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本发明,在这些分布式计算环境中,由通过通信网络丽被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
需要说明的是,在本文中,诸如"第二"和"第二"等之类的关系术语仅仅用来将一个实体或者操作与另二个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语"包括"、"包含"或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句"包括一个……"限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本发明的其它实施方案。本申请旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明的一般性原理并包括本发明未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明的真正范围和精神由下面的权利要求指出。
以上所揭露的仅为本发明一种较佳实施例而已,当然不能以此来限定本发明之权利范围,本领域普通技术人员可以理解实现上述实施例的全部或部分流程,并依本发明权利要求所作的等同变化,仍属于发明所涵盖的范围。
Claims (10)
1.一种用于移动代码的结构扁平方法,其特征在于,包括以下步骤:
将函数内的所有第一基本块包含的指令进行分割,组成多个第二基本块;以及
通过条件指令和跳转指令,将所述多个第二基本块重新排序。
2.根据权利要求1所述的用于移动代码的结构扁平方法,其特征在于,在将函数内的所有第一基本块包含的指令进行分割,组成多个第二基本块的所述步骤中,根据配置,以固定指令数为组将所述函数内的所有第一基本块的指令进行分割。
3.根据权利要求1所述的用于移动代码的结构扁平方法,其特征在于,通过条件指令和跳转指令,将所述多个第二基本块重新排序的所述步骤包括:
记录多个第二基本块的跳转执行顺序,为每个所述第二基本块随机分配一个Tag值;
构造While-Switch结构,将每个所述第二基本块放到一个随机顺序的Case语句内;
设置全局Flag值;
通过所述全局Flag值来控制多个Case语句的执行顺序。
4.根据权利要求3所述的用于移动代码的结构扁平方法,其特征在于,在记录多个第二基本块的跳转执行顺序,为每个所述第二基本块随机分配一个Tag值的所述步骤之后,还包括:
将所述多个第二基本块对应的多个Tag值随机排序。
5.根据权利要求3所述的用于移动代码的结构扁平方法,其特征在于,在通过所述全局Flag值来控制多个Case语句的执行顺序的所述步骤之后还包括:
在最后执行的第二基本块后插入返回指令,结束所述函数。
6.一种用于移动代码的结构扁平系统,其特征在于,包括:
分割模块,用于将函数内的所有第一基本块包含的指令进行分割,组成多个第二基本块;以及
扁平模块,用于通过条件指令和跳转指令,将所述多个第二基本块重新排序。
7.根据权利要求6所述的用于移动代码的结构扁平系统,其特征在于,所述分割模块用于根据配置,以固定指令数为组将所述函数内的所有第一基本块的指令进行分割。
8.根据权利要求6所述的用于移动代码的结构扁平系统,其特征在于,所述扁平模块包括:
记录单元,用于记录多个第二基本块的跳转执行顺序,为每个所述第二基本块随机分配一个Tag值;
构造单元,用于构造While-Switch结构,将每个所述第二基本块放到一个随机顺序的Case语句内;
设置单元,用于设置全局Flag值;
控制单元,用于通过所述全局Flag值来控制多个Case语句的执行顺序。
9.根据权利要求8所述的用于移动代码的结构扁平系统,其特征在于,所述扁平模块还包括:
排序单元,用于将所述多个第二基本块对应的多个Tag值随机排序。
10.根据权利要求8所述的用于移动代码的结构扁平系统,其特征在于,还包括:
结束单元,用于在最后执行的第二基本块后插入返回指令,结束所述函数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711126681.6A CN109784008A (zh) | 2017-11-14 | 2017-11-14 | 一种用于移动代码的结构扁平方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711126681.6A CN109784008A (zh) | 2017-11-14 | 2017-11-14 | 一种用于移动代码的结构扁平方法和系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109784008A true CN109784008A (zh) | 2019-05-21 |
Family
ID=66494565
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711126681.6A Pending CN109784008A (zh) | 2017-11-14 | 2017-11-14 | 一种用于移动代码的结构扁平方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109784008A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110379257A (zh) * | 2019-06-13 | 2019-10-25 | 广东工业大学 | 一种多语言跨平台的在线代码对战系统和方法 |
CN112528241A (zh) * | 2020-11-27 | 2021-03-19 | 北京深思数盾科技股份有限公司 | 一种代码混淆方法、代码混淆器以及计算机可读存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060195703A1 (en) * | 2005-02-25 | 2006-08-31 | Microsoft Corporation | System and method of iterative code obfuscation |
CN103207772A (zh) * | 2013-04-07 | 2013-07-17 | 北京航空航天大学 | 一种优化实时任务wcet的指令预取内容选取方法 |
CN103778355A (zh) * | 2014-01-15 | 2014-05-07 | 西北大学 | 一种基于代码变形的二进制代码混淆方法 |
CN106778101A (zh) * | 2016-12-08 | 2017-05-31 | 合肥康捷信息科技有限公司 | 一种基于控制流和外形混淆的Python代码混淆方法 |
-
2017
- 2017-11-14 CN CN201711126681.6A patent/CN109784008A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060195703A1 (en) * | 2005-02-25 | 2006-08-31 | Microsoft Corporation | System and method of iterative code obfuscation |
CN103207772A (zh) * | 2013-04-07 | 2013-07-17 | 北京航空航天大学 | 一种优化实时任务wcet的指令预取内容选取方法 |
CN103778355A (zh) * | 2014-01-15 | 2014-05-07 | 西北大学 | 一种基于代码变形的二进制代码混淆方法 |
CN106778101A (zh) * | 2016-12-08 | 2017-05-31 | 合肥康捷信息科技有限公司 | 一种基于控制流和外形混淆的Python代码混淆方法 |
Non-Patent Citations (1)
Title |
---|
葛华 等: ""一种JAVA控制流混淆方案"", 《湖北第二师范学院学报》 * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110379257A (zh) * | 2019-06-13 | 2019-10-25 | 广东工业大学 | 一种多语言跨平台的在线代码对战系统和方法 |
CN110379257B (zh) * | 2019-06-13 | 2021-03-30 | 广东工业大学 | 一种多语言跨平台的在线代码对战系统和方法 |
CN112528241A (zh) * | 2020-11-27 | 2021-03-19 | 北京深思数盾科技股份有限公司 | 一种代码混淆方法、代码混淆器以及计算机可读存储介质 |
CN112528241B (zh) * | 2020-11-27 | 2021-09-14 | 北京深思数盾科技股份有限公司 | 一种代码混淆方法、代码混淆器以及计算机可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Sigmundsson et al. | We can cure your child's clumsiness! A review of intervention methods. | |
KR20170059376A (ko) | 프로그래밍 교육 장치 및 방법 | |
CN109784008A (zh) | 一种用于移动代码的结构扁平方法和系统 | |
CN104091140A (zh) | 一种信息处理方法及电子设备 | |
Maiyana et al. | Pengembangan Sistem Informasi Surat Keterangan Pendamping Ijazah Berbasis Web dan Mobile Android | |
CN110059456A (zh) | 代码保护方法、代码保护装置、存储介质与电子设备 | |
CN102984124A (zh) | 一种将客户端游戏程序快速植入浏览器的方法及系统 | |
Agyemang | Effectiveness of public private partnership for infrastructure projects | |
CN112685055A (zh) | 一种集群的构建方法和装置 | |
Simm et al. | SE in ES: Opportunities for software engineering and cloud computing in environmental science | |
Shavaliev et al. | Agile in project management system in mechanical engineering | |
Altıntas et al. | A self-generating memetic algorithm for examination timetabling | |
Book et al. | Facilitating collaboration in high-performance computing projects with an interaction room | |
Raj et al. | Toward High Performance Computing Education | |
CN105511996B (zh) | 一种图形处理器内嵌可编程染色器验证平台 | |
CN103777929A (zh) | 用于程序开发的模拟开发系统的实现方法及模拟开发系统 | |
Cowart et al. | geoKepler Workflow Module for Computationally Scalable and Reproducible Geoprocessing and Modeling | |
Thompson 2nd et al. | Challenges and opportunities for consultation-liaison psychiatry in the managed care environment. | |
Yasar | Design and Develop to Deploy Securely | |
McMillan et al. | Modeling massive cluster formation with stellar feedback using flash and AMUSE | |
Grassi et al. | Dynamic seed genetic algorithm to solve job shop scheduling problems | |
Butt | Pacific science review B: Humanities and social sciences | |
Macmillan | The ultra-poor: A pioneering technique is helping the hardest to reach | |
Little | Post-Capitalism and the workless society | |
Maull et al. | Identifying and Tracing Persistent Identifiers of Research Resources: Automation, Metrics and Analytics |
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 | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20190521 |
|
RJ01 | Rejection of invention patent application after publication |