CN115270115B - 一种边缘应用行为信息采集方法及系统 - Google Patents
一种边缘应用行为信息采集方法及系统 Download PDFInfo
- Publication number
- CN115270115B CN115270115B CN202211177597.8A CN202211177597A CN115270115B CN 115270115 B CN115270115 B CN 115270115B CN 202211177597 A CN202211177597 A CN 202211177597A CN 115270115 B CN115270115 B CN 115270115B
- Authority
- CN
- China
- Prior art keywords
- target
- injection
- determining
- edge application
- injection mode
- 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
- 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/55—Detecting local intrusion or implementing counter-measures
- G06F21/552—Detecting local intrusion or implementing counter-measures involving long-term monitoring or reporting
-
- 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/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Computer Hardware Design (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明涉及一种边缘应用行为信息采集方法及系统,涉及边缘应用行为采集领域,方法包括获取边缘应用的文件IO操作和网络IO操作;分别对所述边缘应用的文件IO操作和所述边缘应用的网络IO操作进行动态字节码插桩,得到目标程序;根据所述目标程序的文件IO操作和所述目标程序的网络IO操作确定边缘应用行为日志。本发明能够完整收集边缘应用日志信息,从而实现边缘应用行为监测。
Description
技术领域
本发明涉及边缘应用行为采集领域,特别是涉及一种边缘应用行为信息采集方法及系统。
背景技术
由于边缘应用的异常行为更偏向于对于数据的窃取,不涉及危险系统调用,而是由一系列的正常流程组成的隐蔽的危险行为,因此传统的异常检测手段难以识别出边缘应用的异常。而边缘应用的本质还是java应用,为了实现对该应用异常行为的监控,可以在应用进行关键方法调用前和调用后,插入执行一部分用于记录操作的代码。但java中的双亲加载机制保护了java核心类库不会被第三方代码覆盖掉,因此需要直接对字节码进行修改,为了不影响边缘应用的正常运行,并根据不同类型方法注入相应字节码。
字节码增强技术提供了一种动态修改字节码的方法。字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。在实际应用中,字节码增强技术需要利用Java Instrument技术。Instrument是JVM提供的一个可以修改已加载类的类库,专门为Java语言编写的插桩服务提供支持。它需要依赖JVMTI的Attach API机制实现。在JDK 1.6以前,Instrument只能在JVM刚启动开始加载类时生效,而在JDK 1.6之后,Instrument支持了在运行时对类定义的修改。要使用Instrument的类修改功能,需要实现它提供的ClassFileTransformer接口,定义一个类文件转换器。接口中的transform方法会在类文件被加载时调用,而在transform方法里,可以对传入的字节码进行改写或替换,生成新的字节码数组后返回。这是一类合法的利用Java ClassLoader修改代码的方式。但是现有的方法无法自主确认字节码注入位置。对于不同的Java方法,其关键方法体的位置是不同的,例如通常的java方法体能够直接找到,而native方法体位于动态连接库中。另外也无法自主确认字节码注入方式。Java的通常方法和native方法在字节码中的表现是不同的,针对这两种方法需要不同的处理方式。
发明内容
本发明的目的是提供一种边缘应用行为信息采集方法及系统,通过完整收集边缘应用日志信息,从而实现边缘应用行为监测。
为实现上述目的,本发明提供了如下方案:
一种边缘应用行为信息采集方法,包括:
获取边缘应用的文件IO操作和网络IO操作;
分别对所述边缘应用的文件IO操作和所述边缘应用的网络IO操作进行动态字节码插桩,得到目标程序;
根据所述目标程序的文件IO操作和所述目标程序的网络IO操作确定边缘应用行为日志。
可选地,所述分别对所述边缘应用的文件IO操作和所述边缘应用的网络IO操作进行动态字节码插桩,得到目标程序,具体包括:
将所述边缘应用的文件IO操作和所述边缘应用的网络IO操作的注入地址进行记录,确定注入字节码的目标位置;
根据所述注入字节码的目标位置和json配置文件生成CtMethod方法;
调用所述CtMethod方法进行字节码动态修改,得到注入字节码框架;
根据所述注入字节码框架和所述json配置文件确定目标方法类型;
根据所述目标方法类型确定注入方式;所述注入方式包括第一注入方式、第二注入方式和第三注入方式;
根据所述目标方法类型和所述注入方式确定目标程序。
可选地,所述根据所述目标方法类型确定注入方式,具体包括:
判断所述目标方法类型是否为native方法,得到第一判断结果;
若所述第一判断结果为否,则根据所述目标方法类型和所述json配置文件确定目标类的方法体并根据所述目标类的方法体确定第一注入方式;所述第一注入方式为利用字节码增强在所述方法体的首尾注入所述注入字节码框架;
若所述第一判断结果为是,则判断所述目标方法类型的方法是否已被加载,得到第二判断结果;
若所述第二判断结果为是,则根据所述目标方法类型和所述json配置文件确定所有目标方法并根据第一目标方法确定第二注入方式;所述第一目标方法为所有目标方法中调用所述native方法的方法;所述第二注入方式为利用字节码增强在所述第一目标方法的方法体的首尾注入所述注入字节码框架;
若所述第二判断结果为否,则根据所述目标方法类型和所述json配置文件确定第二目标方法;
根据所述第二目标方法确定第三注入方式。
可选地,所述根据所述第二目标方法确定第三注入方式,具体包括:
分别在所述第二目标方法的前后设置prefix方法得到修改后的第二目标方法;
分别在所述修改后的第二目标方法的前后生成已签名的通常方法和编译,得到编译后的目标方法;
根据所述编译后的目标方法确定第三注入方式;所述第三注入方式为利用字节码增强在所述编译后的目标方法的方法体的首尾注入所述注入字节码框架。
一种边缘应用行为信息采集系统,包括:
获取模块,用于获取边缘应用的文件IO操作和网络IO操作;
动态字节码插桩模块,用于分别对所述边缘应用的文件IO操作和所述边缘应用的网络IO操作进行动态字节码插桩,得到目标程序;
边缘应用行为日志确定模块,用于根据所述目标程序的文件IO操作和所述目标程序的网络IO操作确定边缘应用行为日志。
可选地,所述动态字节码插桩模块,具体包括:
注入字节码的目标位置确定子模块,用于将所述边缘应用的文件IO操作和所述边缘应用的网络IO操作的注入地址进行记录,确定注入字节码的目标位置;
生成子模块,用于根据所述注入字节码的目标位置和json配置文件生成CtMethod方法;
字节码动态修改子模块,用于调用所述CtMethod方法进行字节码动态修改,得到注入字节码框架;
目标方法类型确定子模块,用于根据所述注入字节码框架和所述json配置文件确定目标方法类型;
注入方式确定子模块,用于根据所述目标方法类型确定注入方式;所述注入方式包括第一注入方式、第二注入方式和第三注入方式;
目标程序确定子模块,用于根据所述目标方法类型和所述注入方式确定目标程序。
可选地,所述注入方式确定子模块,具体包括:
第一判断单元,用于判断所述目标方法类型是否为native方法,得到第一判断结果;
第一注入方式确定单元,用于若所述第一判断结果为否,则根据所述目标方法类型和所述json配置文件确定目标类的方法体并根据所述目标类的方法体确定第一注入方式;所述第一注入方式为利用字节码增强在所述方法体的首尾注入所述注入字节码框架;
第二判断单元,用于若所述第一判断结果为是,则判断所述目标方法类型的方法是否已被加载,得到第二判断结果;
第二注入方式确定单元,用于若所述第二判断结果为是,则根据所述目标方法类型和所述json配置文件确定所有目标方法并根据第一目标方法确定第二注入方式;所述第一目标方法为所有目标方法中调用所述native方法的方法;所述第二注入方式为利用字节码增强在所述第一目标方法的方法体的首尾注入所述注入字节码框架;
第二目标方法确定单元,用于若所述第二判断结果为否,则根据所述目标方法类型和所述json配置文件确定第二目标方法;
第三注入方式确定单元,用于根据所述第二目标方法确定第三注入方式。
可选地,所述第三注入方式确定单元,具体包括:
修改后的第二目标方法确定子单元,用于分别在所述第二目标方法的前后设置prefix方法得到修改后的第二目标方法;
编译后的目标方法确定子单元,用于分别在所述修改后的第二目标方法的前后生成已签名的通常方法和编译,得到编译后的目标方法;
第三注入方式确定子单元,用于根据所述编译后的目标方法确定第三注入方式;所述第三注入方式为利用字节码增强在所述编译后的目标方法的方法体的首尾注入所述注入字节码框架。
根据本发明提供的具体实施例,本发明公开了以下技术效果:
本发明获取边缘应用的文件IO操作和网络IO操作;分别对所述边缘应用的文件IO操作和所述边缘应用的网络IO操作进行动态字节码插桩,得到目标程序;根据所述目标程序的文件IO操作和所述目标程序的网络IO操作确定边缘应用行为日志。本发明能够完整收集边缘应用日志信息,从而实现边缘应用行为监测。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明提供的边缘应用行为信息采集方法流程图;
图2为Java代码的编译过程示意图;
图3为三种注入方式的注入位置示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明的目的是提供一种边缘应用行为信息采集方法及系统,通过完整收集边缘应用日志信息,从而实现边缘应用行为监测。
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
如图1所示,本发明提供的一种边缘应用行为信息采集方法,包括:
步骤101:获取边缘应用的文件IO操作和网络IO操作。
步骤102:分别对所述边缘应用的文件IO操作和所述边缘应用的网络IO操作进行动态字节码插桩,得到目标程序。
步骤103:根据所述目标程序的文件IO操作和所述目标程序的网络IO操作确定边缘应用行为日志。
步骤102,具体包括:
将所述边缘应用的文件IO操作和所述边缘应用的网络IO操作的注入地址进行记录,确定注入字节码的目标位置。
根据所述注入字节码的目标位置和json配置文件生成CtMethod方法。
调用所述CtMethod方法进行字节码动态修改,得到注入字节码框架。
根据所述注入字节码框架和所述json配置文件确定目标方法类型。
根据所述目标方法类型确定注入方式;所述注入方式包括第一注入方式、第二注入方式和第三注入方式。
根据所述目标方法类型和所述注入方式确定目标程序。
在实际应用中,所述根据所述目标方法类型确定注入方式,具体包括:
判断所述目标方法类型是否为native方法,得到第一判断结果。
若所述第一判断结果为否,则根据所述目标方法类型和所述json配置文件确定目标类的方法体并根据所述目标类的方法体确定第一注入方式;所述第一注入方式为利用字节码增强在所述方法体的首尾注入所述注入字节码框架。
若所述第一判断结果为是,则判断所述目标方法类型的方法是否已被加载,得到第二判断结果。
若所述第二判断结果为是,则根据所述目标方法类型和所述json配置文件确定所有目标方法并根据第一目标方法确定第二注入方式;所述第一目标方法为所有目标方法中调用所述native方法的方法;所述第二注入方式为利用字节码增强在所述第一目标方法的方法体的首尾注入所述注入字节码框架。
若所述第二判断结果为否,则根据所述目标方法类型和所述json配置文件确定第二目标方法。
根据所述第二目标方法确定第三注入方式。其中,所述根据所述第二目标方法确定第三注入方式,具体包括:分别在所述第二目标方法的前后设置prefix方法得到修改后的第二目标方法;分别在所述修改后的第二目标方法的前后生成已签名的通常方法和编译,得到编译后的目标方法;根据所述编译后的目标方法确定第三注入方式;所述第三注入方式为利用字节码增强在所述编译后的目标方法的方法体的首尾注入所述注入字节码框架。
本发明针对当前字节码插桩技术无法根据相关方法类型,自主确认字节码的插入位置和插入方式,从而收集相关边缘应用的行为信息这一问题,设计了一个动态插桩系统。该系统首先在一个java程序(表现为jar包)运行前或者运行时,对内部的字节码进行修改。默认情况下,一个java程序的入口是main函数。而为了方便注入,java提供了一个agent功能,其提供了一个函数agentMain和一个函数premain用于执行一部分代码,本发明利用这个功能来完成具体的注入。对于一个未运行的java程序,premain函数将在main函数之前运行,在此处加载注入框架,对于字节码进行替换。而对于已经运行中的程序,则通过JVM调试功能通过一个socket,将注入框架(jar包)注入该JVM进程,之后agentMain函数会被执行,此时重新装载所有的类来完成字节码注入。
本发明的目的在于为边缘应用程序行为异常检测提供一种行为信息采集的方法,边缘应用是面向数据的特化应用,其正常行为和异常行为主要都是围绕数据本身进行的,最常见的异常行为是窃取数据,这一行为对外表现为IO操作,因此为了实现此类型程序的异常行为检测,核心要关注的就是IO操作,进而对恶意行为进行分析,目的是对边缘应用行为信息进行采集,而为了采集行为信息,就需要采集IO操作,动态插桩系统能够把监测代码插入,从而实现采集IO操作,动态插桩是一种手段,具体分为以下步骤:
步骤100:由上述可知,为了实现边缘应用程序异常行为信息采集,需要重点关注程序的窃取数据行为和具体的IO操作。窃取数据的恶意行为可以分为数据的非法访问和数据的非法传输两种,而这两类反映到底层就是边缘应用的文件IO操作和网络IO操作,从而确定检测边缘应用异常行为时关注的重点目标。
步骤200:基于步骤100的结果,确定了需要重点关注文件IO操作和网络IO操作,接着则需要对所有文件IO操作和网络IO操作进行记录,此处利用注入的动态字节码框架进行记录。因为对于不同的方法,具体修改其字节码的方式是不同的,所以对于不同方法编写相应的json配置文件,标明具体的方法类型,在后续插入监测代码的时候,读取该json文件,根据其具体目标方法类型选择相应的插入方式。本发明根据不同的方法类型,编写相应的json配置文件,字节码动态插装系统将根据配置文件中方法的类型自动选择相应的注入方式,具体如何自动选择字节码注入方式详见扩展1。将字节码框架注入完成后,框架将再次读取json配置文件,重新加载已加载的类,并依据配置文件完成代码的动态修改,动态修改详见扩展2。因为之前是注入一个通用的字节码框架,关键的字节码,例如将IO行为打印至日志的字节码,在框架中是以参数形式存在,这一步读取json配置文件,进一步根据配置文件具体内容,对框架内具体替换的目标字节码进行补充,这一步完成最后的字节码的整体注入工作。
步骤300:基于已经注入字节码并动态修改后的目标程序,主要发挥IO行为监控的部分其实为相关IO操作执行前后的print语句。文件IO操作必定会调用java的io包和nio包,因此在java的io包和nio包中的各具体操作执行前后运行相应的print语句,将该处操作打印至日志中,当边缘应用程序执行该处操作时,则自动会记录在日志中。而网络IO操作必定会调用java的net包,所以本发明在net包中的各关键操作前后加入了相应的print语句,若边缘应用程序执行该处操作,则将该处操作打印至日志中,记录其建立的连接、远端的地址以及每次通讯的内容。最后所有相关的文件IO操作和网络IO操作写入日志中,得到最终的边缘应用行为日志。本发明的目的是实现一个字节码动态插装系统,用于监控记录边缘系统行为,不同于异常行为检测。但是为了检测异常行为,需要收集程序的所有行为,即监控程序行为,这也就是本发明的目的。
步骤300是在完成代码修改后,边缘应用系统调用相关存在IO操作的方法时,注入代码发挥作用的原理。步骤200完成代码注入修改,然后边缘应用系统继续运行,假设此时边缘应用系统某方法即将调用文件IO,由于调用文件IO的话必定要调用java的io包和nio包,步骤200已经提前在java的io包和nio包前后注入了print语句,一旦调用这两个包,就会将此处IO操作打印至日志中,实现对IO操作行为的监控。
扩展1与扩展2均需要通过一个json文件来配置动态注入的方式、位置和内容,插装系统将读取json文件内容,根据各配置字段的实际值,生成相应的字节码注入内容,并注入目标位置,这个配置文件需要指定的字段如表1:
如表1所示,对于每条注入配置,需要设置不执行注入的类,类名称,方法名称,方法参数,执行前注入内容,执行后注入内容,是否为native方法,注入代码依赖的包,是否已加载。在扩展1的选择注入方式时,会读取配置文件中是否为native方法、是否已加载、不执行注入的类、类名称、方法名称、方法参数。扩展2会用到了requirePackages,beforBody和afterBody三个字段。
扩展1:字节码注入方式选择机制
扩展1根据不同的方法类型,选择不同的字节码注入方式;扩展2的不同的函数需要注入不同的字节码内容,有着不同的注入方式,这些都需要使用配置文件来进行配置。
Java方法分为通常方法和native方法,这两种方法编译后的字节码是不同的,因此针对这两种方法需要选择不同的字节码注入方式。
通常方法:此类方法是完全由Java语言编写的方法,其方法体均存在于字节码中。Java的class在load或者reload过程中,只会发生类的卸载、字节码的重新装载和验证和类的重新装载。因此为了修改通常方法的字节码,可以通过字节码的重新装载,注入到原来的代码之中,实现字节码的注入修改。所以,对于通常方法,本发明在classLoader加载该类时,通过字节码增强技术,直接在方法体的首尾注入相关的代码即可。如图2中的add方法,可以在其方法体中插入相应的字节码,来记录一些活动信息。
Native方法:此类方法是通过Jni技术编写的代码,其方法体使用C/C++语言实现,编译后的字节码中没有实际的方法体,因此无法直接在方法体内进行字节码注入。如图2的nativeAdd方法,该方法在字节码中不存在对应的方法体,因此,针对通常方法的字节码修改方法在此不生效。
对于此类方法需要分为已被加载和未被加载两种情况讨论。JVM使用函数的名称参数以及返回类型作为其函数的签名,如图2中的add方法的函数签名就为add:(II)I。一旦一个类被JVM所加载,其所有函数签名就被确定,不可以被更改。即使重加载该类,仍然不能修改这些,否则会被JVM拒绝。而未被加载过的类,则是可以修改函数签名。因此已被加载和未被加载的方法字节码注入方式需要分别进行讨论。
对于还未加载的native方法,JVM提供了native prefix这一解决方案,其方法是在native方法的外层再包上一层带有prefix的普通方法,之后所有调用该native函数的方法查找该native方法地址时,JVM会优先返回带有prefix的通常方法,通过该通常方法完成字节码注入。例如在图2中的nativeAdd方法中设置一个prefix方法,例如hook函数,之后JVM将会生成一个签名了的hook_nativeAdd的通常方法,编译后这个通常方法的方法体将存在于字节码中,而在其他代码调用nativeAdd时,JVM则会依据方法表返回hook_nativeAdd的地址,从而可以在native方法真正方法体前后插入代码。这种注入方式,本文称之为装载前注入,又称native prefix。
对于已经被加载的native方法,即使重新加载,方法的签名并不能发生改变。因此,此时上述注入方法已经不生效了。对于此类已经被加载的native方法,本发明提出了一种新的方法进行注,由于调用native方法的方法一定是通常方法,因此只需要在这个类加载时,对于其中所有调用这个方法前和后作为两个插入点进行注入,接着便可以直接采用上文提到的通常方法字节码注入方式。
三种注入方式均是基于现有的Java Instrument技术,但是此项技术只是提供一个实现字节码注入的工具,本发明创新部分在于对于不同类型的方法设计了不同的注入方式,从而实现对于不同方法内部关键操作的监控。
总体来说,针对三种不同的情况,本发明设计了对应的注入策略,具体三者间的区别如图3:
字节码注入方式的选择取决于方法的类型,在实际的字节码注入的步骤如下:
步骤20021:事先根据要进行字节码注入的目标方法类型,编写好扩展2中提到的json配置文件,注明目标方法类型;目标方法即那些涉及到一些关键数据操作的方法,对于这类方法需要进行监控,监控的手段也即注入监控字节码。
对于不同的方法,方法类型的不同导致无法使用相同的方式完成注入,所以第一步就需要人工确定这些目标方法的类型。
步骤20022:插桩系统读取json配置文件内容,根据isNative、isLoaded等字段的值,判定该目标方法属于上述提到的三种类型中的哪一种,json配置文件是人工用来说明目标方法类型、注入代码内容等的一个文件,注入框架时,读取配置文件,获取目标方法类型,选择注入方式;动态生成代码的时候,读取配置文件中想要插入的代码具体内容,完成框架字节码的修改。若不是native方法,即为通常方法,跳转至步骤20023;若是native方法,且未被加载,跳转至步骤20024;若是native方法,且已被加载,跳转至步骤20025。同时通过配置文件IgnoreClasses字段,过滤那些调用了目标方法但是不需要注入的类。其中判定是否为native方法和是否已加载的具体原理如下,由于native为方法的修饰符,对于是否为native方法,可使用method.getModifiers()接口来判断,method.getModifiers()接口返回值为该方法所有修饰符相加的值,如表2所示。
对于是否为native方法,假设method.getModifiers()返回值为modifier,通过“modifier=(modifier%512)>>8”判断结果值是否为1,该公式首先除以512并取余数,排除了abstract和interface的可能,然后再右移8位,256为2的8次方,进行移位后结果恰好为1,所以若此时结果为1,则是native方法,否则不是native方法。而对于一个方法是否已经加载,则使用java.lang包中的findLoadedClass(name)方法,参数为方法名称,若方法未加载,将返回null,否则已加载。人工判定完成后,会将相关信息写入配置文件。
步骤20023:由步骤20022可知该方法为通常方法,首先读取配置文件中的className、methodName和methodParam,找到目标类中的目标方法,然后在类加载器classLoader加载该方法类时,通过字节码增强技术,直接在方法体的首尾注入相关的字节码即可。其中,相关字节码为字节码框架,即将各类情况的字节码内容写好,关键部位的字节码,例如将IO行为打印至日志的字节码,在框架中是以参数形式存在,后续读取json配置文件进一步替换。字节码增强技术即使用java提供的Instrument的类修改功能,实现它提供的ClassFileTransformer接口,定义了一个类文件转换器,这个转换器中的transform方法在类文件被加载时会被调用,利用这个机制,本发明在transform方法中对传入的字节码框架进行改写和替换,修改为需要注入的字节码,具体注入过程由Instrument完成。Instrument是JVM提供的一个可以修改已加载类的类库,专门为Java语言编写的插桩服务提供支持。它需要依赖JVMTI的Attach API机制实现。在JDK 1.6以前,Instrument只能在JVM刚启动开始加载类时生效,而在JDK 1.6之后,Instrument支持了在运行时对类定义的修改。要使用Instrument的类修改功能,需要实现它提供的ClassFileTransformer接口,定义一个类文件转换器。接口中的transform方法会在类文件被加载时调用,而在transform方法里,可以对传入的字节码进行改写或替换,生成新的字节码数组后返回。这是一类合法的利用Java ClassLoader修改代码的方式。待类文件重新加载后,字节码便成功注入完成。步骤20024、20025的字节码注入方式相同,只是根据不同的目标方法类型,注入至不同的位置。
步骤20024:由步骤20022可知该方法为未加载的native方法,首先读取配置文件中的className、methodName和methodParam,找到目标类中的目标方法,然后在目标方法前后各设置一个prefix方法,例如hook函数,之后JVM将会在目标方法前后各生成一个签名了的通常方法,编译后这个通常方法的方法体将存在于字节码中,接着仅需要对于前后这两个通常方法完成相关字节码注入即可,同步骤20023,从而完成在native方法真正方法体前后插入代码。其中,目标方法为目标方法类型中的方法。
步骤20025:由步骤20022可知该方法为已加载的native方法,而由于所有调用native方法的方法均为通常方法,因此对于这种情况,首先读取配置文件中的className、methodName和methodParam,找到目标类中的目标方法,然后需要先找到所有调用了已加载的native方法的方法,对于这些方法,同步骤20023中的操作,完成相应的字节码注入。其中,寻找的方法包括使用iaea或eclipse等集成开发环境。idea中在该方法声明处点击鼠标右键,点击Find Usages功能,即可看到所有调用了该方法的方法。Eclipse中在该方法声明处点击鼠标右键,点击Open Call Hierarchy功能即可看到调用了该方法的方法。
扩展2:字节码注入内容动态修改机制动态修改的内容就是生成的新内容
步骤20011:在注入字节码框架过程中,对于表示方法或者构造函数参数、方法返回值和其他在插入的代码中可能用到的内容均使用特殊标识符,这些特殊标识符号以“$”开头,不会干扰代码中的其他内容,例如在即将调用文件IO处的代码前插入代码片段“System.out.println("此处调用了"+$1)”。
步骤20012:在注入字节码框架的过程中,会将注入地址进行记录,得到注入字节码的目标文件位置。
步骤20013:读取json配置文件,首先读取requirePackages字段,即注入代码依赖的包,先将后续要注入的代码需要调用的包进行引用,然后读取beforeBody和afterBody字段,即执行前注入内容,执行后注入内容,得到需要注入的代码内容,根据该配置文件生成一个CtMethod方法,CtMethod方法将目标文件里的字节码框架中的标识符与具体内容相联系,例如将步骤100中的“$1”替换为“文件IO”,最终边缘应用程序调用相关代码时,会向日志输出此处调用了文件IO。其中,字节码注入内容动态修改部分只用到了requirePackages,beforBody和afterBody三个字段。
步骤20014:最后调用CtMethod方法中的writeFile(),将需要动态修改的代码写入到class文件中,完成字节码动态修改。
以上步骤均在JVM加载字节码的回调过程中完成,框架会依据以上配置项完成不同内容的字节码注入。
边缘应用的异常行为更偏向于对于数据的窃取,不涉及危险系统调用,而是由一系列的正常流程组成的隐蔽的危险行为,这导致相关的异常行为难以监测。本发明设计了一种面向边缘应用行为信息采集的字节码动态插桩系统,利用边缘应用是Java应用的本质,根据边缘应用类型,进行动态字节码注入,从而解决传统日志系统无法完整收集边缘应用日志信息的问题,能够在应用本身无感知的情况下,收集到边缘应用的关键资源使用数据。对于字节码插桩技术本身无法自主确认字节码注入位置及方式的问题,本发明针对不同的方法类型做了区分,将根据方法类型将字节码使用相应的注入方式插入相应的位置。此处将方法分为通常方法和native方法,对于通常方法,其具体的实现方法体能够直接找到,而对于native方法,则仅能找到该方法的签名,无法找到方法体,其真正的方法体位于对应动态链接库中。在注入方式方面,对于java通常方法,可以在classLoader加载该类时,通过字节码增强技术,在方法体的首尾注入相关的代码。而对于native方法,又分为执行处注入、加载前注入、调用处注入三种方式。本发明将根据需要收集行为信息的相应方法类型,使用对应的注入方式,将字节码加载入相应的位置。对于字节码插桩技术本身无法自主确认字节码注入内容的问题,本发明通过一个json文件来配置动态注入的内容,依据配置文件决定注入内容,对于每条注入配置,设置其所在的类,函数的访问域(是否为private),具体函数签名,函数是否为native函数,注入点与注入代码,以及是否依赖其他包(用于fiximport)。之后在JVM加载字节码的回调中,框架会自动依据以上配置项选择合适的注入方式,完成代码注入。
本发明基于java字节码动态插桩系统,利用JVM的instrument技术,在classLoader加载类时注入了transformer方法对字节码数组进行修改。针对不同类型的程序提供相应的注入方式,实现各种类型方法均可正常完成字节码插桩,最终利用注入的字节码来实现边缘应用行为信息的采集。
本发明还一种与边缘应用行为信息采集方法对应的边缘应用行为信息采集系统,包括:
获取模块,用于获取边缘应用的文件IO操作和网络IO操作。
动态字节码插桩模块,用于分别对所述边缘应用的文件IO操作和所述边缘应用的网络IO操作进行动态字节码插桩,得到目标程序。
边缘应用行为日志确定模块,用于根据所述目标程序的文件IO操作和所述目标程序的网络IO操作确定边缘应用行为日志。
作为一种可选的实施方式,所述动态字节码插桩模块,具体包括:
注入字节码的目标位置确定子模块,用于将所述边缘应用的文件IO操作和所述边缘应用的网络IO操作的注入地址进行记录,确定注入字节码的目标位置。
生成子模块,用于根据所述注入字节码的目标位置和json配置文件生成CtMethod方法。
字节码动态修改子模块,用于调用所述CtMethod方法进行字节码动态修改,得到注入字节码框架。
目标方法类型确定子模块,用于根据所述注入字节码框架和所述json配置文件确定目标方法类型。
注入方式确定子模块,用于根据所述目标方法类型确定注入方式;所述注入方式包括第一注入方式、第二注入方式和第三注入方式。
目标程序确定子模块,用于根据所述目标方法类型和所述注入方式确定目标程序。
作为一种可选的实施方式,所述注入方式确定子模块,具体包括:
第一判断单元,用于判断所述目标方法类型是否为native方法,得到第一判断结果。
第一注入方式确定单元,用于若所述第一判断结果为否,则根据所述目标方法类型和所述json配置文件确定目标类的方法体并根据所述目标类的方法体确定第一注入方式;所述第一注入方式为利用字节码增强在所述方法体的首尾注入所述注入字节码框架。
第二判断单元,用于若所述第一判断结果为是,则判断所述目标方法类型的方法是否已被加载,得到第二判断结果。
第二注入方式确定单元,用于若所述第二判断结果为是,则根据所述目标方法类型和所述json配置文件确定所有目标方法并根据第一目标方法确定第二注入方式;所述第一目标方法为所有目标方法中调用所述native方法的方法;所述第二注入方式为利用字节码增强在所述第一目标方法的方法体的首尾注入所述注入字节码框架。
第二目标方法确定单元,用于若所述第二判断结果为否,则根据所述目标方法类型和所述json配置文件确定第二目标方法。
第三注入方式确定单元,用于根据所述第二目标方法确定第三注入方式。
作为一种可选的实施方式,所述第三注入方式确定单元,具体包括:
修改后的第二目标方法确定子单元,用于分别在所述第二目标方法的前后设置prefix方法得到修改后的第二目标方法。
编译后的目标方法确定子单元,用于分别在所述修改后的第二目标方法的前后生成已签名的通常方法和编译,得到编译后的目标方法。
第三注入方式确定子单元,用于根据所述编译后的目标方法确定第三注入方式;所述第三注入方式为利用字节码增强在所述编译后的目标方法的方法体的首尾注入所述注入字节码框架。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的系统而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本发明的限制。
Claims (6)
1.一种边缘应用行为信息采集方法,其特征在于,包括:
获取边缘应用的文件IO操作和网络IO操作;
分别对所述边缘应用的文件IO操作和所述边缘应用的网络IO操作进行动态字节码插桩,得到目标程序;
根据所述目标程序的文件IO操作和所述目标程序的网络IO操作确定边缘应用行为日志;所述分别对所述边缘应用的文件IO操作和所述边缘应用的网络IO操作进行动态字节码插桩,得到目标程序,具体包括:
将所述边缘应用的文件IO操作和所述边缘应用的网络IO操作的注入地址进行记录,确定注入字节码的目标位置;
根据所述注入字节码的目标位置和json配置文件生成CtMethod方法;
调用所述CtMethod方法进行字节码动态修改,得到注入字节码框架;
根据所述注入字节码框架和所述json配置文件确定目标方法类型;
根据所述目标方法类型确定注入方式;所述注入方式包括第一注入方式、第二注入方式和第三注入方式;
根据所述目标方法类型和所述注入方式确定目标程序。
2.根据权利要求1所述的边缘应用行为信息采集方法,其特征在于,所述根据所述目标方法类型确定注入方式,具体包括:
判断所述目标方法类型是否为native方法,得到第一判断结果;
若所述第一判断结果为否,则根据所述目标方法类型和所述json配置文件确定目标类的方法体并根据所述目标类的方法体确定第一注入方式;所述第一注入方式为利用字节码增强在所述方法体的首尾注入所述注入字节码框架;
若所述第一判断结果为是,则判断所述目标方法类型的方法是否已被加载,得到第二判断结果;
若所述第二判断结果为是,则根据所述目标方法类型和所述json配置文件确定所有目标方法并根据第一目标方法确定第二注入方式;所述第一目标方法为所有目标方法中调用所述native方法的方法;所述第二注入方式为利用字节码增强在所述第一目标方法的方法体的首尾注入所述注入字节码框架;
若所述第二判断结果为否,则根据所述目标方法类型和所述json配置文件确定第二目标方法;
根据所述第二目标方法确定第三注入方式。
3.根据权利要求2所述的边缘应用行为信息采集方法,其特征在于,所述根据所述第二目标方法确定第三注入方式,具体包括:
分别在所述第二目标方法的前后设置prefix方法得到修改后的第二目标方法;
分别在所述修改后的第二目标方法的前后生成已签名的通常方法和编译,得到编译后的目标方法;
根据所述编译后的目标方法确定第三注入方式;所述第三注入方式为利用字节码增强在所述编译后的目标方法的方法体的首尾注入所述注入字节码框架。
4.一种边缘应用行为信息采集系统,其特征在于,包括:
获取模块,用于获取边缘应用的文件IO操作和网络IO操作;
动态字节码插桩模块,用于分别对所述边缘应用的文件IO操作和所述边缘应用的网络IO操作进行动态字节码插桩,得到目标程序;
边缘应用行为日志确定模块,用于根据所述目标程序的文件IO操作和所述目标程序的网络IO操作确定边缘应用行为日志;所述动态字节码插桩模块,具体包括:
注入字节码的目标位置确定子模块,用于将所述边缘应用的文件IO操作和所述边缘应用的网络IO操作的注入地址进行记录,确定注入字节码的目标位置;
生成子模块,用于根据所述注入字节码的目标位置和json配置文件生成CtMethod方法;
字节码动态修改子模块,用于调用所述CtMethod方法进行字节码动态修改,得到注入字节码框架;
目标方法类型确定子模块,用于根据所述注入字节码框架和所述json配置文件确定目标方法类型;
注入方式确定子模块,用于根据所述目标方法类型确定注入方式;所述注入方式包括第一注入方式、第二注入方式和第三注入方式;
目标程序确定子模块,用于根据所述目标方法类型和所述注入方式确定目标程序。
5.根据权利要求4所述的边缘应用行为信息采集系统,其特征在于,所述注入方式确定子模块,具体包括:
第一判断单元,用于判断所述目标方法类型是否为native方法,得到第一判断结果;
第一注入方式确定单元,用于若所述第一判断结果为否,则根据所述目标方法类型和所述json配置文件确定目标类的方法体并根据所述目标类的方法体确定第一注入方式;所述第一注入方式为利用字节码增强在所述方法体的首尾注入所述注入字节码框架;
第二判断单元,用于若所述第一判断结果为是,则判断所述目标方法类型的方法是否已被加载,得到第二判断结果;
第二注入方式确定单元,用于若所述第二判断结果为是,则根据所述目标方法类型和所述json配置文件确定所有目标方法并根据第一目标方法确定第二注入方式;所述第一目标方法为所有目标方法中调用所述native方法的方法;所述第二注入方式为利用字节码增强在所述第一目标方法的方法体的首尾注入所述注入字节码框架;
第二目标方法确定单元,用于若所述第二判断结果为否,则根据所述目标方法类型和所述json配置文件确定第二目标方法;
第三注入方式确定单元,用于根据所述第二目标方法确定第三注入方式。
6.根据权利要求5所述的边缘应用行为信息采集系统,其特征在于,所述第三注入方式确定单元,具体包括:
修改后的第二目标方法确定子单元,用于分别在所述第二目标方法的前后设置prefix方法得到修改后的第二目标方法;
编译后的目标方法确定子单元,用于分别在所述修改后的第二目标方法的前后生成已签名的通常方法和编译,得到编译后的目标方法;
第三注入方式确定子单元,用于根据所述编译后的目标方法确定第三注入方式;所述第三注入方式为利用字节码增强在所述编译后的目标方法的方法体的首尾注入所述注入字节码框架。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211177597.8A CN115270115B (zh) | 2022-09-27 | 2022-09-27 | 一种边缘应用行为信息采集方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211177597.8A CN115270115B (zh) | 2022-09-27 | 2022-09-27 | 一种边缘应用行为信息采集方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115270115A CN115270115A (zh) | 2022-11-01 |
CN115270115B true CN115270115B (zh) | 2023-01-10 |
Family
ID=83757796
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211177597.8A Active CN115270115B (zh) | 2022-09-27 | 2022-09-27 | 一种边缘应用行为信息采集方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115270115B (zh) |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106155892B (zh) * | 2015-04-03 | 2020-12-29 | 腾讯科技(深圳)有限公司 | 判断应用程序测试覆盖范围的方法及程序测试设备 |
CN112579406B (zh) * | 2019-09-29 | 2024-04-05 | 北京京东尚科信息技术有限公司 | 一种日志调用链生成方法和装置 |
CN114297666B (zh) * | 2021-12-31 | 2024-06-07 | 上海安般信息科技有限公司 | 一种基于模糊测试的云部署自动化漏洞挖掘系统 |
CN115080426A (zh) * | 2022-06-28 | 2022-09-20 | 中国工商银行股份有限公司 | 程序文件的检测方法及装置、存储介质和电子设备 |
-
2022
- 2022-09-27 CN CN202211177597.8A patent/CN115270115B/zh active Active
Non-Patent Citations (1)
Title |
---|
The conflict of interest between data sharing and data privacy : a middleware approach;Molema等;《Cape Peninsula University of Technology》;20161231;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN115270115A (zh) | 2022-11-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8464225B2 (en) | Method and system for adaptive, generic code instrumentation using run-time or load-time generated inheritance information for diagnosis and monitoring application performance and failure | |
Felt et al. | Android permissions demystified | |
US8359582B2 (en) | Compiling and inserting code snippets at runtime | |
US11669623B2 (en) | Method for detecting vulnerabilities in software | |
Schütte et al. | Condroid: Targeted dynamic analysis of android applications | |
US8887141B2 (en) | Automatically modifying a native code module accessed from virtual machine bytecode to determine execution information | |
US9645912B2 (en) | In-place function modification | |
EP3495978B1 (en) | Method for detecting vulnerabilities in software | |
CN108763924B (zh) | 一种安卓应用程序中不可信第三方库访问权限控制方法 | |
US20110029953A1 (en) | System and Method for Scalable Handling of Debug Information | |
US20090249021A1 (en) | Method And Systems For Invoking An Advice Operation Associated With A Joinpoint | |
CN117076338B (zh) | 基于kprobe的linux内核动态调试方法及系统 | |
Susskraut et al. | Automatically finding and patching bad error handling | |
CN115270115B (zh) | 一种边缘应用行为信息采集方法及系统 | |
JP2009237610A (ja) | コード変換装置及びコード変換方法 | |
CN112445706A (zh) | 程序异常代码获取方法、装置、电子设备以及存储介质 | |
CN111625225A (zh) | 一种程序指定数据输出方法和装置 | |
US10452534B2 (en) | Asynchronous operation query | |
JP2004094374A (ja) | ロギングシステム | |
Aldrich et al. | Augur: dynamic taint analysis for asynchronous javascript | |
Lawall et al. | Tarantula: Killing driver bugs before they hatch | |
Gregersen | Implications of modular systems on dynamic updating | |
JP2009524877A (ja) | コンパイル時の解釈可能コードエラー検出 | |
Breech et al. | An attack simulator for systematically testing program-based security mechanisms | |
KR102392394B1 (ko) | 함수 요약 정보를 생성하는 보안 취약점 분석 방법 및 이를 포함하는 전자 장치 |
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 |