CN110597496B - 应用程序的字节码文件获取方法及装置 - Google Patents
应用程序的字节码文件获取方法及装置 Download PDFInfo
- Publication number
- CN110597496B CN110597496B CN201910854832.2A CN201910854832A CN110597496B CN 110597496 B CN110597496 B CN 110597496B CN 201910854832 A CN201910854832 A CN 201910854832A CN 110597496 B CN110597496 B CN 110597496B
- Authority
- CN
- China
- Prior art keywords
- application program
- file
- application
- interface
- 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.)
- Active
Links
Images
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/3668—Software testing
- G06F11/3672—Test management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
-
- 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/61—Installation
-
- 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)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Stored Programmes (AREA)
Abstract
本公开涉及一种应用程序的字节码文件获取方法及装置。该方法包括:基于应用程序的安装包运行所述应用程序;在确定所述应用程序的预定库文件被加载后,获取预定接口的地址;通过钩子函数获取由所述预定接口地址传输的接口参数;以及对所述接口参数进行解析以获取所述应用程序的字节码文件。本公开涉及的应用程序的字节码文件获取方法及装置,能够自动快速的获取应用程序的字节码文件,从而高效的利用字节码文件进行应用程序的开发和测试,降低开发和测试的成本。
Description
技术领域
本公开涉及计算机信息处理领域,具体而言,涉及一种应用程序的字节码文件获取方法及装置。
背景技术
Lua是一个小巧的脚本语言,其设计目的是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能,特别是在游戏类的应用程序中,Lua语言的使用非常广泛。字节码(Byte-code)是一种包含执行程序、由一序列op代码/数据对组成的二进制文件。字节码是一种中间码,经常被看作是包含一个执行程序的二进制文件。字节码由于被预处理过,所以比一般的解释代码要快,经常被存储在各种应用程序的安装包中,以供应用程序在执行的时候调用。Lua字节码是lua编译后生成的字节码文件。当前大部分游戏中使用了lua代码来控制游戏的逻辑处理,因为lua来处理游戏逻辑的话,在遇到问题的时候能够快速的热更小版本来解决问题。
基于游戏的lua源代码获取lua字节码,从而利用字节码文件进行应用程序的二次开发和测试,是当前常用的技术手段,但是受限于不同的游戏应用开发的团队和开发流程,不同的游戏应用的lua字节码加密方式更不相同,现有技术中只能依靠开发人员手动破解,费时费力。
因此,需要一种新的应用程序的字节码文件获取方法及装置。
在所述背景技术部分公开的上述信息仅用于加强对本公开的背景的理解,因此它可以包括不构成对本领域普通技术人员已知的现有技术的信息。
发明内容
有鉴于此,本公开提供一种应用程序的字节码文件获取方法及装置,能够自动快速的获取应用程序的字节码文件,从而合理快速的利用字节码文件进行应用程序的开发和测试,降低开发和测试的成本。
本公开的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本公开的实践而习得。
根据本公开的一方面,提出一种应用程序的字节码文件获取方法,该方法包括:基于应用程序的安装包运行应用程序;在确定应用程序的预定库文件被加载后,获取预定接口的地址;通过钩子函数获取由预定接口地址传输的接口参数;以及对接口参数进行解析以获取应用程序的字节码文件。
根据本公开的一方面,提出一种应用程序的字节码文件获取装置,该装置包括:运行模块,用于基于应用程序的安装包运行应用程序;监听模块,用于在确定应用程序的预定库文件被加载后,获取预定接口的地址;钩子模块,用于通过钩子函数获取由预定接口地址传输的接口参数;以及解析模块,用于对接口参数进行解析以获取应用程序的字节码文件。
在一个实施例中,运行模块包括:解码单元,用于对所述安装包进行静态解码以确定所述字节码文件的加密方式;以及运行单元,用于在所述加密方式为私有加密方式时,基于应用程序的安装包运行所述应用程序。
在一个实施例中,运行模块还包括:解析单元,用于在所述加密方式为非私有加密方式时,对所述安装包中的预定文件夹中的资源数据进行解析以获取所述字节码文件。
在一个实施例中,解析单元包括:秘钥子单元,用于基于所述安装包中预定文件夹中的资源数据的头文件确定解密秘钥;以及解密子单元,用于通过所述解密秘钥对所述资源数据进行解密以获取所述应用程序的字节码。
在一个实施例中,运行模块包括:虚拟单元,用于通过所述安装包在虚拟空间中创建所述应用程序;以及通过虚拟化引擎方式运行所述应用程序。
在一个实施例中,监听模块包括:加载单元,用于通过监听内存代码段基址的方式确定所述应用程序的标准lua库文件被加载。
在一个实施例中,监听模块包括:地址单元,用于根据加载动态链接库函数获取lua加载标准接口的地址。
在一个实施例中,钩子模块包括:直接单元,用于通过直接调用钩子函数的方式获取由所述预定接口地址传输的所述接口参数;和/或权项单元,用于通过权限用户注入钩子函数的方式获取由所述预定接口地址传输的所述接口参数。
在一个实施例中,权限单元包括:权限子单元,用于以权限用户的方式运行所述钩子函数;关联子单元,用于将所述钩子函数关联至所述应用程序;调用子单元,用于远程调用加载动态链接库函数以获取lua加载标准接口的地址;以及参数子单元,用于由所述预定接口地址获取所述接口参数。
根据本公开的一方面,提出一种电子设备,该电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序;当一个或多个程序被一个或多个处理器执行,使得一个或多个处理器实现如上文的方法。
根据本公开的一方面,提出一种计算机可读介质,其上存储有计算机程序,该程序被处理器执行时实现如上文中的方法。
根据本公开的应用程序的字节码文件获取方法及装置,基于应用程序的安装包运行应用程序;在确定应用程序的预定库文件被加载后,获取预定接口的地址;通过钩子函数获取由预定接口地址传输的接口参数;以及对接口参数进行解析以获取应用程序的字节码文件的方式,能够自动快速的获取应用程序的字节码文件,从而合理快速的利用字节码文件进行应用程序的开发和测试,降低开发和测试的成本。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性的,并不能限制本公开。
附图说明
通过参照附图详细描述其示例实施例,本公开的上述和其它目标、特征及优点将变得更加显而易见。下面描述的附图仅仅是本公开的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是根据一示例性实施例示出的一种应用程序的字节码文件获取方法及装置的应用场景框图。
图2是根据一示例性实施例示出的一种应用程序的字节码文件获取方法的流程图。
图3是根据另一示例性实施例示出的一种应用程序的字节码文件获取方法的流程图。
图4是根据另一示例性实施例示出的一种应用程序的字节码文件获取方法的流程图。
图5是根据另一示例性实施例示出的一种应用程序的字节码文件获取方法的流程图。
图6是根据另一示例性实施例示出的一种应用程序的字节码文件获取方法的流程图。
图7是根据另一示例性实施例示出的一种应用程序的字节码文件获取方法的示意图。
图8是根据一示例性实施例示出的一种应用程序的字节码文件获取装置的框图。
图9是根据一示例性实施例示出的一种电子设备的框图。
具体实施方式
现在将参考附图更全面地描述示例实施例。然而,示例实施例能够以多种形式实施,且不应被理解为限于在此阐述的实施例;相反,提供这些实施例使得本公开将全面和完整,并将示例实施例的构思全面地传达给本领域的技术人员。在图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。
此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本公开的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而没有特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本公开的各方面。
附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
应理解,虽然本文中可能使用术语第一、第二、第三等来描述各种组件,但这些组件不应受这些术语限制。这些术语乃用以区分一组件与另一组件。因此,下文论述的第一组件可称为第二组件而不偏离本公开概念的教示。如本文中所使用,术语“及/或”包括相关联的列出项目中的任一个及一或多者的所有组合。
本领域技术人员可以理解,附图只是示例实施例的示意图,附图中的模块或流程并不一定是实施本公开所必须的,因此不能用于限制本公开的保护范围。
为了便于理解本公开的内容,将本公开中涉及到的缩略语做如下说明:
Lua:是一个小巧的脚本语言,其设计目的是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。
Lua字节码:Lua字节码是lua编译后生成的字节码文件,包含执行程序,由一序列op代码/数据对组成的二进制文件。
Asset包:Assetfile是unity资源文件和数据的集合,它们被压缩并存储在一个文件中,类似于zip文件。与zip文件一样,Asset包在解压缩时会保留其原始目录结构,以及有关Assets的元数据。
AssetBundle:一个AssetBundle是包含特定于平台的资产(模型,材质,组合屋,音频剪辑,甚至整个场景),可以在运行时加载的存档文件。AssetBundles可以表达彼此之间的依赖关系。
hook:是一种截获操作系统中某应用程序或者所有进程的消息的一种技术。
VA:VirtualApp可以创建一个虚拟空间,你可以在虚拟空间内任意的安装、启动和卸载APK,这一切都与外部隔离,如同一个沙盒,APK无需在外部安装。
代码注入:用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据。可以通过代码注入在破解系统上,以获取信息、提权、或者非法访问某系统。
现结合具体的实施例,对本公开的内容做详细描述。
图1是根据一示例性实施例示出的一种应用程序的字节码文件获取方法及装置的应用场景框图。
如图1所示,系统架构10可以包括终端设备101、102、103,网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
可以使用终端设备101、102、103通过网络104与服务器105交互,以接收或发送消息等。终端设备101、102、103上可以安装有各种通讯客户端应用,例如网络游戏类应用、网页浏览器应用、搜索类应用、即时通信工具等。
终端设备101、102、103可以是具有显示屏并且支持安装应用程序的的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。
终端设备101、102、103可例如基于应用程序的安装包运行应用程序;终端设备101、102、103可例如在确定应用程序的预定库文件被加载后,获取预定接口的地址;终端设备101、102、103可例如通过钩子函数获取由预定接口地址传输的接口参数;终端设备101、102、103可例如对接口参数进行解析以获取应用程序的字节码文件。
终端设备101、102、103还可例如对安装包进行静态解码以确定字节码文件的加密方式;终端设备101、102、103还可例如在加密方式为私有加密方式时,基于应用程序的安装包运行应用程序;终端设备101、102、103还可例如在加密方式为非私有加密方式时,对安装包中的预定文件夹中的资源数据进行解析以获取字节码文件。
服务器105可以是提供各种服务的服务器,例如对利用终端设备101、102、103所获取的游戏应用程序进行处理的后台服务器。后台管理服务器可以对接收到的游戏类应用程序的安装包进行分析等处理,并将处理结果(解析到的字节码文件)反馈给终端设备。
服务器105可例如基于应用程序的安装包运行应用程序;服务器105可例如在确定应用程序的预定库文件被加载后,获取预定接口的地址;服务器105可例如通过钩子函数获取由预定接口地址传输的接口参数;服务器105可例如对接口参数进行解析以获取应用程序的字节码文件。
服务器105还可例如对安装包进行静态解码以确定字节码文件的加密方式;服务器105还可例如在加密方式为私有加密方式时,基于应用程序的安装包运行应用程序;服务器105还可例如在加密方式为非私有加密方式时,对安装包中的预定文件夹中的资源数据进行解析以获取字节码文件。
服务器105可以是一个实体的服务器,还可例如为多个服务器组成,需要说明的是,本公开实施例所提供的应用程序的字节码文件获取方法可以由服务器105或终端设备101、102、103执行,相应地,应用程序的字节码文件获取装置可以设置于服务器105或终端设备101、102、103中。
图2是根据一示例性实施例示出的一种应用程序的字节码文件获取方法的流程图。应用程序的字节码文件获取方法20至少包括步骤S202至S208。
如图2所示,在S202中,基于应用程序的安装包运行应用程序。不失一般性,应用程序可为游戏类的应用程序。可包括:通过安装包在虚拟空间中创建应用程序;以及通过虚拟化引擎方式运行应用程序。
其中,可例如,通过VirtualApp(VA)的方式拉起需要导出lua字节码的游戏应用,首先可通过VirtualApp创建一个虚拟空间,然后在虚拟空间内安装游戏应用,同样也可以在该空间内启动和卸载该游戏应用。在安装游戏应用之后,继续在该虚拟空间内运行该游戏应用。
在S204中,在确定应用程序的预定库文件被加载后,获取预定接口的地址。可例如,通过监听内存代码段基址的方式确定应用程序的标准lua库文件被加载。还可例如,根据加载动态链接库函数获取lua加载标准接口的地址。
在游戏应用运行以后可使用/proc/self/maps监听标准lua库文件是否被加载,标准lua库被加载以后,使用dlsym接口获取到lua加载标准接口luaL_loadbuffer/luaL_loadbufferx/lua_load的地址。
其中,/proc/self/maps是基于Linux内核的命令,该命令在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。在一个实施例中,通过/proc/self/maps可以得到当前游戏应用的内部进程的内存映射关系,通过读该文件的内容可以得到内部进程的内存代码段基址,进而确定游戏应用程序的标准lua库文件是否被加载。
其中,dlsym是一个计算机函数,功能是根据动态链接库操作句柄与符号,返回符号对应的地址,dlsym可以获取函数地址,也可以获取变量地址。在本公开中,通过dlsym获取到lua加载标准接口的地址。
在S206中,通过钩子函数获取由预定接口地址传输的接口参数。可包括:通过直接调用钩子函数的方式获取由预定接口地址传输的接口参数;和/或通过权限用户注入钩子函数的方式获取由预定接口地址传输的接口参数。
在一个实施例中,通过权限用户注入钩子函数的方式获取由预定接口地址传输的接口参数包括:以权限用户的方式运行钩子函数;将钩子函数关联至应用程序;远程调用加载动态链接库函数以获取lua加载标准接口的地址;以及由预定接口地址获取接口参数。
其中,通过直接调用钩子函数的方式获取由预定接口地址传输的接口参数的内容将在图3对应的实施例中进行详细描述;通过权限用户注入钩子函数的方式获取由预定接口地址传输的接口参数的内容将在图4对应的实施例中进行详细描述。
在S208中,对接口参数进行解析以获取应用程序的字节码文件。如上文,通过luaL_loadbuffer/luaL_loadbufferx/lua_load接口地址,获取接口参数。
其中,在lua语言中,luaL_loadbuffer的功能是载入并编译内存中的一段Lua代码,然后作为一个代码块(称为chunk)压入栈中,其中的最后一个参数作为代码块的名称用于调试。和它功能类似的还有luaL_loadfile(载入文件),luaL_loadstring(载入字符串,本例中也可用它代替luaL_loadbuffer)等等。它们有一个相同的前缀:luaL_,Lua C API将库中的核心函数包装后作为辅助函数提供一些常用功能,它们的形式都是luaL_*。根据luaL_loadbuffer中传输的具体参数的定义,可以获取lua字节码的存储地址和存储方式,进而对安装包文件进行解析,获取获取应用程序的字节码文件。
根据本公开的应用程序的字节码文件获取方法,基于应用程序的安装包运行应用程序;在确定应用程序的预定库文件被加载后,获取预定接口的地址;通过钩子函数获取由预定接口地址传输的接口参数;以及对接口参数进行解析以获取应用程序的字节码文件的方式,能够自动快速的获取应用程序的字节码文件,从而合理快速的利用字节码文件进行应用程序的开发和测试,降低开发和测试的成本。
应清楚地理解,本公开描述了如何形成和使用特定示例,但本公开的原理不限于这些示例的任何细节。相反,基于本公开公开的内容的教导,这些原理能够应用于许多其它实施例。
图3是根据另一示例性实施例示出的一种应用程序的字节码文件获取方法的流程图。图3所示的流程是对图2所示的流程中S206中“通过直接调用钩子函数的方式获取由预定接口地址传输的接口参数”的详细描述。
图3是根据另一示例性实施例示出的一种应用程序的字节码文件获取方法的流程图。图3所示的流程是对图2所示的流程中S206中“通过直接调用钩子函数的方式获取由预定接口地址传输的接口参数”的详细描述。
如图3所示,在S302中,钩子函数运行。
在S304中,建立虚拟空间。
在S306中,在虚拟空间中运行应用程序安装包。
在S308中,运行应用程序,应用程序加载标准lua库文件。
在S310中,调用lua加载接口。
在S312中,通过监听方式确定标准lua库文件被加载。可例如,通过监听内存代码段基址的方式确定应用程序的标准lua库文件被加载。
在S314中,获取加载lua接口地址。可例如,根据加载动态链接库函数获取lua加载标准接口的地址
在S316中,获取加载lua接口的参数,以便获取到lua字节码文件。具体可例如,获取到lua字节码文件的名字和内容。
创建APP,使用VirtualApp的方式拉起需要导出lua字节码的游戏,拉起游戏以后使用/proc/self/maps监听标准lua库文件是否被加载,标准lua库被加载以后,使用dlsym接口获取到lua加载标准接口luaL_loadbuffer/luaL_loadbufferx/lua_load的地址,hook接口地址,当lua加载接口被调用的时候,截获传输的接口参数,获取到lua字节码。
加载Lua标准接口的具体描述可如下:
图4是根据另一示例性实施例示出的一种应用程序的字节码文件获取方法的流程图。图4所示的流程是对图2所示的流程中S206中“通过权限用户注入钩子函数的方式获取由预定接口地址传输的接口参数”的详细描述。
如图4所示,在S402中,附着到应用进程。可例如通过attach函数关联到应用进程。attach函数的主要功能是将对象和资源句柄联系起来。
在S404中,保存寄存器环境。
在S406中,远程调用内存映射函数分配内存空间。其中,内存映射函数可为mmap,mmap将一个文件或者其它对象映射进内存,mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。
在S408中,向远程内存空间写入加载模块名和调用函数。
在S410中,远程调用指定函数以打开注入模块。指定函数可为dlopen,dlopen是一个计算机函数,功能是以指定模式打开指定的动态链接库文件,并返回一个句柄给dlsym的调用进程。使用dlclose来卸载打开的库。
在S412中,远程调用加载动态链接库函数获取待调用的而函数地址。
在S414中,远程调用被注入模块的函数。
在S416中,恢复寄存器环境。
在S418中,从远程进程断开(detach)。
在有些情况下,使用VA的方式hook有些游戏应用会出现失败,这个时候可使用ptrace注入代码的方式hook应用进程以获取游戏应用的乱字节码。值得一提的是,ptrace注入代码需要在root的机器上运行,否者ptrace去attach的时候会出现权限不够的情况。
Ptrace注入代码的原理:
操作系统提供了一种标准的服务来让程序员实现对底层硬件和服务的控制(比如文件系统),叫做系统调用(system calls)。当一个程序需要作系统调用的时候,它将相关参数放进系统调用相关的寄存器,然后调用软中断0x80,这个中断就像一个让程序得以接触到内核模式的窗口,程序将参数和系统调用号交给内核,内核来完成系统调用的执行。在i386体系中,系统调用号将放入%eax,它的参数则依次放入%ebx,%ecx,%edx,%esi和%edi。
执行系统调用之前,内核会先检查当前进程是否处于被“跟踪”(traced)的状态。如果是的话,内核暂停当前进程并将控制权交给跟踪进程,使跟踪进程得以察看或者修改被跟踪进程的寄存器。
更具体的,可通过以下Ptrace函数将代码注入游戏应用中以hook应用进程:
long ptrace(enum__ptrace_request request,pid_t pid,void*addr,void*data);
Request:为行为参数,该参数决定了ptrace函数的行为;
Pid:参数为远程进程的ID;
addr参数与data参数在不同的request参数取值下表示不同的含义;
部分ptrace注入进程的过程中需要使用到的request参数:
PTRACE_ATTACH,表示附加到指定远程进程;
PTRACE_DETACH,表示从指定远程进程分离;
PTRACE_GETREGS,表示读取远程进程当前寄存器环境;
PTRACE_SETREGS,表示设置远程进程的寄存器环境;
PTRACE_CONT,表示使远程进程继续运行;
PTRACE_PEEKTEXT,从远程进程指定内存地址读取一个word大小的数据;
PTRACE_POKETEXT,往远程进程指定内存地址写入一个word大小的数据。
图5是根据另一示例性实施例示出的一种应用程序的字节码文件获取方法的流程图。图5所示的流程是对应用程序的字节码文件获取方法的进一步说明。
如图5所示,在S502中,对安装包进行静态解码以确定字节码文件的加密方式。
其中,在大部分情况下,Lua字节码会存储在应用程序的安装包中,大部分的lua字节码会已TextAsset形式的资源格式存储在Assetfile/AssetBundle文件中。针对这中类型的lua字节码,可通过静态方式从Assetfile和AssetBundle的解析导出所有的TextAsset资源,然后通过判断TextAsset资源的文件头确认是否为luac/luajit字节码。
在游戏的应用中,少部分项目会针对luac/luajit字节码做静态文件的混淆和加密,通过加密的Lua字节码特征,确认使用的加密方法(Lua字节码通常使用Lua官方的xxtea的算法进行加密),IDA找出秘钥破解,解密出Lua字节码。
在S504中,在加密方式为私有加密方式时,基于应用程序的安装包运行应用程序。使用私有的加密方法的应用程序,静态破解其字节码会会花费较大精力,这种情况下,可使用动态hook的思路导出lua字节码。
其中,如上文,由于加载lua字节码,会使用到lua的标准接口luaL_loadbuffer/luaL_loadbufferx/lua_load,可以hook lua字节码加载的标准接口,导出lua字节码的数据流。大部分项目可以使用VirtualApp的方式拉起游戏,试游戏运行在虚拟空间中,监听游戏加载的lua的标准库文件libxlua.so(UE/COSCOS游戏引擎,可能会将lua标准库,集成在引擎的so里面,比如libUE4.so),使用dlsym标准库文件中找到标准接口的地址,hook该地址,游戏运行期间每次调用到lua标准接口的时候,就动态导出调用到的lua字节码。部分游戏VA hook可能失败,这时需要root手机使用ptrace代码注入的方式进行hook,思路是游戏启动的时候,使用ptrace注入自己的hook代码到游戏进程上,hook Lua加载的标准接口,动态导出lua字节码。
在S506中,在加密方式为非私有加密方式时,对安装包中的预定文件夹中的资源数据进行解析以获取字节码文件。可包括:基于安装包中预定文件夹中的资源数据的头文件确定解密秘钥;以及通过解密秘钥对资源数据进行解密以获取应用程序的字节码。
其中,对安装包中的预定文件夹中的资源数据进行解析以获取字节码文件的内容将在图6对应的实施例中进行详细描述。
目前,提取lua字节码的方案基本都是单个游戏尝试破解,并没有整套的破解导出方案,在很多时候还会遇到无法破解的瓶颈。更没有自动化破解导出lua字节码的工具。当前最多使用的方式为静态导出lua字节码,但是部分游戏采用了私有加密的方法,在破解方面投入很大,还会遇到无法破解的情况。
根据本公开的应用程序的字节码文件获取方法,可由py c++编译构成的可执行程序,从而分层次的导出lua字节码。在第一层静态方式中,可从静态安装包中快速确认导出lua字节码,遇到私有加密的情况下,能够立刻发现,采用第二层动态hook的方式去导出lua字节码。在动态hook方式中,可使用VA hook和ptrace代码注入两套方案导出字节码,达到保底的实现方法。
在具体的实际应用中,没有全部使用动态的方法,是因为动态hook是游戏运行时加载lua字节码的时候进行导出,需要跑测游戏,同时跑测游戏中可能有部分lua字节码会漏掉,所以采用两层方式导出lua字节码,静态导出在保证大部分项目lua字节码全的情况下,全自动化时间上也很快。剩余项目使用动态导出,达到保底能够导出lua字节码的保障。进而能够自动快速的获取应用程序的字节码文件,从而合理快速的利用字节码文件进行应用程序的开发和测试,降低开发和测试的成本。
在后续的应用程序运行时,可以结合游戏自动化测试,动态hook游戏以后,使用接入游戏自动化测试的相关工具自动跑测,不需要人力跑测游戏,达到自动化跑测导出lua字节码。
图6是根据另一示例性实施例示出的一种应用程序的字节码文件获取方法的流程图。图6所示的流程是对图5所示的流程中S506中“对安装包中的预定文件夹中的资源数据进行解析以获取字节码文件”的详细描述。
如图6所示,在S602中,解压缩安装包。
在S604中,判断解压文件中是否为lua字节码文件。可通过判断头文件是否为1B4C756151和1B4C4A02来进行判断。
在S606中,判断解压文件中是否存在IFS文件。可通过判断头文件是否为696e7366来进行判断。
在S608中,解析数IFS包。
在S610中,遍历Assetfile文件,解析出TextAsset。
在S612中,解压AssetBundle文件,解析出TextAsset。
在S614中,判断TextAsset是否为lua字节码文件。可通过判断头文件是否为1B4C756151和1B4C4A02来进行判断。
在S616中,拷贝到指定的lua字节码文件目录。
Lua字节码的分为luac和luajit两种,文件头分别为(1B4C756151和1B4C4A02),首先可以在安装包中通过文件头遍历,看是否存在lua字节码导出。大部分项目会将lua字节码放在Assetfile/AssetBundle里面,由于部分项目接入了IIPS的组件,可能会将AssetBundle文件打包成一个IFS文件(文件头696e7366),如果IFS文件需要首先解压IFS文件获取到AssetBundle,整体从Assetfile/Bundle文件中解析出TextAsset类型的资源类型,通过文件头,看是否存在lua字节码导出。
Lua官方加解密的实现使用了xxtea算法,大部分项目lua字节码也使用xxtea算法加密,xxtea加密算法,解密需要sign和key密码对,从xxtea加密的文件头获取到sign的位置如图7所述,在图7箭头所指的方框处。IDA加载游戏引擎的so文件,从IDA中查找到密码sign字符串,在sign字符串附近,存在对应的key字符串。使用xxtea算法,使用sign和key密码对,将加密的文件解密,得到lua自解码。
在一个实施例中,还包括:将所述字节码文件存储至区块链系统中。其中,区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链(Blockchain),本质上是一个去中心化的数据库,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。区块链可以包括区块链底层平台、平台产品服务层以及应用服务层。
区块链底层平台可以包括用户管理、基础服务、智能合约以及运营监控等处理模块。其中,用户管理模块负责所有区块链参与者的身份信息管理,包括维护公私钥生成(账户管理)、密钥管理以及用户真实身份和区块链地址对应关系维护(权限管理)等,并且在授权的情况下,监管和审计某些真实身份的交易情况,提供风险控制的规则配置(风控审计);基础服务模块部署在所有区块链节点设备上,用来验证业务请求的有效性,并对有效请求完成共识后记录到存储上,对于一个新的业务请求,基础服务先对接口适配解析和鉴权处理(接口适配),然后通过共识算法将业务信息加密(共识管理),在加密之后完整一致的传输至共享账本上(网络通信),并进行记录存储;智能合约模块负责合约的注册发行以及合约触发和合约执行,开发人员可以通过某种编程语言定义合约逻辑,发布到区块链上(合约注册),根据合约条款的逻辑,调用密钥或者其它的事件触发执行,完成合约逻辑,同时还提供对合约升级注销的功能;运营监控模块主要负责产品发布过程中的部署、配置的修改、合约设置、云适配以及产品运行中的实时状态的可视化输出,例如:告警、监控网络情况、监控节点设备健康状态等。
平台产品服务层提供典型应用的基本能力和实现框架,开发人员可以基于这些基本能力,叠加业务的特性,完成业务逻辑的区块链实现。
应用服务层提供基于区块链方案的应用服务给业务参与方进行使用。将所述字节码文件存储至区块链系统之后,应用服务层可基于区块中的字节码文件,向其他系统或者使用者基于区块链协议提供字节码文件的数据读取服务,基于区块链系统所提供的字节码文件的读取服务能够保证字节码文件在数据传输使用的过程中不被更改,并且保证字节码文件的数据安全。
本领域技术人员可以理解实现上述实施例的全部或部分步骤被实现为由CPU执行的计算机程序。在该计算机程序被CPU执行时,执行本公开提供的上述方法所限定的上述功能。的程序可以存储于一种计算机可读存储介质中,该存储介质可以是只读存储器,磁盘或光盘等。
此外,需要注意的是,上述附图仅是根据本公开示例性实施例的方法所包括的处理的示意性说明,而不是限制目的。易于理解,上述附图所示的处理并不表明或限制这些处理的时间顺序。另外,也易于理解,这些处理可以是例如在多个模块中同步或异步执行的。
下述为本公开装置实施例,可以用于执行本公开方法实施例。对于本公开装置实施例中未披露的细节,请参照本公开方法实施例。
图8是根据一示例性实施例示出的一种应用程序的字节码文件获取装置的框图。应用程序的字节码文件获取装置80包括:运行模块802,监听模块804,钩子模块806,解析模块808。
运行模块802用于基于应用程序的安装包运行应用程序;可包括:通过安装包在虚拟空间中创建应用程序;以及通过虚拟化引擎方式运行应用程序。
监听模块804用于在确定应用程序的预定库文件被加载后,获取预定接口的地址;可例如,通过监听内存代码段基址的方式确定应用程序的标准lua库文件被加载。还可例如,根据加载动态链接库函数获取lua加载标准接口的地址。
钩子模块806用于通过钩子函数获取由预定接口地址传输的接口参数;可包括:通过直接调用钩子函数的方式获取由预定接口地址传输的接口参数;和/或通过权限用户注入钩子函数的方式获取由预定接口地址传输的接口参数。
解析模块808用于对接口参数进行解析以获取应用程序的字节码文件。根据luaL_loadbuffer中传输的具体参数的定义,可以获取lua字节码的存储地址和存储方式,进而对安装包文件进行解析,获取获取应用程序的字节码文件。
根据本公开的应用程序的字节码文件获取装置,基于应用程序的安装包运行应用程序;在确定应用程序的预定库文件被加载后,获取预定接口的地址;通过钩子函数获取由预定接口地址传输的接口参数;以及对接口参数进行解析以获取应用程序的字节码文件的方式,能够自动快速的获取应用程序的字节码文件,从而合理快速的利用字节码文件进行应用程序的开发和测试,降低开发和测试的成本。
图9是根据一示例性实施例示出的一种电子设备的框图。
下面参照图9来描述根据本公开的这种实施方式的电子设备900。图9显示的电子设备900仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图9所示,电子设备900以通用计算设备的形式表现。电子设备900的组件可以包括但不限于:至少一个处理单元910、至少一个存储单元920、连接不同系统组件(包括存储单元920和处理单元910)的总线930、显示单元940等。
其中,存储单元存储有程序代码,程序代码可以被处理单元910执行,使得处理单元910执行本说明书上述电子处方流转处理方法部分中描述的根据本公开各种示例性实施方式的步骤。例如,处理单元910可以执行如图2,图3,图4,图5,图6中所示的步骤。
存储单元920可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(RAM)9201和/或高速缓存存储单元9202,还可以进一步包括只读存储单元(ROM)9203。
存储单元920还可以包括具有一组(至少一个)程序模块9205的程序/实用工具9204,这样的程序模块9205包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
总线930可以为表示几类总线结构中的一种或多种,包括存储单元总线或者存储单元控制器、外围总线、图形加速端口、处理单元或者使用多种总线结构中的任意总线结构的局域总线。
电子设备900也可以与一个或多个外部设备900’(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该电子设备900交互的设备通信,和/或与使得该电子设备900能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口950进行。并且,电子设备900还可以通过网络适配器960与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。网络适配器960可以通过总线930与电子设备900的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备900使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、或者网络设备等)执行根据本公开实施方式的上述方法。
程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
计算机可读存储介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读存储介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。可读存储介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本公开操作的程序代码,程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该计算机可读介质实现如下功能:基于应用程序的安装包运行应用程序;在确定应用程序的预定库文件被加载后,获取预定接口的地址;通过钩子函数获取由预定接口地址传输的接口参数;以及对接口参数进行解析以获取应用程序的字节码文件。
本领域技术人员可以理解上述各模块可以按照实施例的描述分布于装置中,也可以进行相应变化唯一不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
通过以上的实施例的描述,本领域的技术人员易于理解,这里描述的示例实施例可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施例的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、移动终端、或者网络设备等)执行根据本公开实施例的方法。
以上具体地示出和描述了本公开的示例性实施例。应可理解的是,本公开不限于这里描述的详细结构、设置方式或实现方法;相反,本公开意图涵盖包含在所附权利要求的精神和范围内的各种修改和等效设置。
此外,本说明书说明书附图所示出的结构、比例、大小等,均仅用以配合说明书所公开的内容,以供本领域技术人员了解与阅读,并非用以限定本公开可实施的限定条件,故不具技术上的实质意义,任何结构的修饰、比例关系的改变或大小的调整,在不影响本公开所能产生的技术效果及所能实现的目的下,均应仍落在本公开所公开的技术内容得能涵盖的范围内。同时,本说明书中所引用的如“上”、“第一”、“第二”及“一”等的用语,也仅为便于叙述的明了,而非用以限定本公开可实施的范围,其相对关系的改变或调整,在无实质变更技术内容下,当也视为本公开可实施的范畴。
Claims (11)
1.一种应用程序的字节码文件获取方法,其特征在于,包括:
基于应用程序的安装包运行所述应用程序;
在确定所述应用程序的预定库文件被加载后,获取预定接口的地址;
以权限用户的方式运行钩子函数;
将所述钩子函数关联至所述应用程序;
远程调用加载动态链接库函数以获取lua加载标准接口的地址;
由所述预定接口地址获取接口参数;以及对所述接口参数进行解析以获取所述应用程序的字节码文件。
2.如权利要求1所述的方法,其特征在于,基于应用程序的安装包运行所述应用程序包括:
对所述安装包进行静态解码以确定所述字节码文件的加密方式;以及
在所述加密方式为私有加密方式时,基于应用程序的安装包运行所述应用程序。
3.如权利要求2所述的方法,其特征在于,还包括:
在所述加密方式为非私有加密方式时,对所述安装包中的预定文件夹中的资源数据进行解析以获取所述字节码文件。
4.如权利要求3所述的方法,其特征在于,对所述安装包中的预定文件夹中的资源数据进行解析以获取所述字节码文件包括:
基于所述安装包中预定文件夹中的资源数据的头文件确定解密秘钥;以及
通过所述解密秘钥对所述资源数据进行解密以获取所述应用程序的字节码。
5.如权利要求1所述的方法,其特征在于,基于应用程序的安装包运行所述应用程序包括:
通过所述安装包在虚拟空间中创建所述应用程序;以及
通过虚拟化引擎方式运行所述应用程序。
6.如权利要求1所述的方法,其特征在于,在确定所述应用程序的预定库文件被加载后,获取预定接口的地址包括:
通过监听内存代码段基址的方式确定所述应用程序的标准lua库文件被加载后,根据加载动态链接库函数获取lua加载标准接口的地址。
7.如权利要求1所述的方法,其特征在于,所述方法还包括:
通过直接调用钩子函数的方式获取由所述预定接口地址传输的所述接口参数。
8.如权利要求1所述的方法,其特征在于,还包括:
将所述字节码文件存储至区块链系统中。
9.一种应用程序的字节码文件获取装置,其特征在于,包括:
运行模块,用于基于应用程序的安装包运行所述应用程序;
监听模块,用于在确定所述应用程序的预定库文件被加载后,获取预定接口的地址;
钩子模块,用于以权限用户的方式运行钩子函数;将所述钩子函数关联至所述应用程序;远程调用加载动态链接库函数以获取lua加载标准接口的地址;由所述预定接口地址获取接口参数;以及
解析模块,用于对所述接口参数进行解析以获取所述应用程序的字节码文件。
10.一种计算机可读介质,其上存储有计算机程序,该计算机程序被处理器执行时实现权利要求1至8中任意一项所述的应用程序的字节码文件获取方法。
11.一种电子设备,其特征在于,包括:
处理器;以及
存储器,用于存储所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行权利要求1至8中任意一项所述的应用程序的字节码文件获取方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910854832.2A CN110597496B (zh) | 2019-09-10 | 2019-09-10 | 应用程序的字节码文件获取方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910854832.2A CN110597496B (zh) | 2019-09-10 | 2019-09-10 | 应用程序的字节码文件获取方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110597496A CN110597496A (zh) | 2019-12-20 |
CN110597496B true CN110597496B (zh) | 2021-09-24 |
Family
ID=68858625
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910854832.2A Active CN110597496B (zh) | 2019-09-10 | 2019-09-10 | 应用程序的字节码文件获取方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110597496B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113051231A (zh) * | 2019-12-27 | 2021-06-29 | 北京国双科技有限公司 | 文件解析方法、装置、计算机设备和存储介质 |
CN111273967A (zh) * | 2019-12-30 | 2020-06-12 | 上海上讯信息技术股份有限公司 | 适用于Android系统的远程钩子设置方法、装置及电子设备 |
CN112631613A (zh) * | 2020-12-29 | 2021-04-09 | 杭州趣链科技有限公司 | 基于区块链平台的智能合约部署和调用方法及相关设备 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102043932A (zh) * | 2010-12-31 | 2011-05-04 | 中国航空工业集团公司第六三一研究所 | 一种防止Java程序被反编译的方法 |
CN106599628A (zh) * | 2016-12-08 | 2017-04-26 | 合肥康捷信息科技有限公司 | 一种基于模块钩子的Python字节码文件保护方法 |
CN109062582A (zh) * | 2018-07-23 | 2018-12-21 | 北京云测信息技术有限公司 | 一种应用安装包的加密方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9116717B2 (en) * | 2011-05-27 | 2015-08-25 | Cylance Inc. | Run-time interception of software methods |
-
2019
- 2019-09-10 CN CN201910854832.2A patent/CN110597496B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102043932A (zh) * | 2010-12-31 | 2011-05-04 | 中国航空工业集团公司第六三一研究所 | 一种防止Java程序被反编译的方法 |
CN106599628A (zh) * | 2016-12-08 | 2017-04-26 | 合肥康捷信息科技有限公司 | 一种基于模块钩子的Python字节码文件保护方法 |
CN109062582A (zh) * | 2018-07-23 | 2018-12-21 | 北京云测信息技术有限公司 | 一种应用安装包的加密方法及装置 |
Non-Patent Citations (1)
Title |
---|
"一种有效的Python字节码保护方法";陈悟等;《电子技术》;20170625;第46卷(第6期);第16-22页 * |
Also Published As
Publication number | Publication date |
---|---|
CN110597496A (zh) | 2019-12-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11687645B2 (en) | Security control method and computer system | |
US20180260199A1 (en) | Method and apparatus for intermediate representation of applications | |
US7181603B2 (en) | Method of secure function loading | |
Capizzi et al. | Preventing information leaks through shadow executions | |
CN110597496B (zh) | 应用程序的字节码文件获取方法及装置 | |
CN110333868B (zh) | 用于生成子应用的安装包的方法和系统 | |
EP1958116A1 (en) | A practical platform for high risk applications | |
CN107273723B (zh) | 一种基于so文件加壳的Android平台应用软件保护方法 | |
CN110532165B (zh) | 应用程序安装包特性检测方法、装置、设备及存储介质 | |
WO2006129641A1 (ja) | コンピュータシステム及びプログラム生成装置 | |
Ahmad et al. | StaDART: addressing the problem of dynamic code updates in the security analysis of android applications | |
US20140282534A1 (en) | Virtual environment having harvard architecture | |
KR101557455B1 (ko) | 응용 프로그램 코드 분석 장치 및 그것을 이용한 코드 분석 방법 | |
Tan et al. | Where's the" up"?! A Comprehensive (bottom-up) Study on the Security of Arm Cortex-M Systems | |
KR101823226B1 (ko) | 코드 보호 방법 및 시스템 | |
Dong et al. | What did you pack in my app? a systematic analysis of commercial android packers | |
KR101436741B1 (ko) | 프로그램 보안 솔루션 적용 방법 및 시스템 | |
Zhang et al. | Research and implementation of file security mechanisms based on file system filter driver | |
Taubmann | Improving digital forensics and incident analysis in production environments by using virtual machine introspection | |
CN113220314A (zh) | App资源加载及apk生成方法、装置、设备及介质 | |
Shepherd et al. | Trusted Execution Environments | |
US11989291B2 (en) | System, method, and apparatus for software verification | |
Titze | Analysis and Mitigation of Security Issues on Android | |
Jiang et al. | A code protection scheme via inline hooking for Android applications | |
Busch | On the Security of ARM TrustZone-Based Trusted Execution Environments |
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 |