一种数据的处理方法和装置与流程

文档序号:20770013发布日期:2020-05-15 19:33阅读:226来源:国知局
一种数据的处理方法和装置与流程

本申请涉及计算机技术领域,尤其涉及一种数据的处理方法和装置。



背景技术:

随着网络技术的不断发展,通过网络发布信息已成为人们进行信息发布的重要手段,例如某企业或组织可以开发某功能的应用程序,并将该应用程序通过网络发布,以供用户使用该应用程序中的功能完成相应的业务等。而对于通过网络发布的应用程序主要是由程序语言编写的程序代码构成,当前,构成应用程序的源代码和相应的资源文件是相应企业或组织的重要财富,相应的企业或组织都很重视对应用程序的程序内容的保护。

为了对应用程序的程序内容进行保护,通常会采用对其中的代码进行混淆的方式处理,具体地,通过混淆器将应用程序的代码中的应用逻辑相关的内容(可以包括如界面排布的相关内容、不同界面之间跳转的相关内容、给用户显示的内容和相应的时间等)进行重新组织和处理,使得处理后的代码与处理前的代码具有相同的功能,而混淆后的代码却很难被反编译。被混淆的代码,仍然遵照原来的格式和指令集,执行结果也与混淆前的代码的执行结果相同。并且,在缺乏相应的函数名和程序注释的情况下,即使被反编译,也将难以阅读,因此也就很难得出应用程序的真正语义。但是,应用程序的代码中不仅仅包含应用逻辑,还包含字符串,用于展示提供给用户的文本、记录应用程序运行状态的日志信息、应用程序获取数据的后台网址等,在进行上述混淆的过程中,字符串始终都是易于阅读或易于理解的形式,如若源代码中包含字符串“用户密码为123”,则经过后续的编译等处理,应用程序中仍然会包含“用户密码为123”。而字符串的内容对于应用程序也同样重要,而且也同样需要被保护,而如何对字符串的内容进行保护成为需要解决的重要问题。



技术实现要素:

本申请实施例的目的是提供一种数据的处理方法和装置,以提供一种对字节码文件中的字符串进行保护的技术方案。

为实现上述技术方案,本申请实施例是这样实现的:

本申请实施例提供的一种数据的处理方法,所述方法包括:

获取待处理的源代码文件;

对所述源代码文件进行编译处理,得到相应的字节码文件;

基于预定的字节码处理规则对所述字节码文件中的预定字符串进行处理,得到处理后的字节码文件,其中,所述处理后的字节码文件中的预定字符串为经加密处理的密文,所述处理后的字节码文件中包含解密所述密文相关的字节码数据;

基于所述处理后的字节码文件生成相应的程序文件。

本申请实施例提供的一种数据的处理装置,所述装置包括:

代码文件获取模块,用于获取待处理的源代码文件;

编译模块,用于对所述源代码文件进行编译处理,得到相应的字节码文件;

字符串处理模块,用于基于预定的字节码处理规则对所述字节码文件中的预定字符串进行处理,得到处理后的字节码文件,其中,所述处理后的字节码文件中的预定字符串为经加密处理的密文,所述处理后的字节码文件中包含解密所述密文相关的字节码数据;

程序文件生成模块,用于基于所述处理后的字节码文件生成相应的程序文件。

由以上本申请实施例提供的技术方案可见,本申请实施例通过获取待处理的源代码文件,并对该源代码文件进行编译处理,得到相应的字节码文件,基于预定的字节码处理规则对该字节码文件中的预定字符串进行处理,得到处理后的字节码文件,其中,处理后的字节码文件中的预定字符串为经加密处理的密文,处理后的字节码文件中包含解密该密文相关的字节码数据,基于处理后的字节码文件生成相应的程序文件,这样,对源代码文件对应的字节码文件统一进行修改,将字节码文件中的预定字符串全部替换为加密处理后密文,提高了信息加工的效率,同时,如果后续有新增加的源代码或字节码,则新增的字节码也会进行加密处理,提高了后续的维护效率。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍。

图1为本申请一种数据的处理方法实施例;

图2为本申请另一种数据的处理方法实施例;

图3为本申请又一种数据的处理方法实施例;

图4为本申请又一种数据的处理方法实施例;

图5为本申请一种数据的处理装置实施例;

图6为本申请另一种数据的处理设备实施例。

具体实施方式

本申请实施例提供一种数据的处理方法和装置。

为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。

实施例一

如图1所示,本申请实施例提供一种数据的处理方法,该方法的执行主体可以为终端设备或服务器,其中,该终端设备可以如个人计算机等终端设备,还可以是如手机或平板电脑等移动终端设备。该服务器可以是一个独立的服务器,还可以是由多个服务器构成的服务器集群等,该服务器可以是某应用程序的发布服务器,也可以是某应用程序的封装的服务器等。该方法可以应用于对应用程序中的文件进行封装或对应用程序中的字符串进行保护等处理中。该方法具体可以包括以下步骤:

在步骤s102中,获取待处理的源代码文件。

其中,源代码文件可以是未编译的,且按照一定的程序设计语言规范书写的文本文件,源代码文件中可以包含一系列可读的计算机语言指令,源代码文件可以是针对需要生成的预定的程序文件而确定的代码文件,其中的程序文件可以是实现某应用程序(或应用软件)整体功能或某个模块功能的源代码及调用素材的集合,例如,对于安卓操作系统中的应用程序,该目标程序文件可以是该应用程序的安装包(即apk格式的安装包)等,对于windows操作系统中的应用程序,该目标程序文件可以是该应用程序的安装包(如exe格式的安装包)等。源代码可以由开发者直接编写,其中的应用逻辑易于阅读,但是无法在任何操作平台运行。开发者使用的编程语言不同,源代码文件可能有所区别。源代码主要用于描述应用程序的应用逻辑,应用逻辑定义了该应用程序应该如何工作,具体可以包括如界面如何排布,不同界面之间如何跳转、何时给用户显示哪些内容等。源代码中除了应用逻辑外,还可以包含字符串,例如展示给用户的文本、用于记录应用程序运行状态的日志信息和应用程序获取数据的后台网址等。对于一个应用程序,从开发者开发的原始文件,到最终提供给用户使用的程序文件之前,需要经过一系列的处理工序。该处理工序中,代码是自始自终都存在的,但在每个阶段存在的格式可能不同。而代码里的内容,在用不同格式表达时,其效用是不变的(例如网址始终表示的是一个网址),但是代码能否执行以及能够执行的平台可能会发生变化。例如,某些格式的代码是开发者能够阅读的,但却无法执行,而某些格式的代码只能在安装有windows操作系统的终端设备上运行,某些格式的代码却只能在安装有android操作系统的终端设备上运行。

在实施中,随着网络技术的不断发展,通过网络发布信息已成为人们进行信息发布的重要手段,例如某企业或组织可以通过网络发布企业或组织的最新动态信息,或者,某企业或组织可以开发某功能的应用程序,并将该应用程序通过网络发布,以供用户使用该应用程序中的功能完成相应的业务等。而对于通过网络发布的应用程序主要是由程序语言编写的程序代码构成,当前,构成应用程序的源代码和相应的资源文件是相应企业或组织的重要财富,相应的企业或组织都很重视对应用程序的程序内容的保护。

为了对应用程序的程序内容进行保护,通常会采用对其中的代码进行混淆的方式处理,具体地,通过混淆器将应用程序的代码中的应用逻辑相关的内容进行重新组织和处理,使得处理后的代码与处理前的代码具有相同的功能,而混淆后的代码却很难被反编译。被混淆的代码,仍然遵照原来的格式和指令集,执行结果也与混淆前的代码的执行结果相同。并且,在缺乏相应的函数名和程序注释的情况下,即使被反编译,也将难以阅读,因此也就很难得出应用程序的真正语义。但是,应用程序的代码中不仅仅包含应用逻辑,还包含字符串,用于展示提供给用户的文本、记录应用程序运行状态的日志信息、应用程序获取数据的后台网址等,在进行上述混淆的过程中,字符串始终都是易于阅读或易于理解的形式,如若源代码中包含字符串“用户密码为123”,则经过后续的编译等处理,应用程序中仍然会包含“用户密码为123”。而字符串的内容对于应用程序也同样重要,而且也同样需要被保护,而如何对字符串的内容进行保护成为需要解决的重要问题。本申请实施例中提供一种对字节码文件中的字符串进行保护的技术方案,具体可以包括以下内容:

应用程序的源代码和资源文件会被打包或封装在该应用程序的程序文件中,技术人员可以根据提供的业务,设置相应的功能,并可以基于设置的功能编写上述源代码和相应的资源文件。而对于源代码中的字符串,由于从源代码到最终生成的程序文件的过程中该字符串的内容均可以很容易得到,从而造成字符串的内容被泄露,使得应用程序处于危险中,甚至可能会造成用户个人信息泄露或用户资源被盗取等,为此,可以对其中的字符串进行加密处理,使得该字符串很难被阅读或理解,从而保护字符串的内容。具体地,当应用程序由技术人员编写完成进行发布之前,或者,需要对某发布的应用程序的程序文件中的字符串进行保护等情况下,可以获取生成程序文件所需的源代码文件,并可以将上述源代码文件作为待处理的源代码文件。

在步骤s104中,对上述源代码文件进行编译处理,得到相应的字节码文件。

其中,字节码文件可以是一种包含执行程序,且由一序列op代码或数据对组成的二进制文件,字节码文件可以包括多种不同的类型,不同类型的字节码的用途或作用可以不同,如源文件为java文件的情况下,字节码文件可以为class文件或dex文件等。

在实施中,考虑到生成程序文件所需的文件中除了源代码文件之外,可能还会包含如第三方提供的代码文件,如果只是对源代码文件中的字符串进行处理,而不对第三方提供的代码文件中的相关字符串进行处理,可能会使得源代码文件中的某些字符串被泄露,为了提高程序文件的安全性,可以对源代码文件编译后的字节码文件进行处理,具体地,在获取到待处理的源代码文件后,可以对该源代码文件进行编译,从而将源代码文件编译为字节码文件,其中,将源代码文件编译为字节码文件的过程中,可以经过一次或多次编译处理,例如,可以由源代码文件经过一次编译得到相应的字节码文件,或者,由源代码文件经过一次编译得到相应的第一字节码文件,再将第一字节码文件进行编译得到第二字节码文件,将上述第一字节码文件或第二字节码文件作为与源代码文件相应的字节码文件,或者,由源代码文件经过一次编译得到相应的第一字节码文件,再将第一字节码文件进行编译得到第二字节码文件,之后,将第二字节码文件进行编译得到第三字节码文件,以此类推,经过多次编译后,可以得到多个字节码文件,可以将多个字节码文件中的任一个字节码文件作为与源代码文件相应的字节码文件等,具体可以根据实际情况设定,本申请实施例对此不做限定。

在步骤s106中,基于预定的字节码处理规则对上述字节码文件中的预定字符串进行处理,得到处理后的字节码文件,其中,处理后的字节码文件中的预定字符串为经加密处理的密文,处理后的字节码文件中包含解密该密文相关的字节码数据。

其中,字节码处理规则可以是针对字节码文件中的全部或部分字符串通过某种方式进行处理的规则,如对字节码文件中包含的全部字符串进行加密处理,并在该字节码文件中设置字符串的解密方式等相关信息。预定字符串可以是字节码文件中预先设定的某些指定字符串,还可以是字节码文件中包含的全部字符串等。

在实施中,可以预先设定字节码文件中需要保护的字符串的信息(包括字符串的标识、位置等),并可以为上述字符串的处理设置相应的字节码处理规则,例如,可以选择一种加密方式和相应的解密方式,然后,可以基于上述的加密方式和解密方式设置相应的字节码处理规则。当通过上述处理得到源代码文件对应的字节码文件后,可以在该字节码文件中查找上述预定字符串,如果在该字节码文件中未查找到预定字符串,则可以确定该字节码文件不需要处理,可以直接进行后续处理。如果在该字节码文件中查找到预定字符串,则可以启动字节码处理规则,对该字节码文件中的预定字符串进行加密处理,得到预定字符串对应的密文。其中,得到的密文可以是难于理解的,从而保护程序文件中的预定字符串。此外,由于程序文件在后续还需要被读取,因此,还需要为预定字符串设置解密方式,并可以基于该解密方式在字节码文件中添加相应的数据,可以包括解密方式的相关数据(如解密方式对应的解密函数的名称等标识的相关数据)、读取密文的方式的相关数据(如先对密文进行解密,然后再读取预定字符串等相关数据)等,具体可以根据实际情况设定,本申请实施例对此不做限定。通过上述处理,即可得到处理后的字节码文件。

需要说明的是,通过字节码处理规则,对该字节码文件中的预定字符串进行加密处理,得到预定字符串对应的密文的处理中,具体可以为提取预定字符串的字节数组,可以对该字节数组中的每个字节进行相应的运算(如进行异或运算等),得到相应的运算结果,该运算结果即可以作为预定字符串对应的密文。在解密该密文时,可以将密文进行与上述运算相反的运算,得到的运算结果即为原字符串等。在实际应用中,上述处理的可实现方式还可以包括多种,上述仅是一种可实现的方式,实际应用中使用何种方式执行上述处理,可以根据实际情况确定,本申请实施例对此不做限定。

在步骤s108中,基于上述处理后的字节码文件生成相应的程序文件。

在实施中,通过上述方式对字节码文件中包含的预定字符串进行处理后,处理后的字节码文件中的预定字符串将很难被阅读或理解,从而程序文件中的预定字符串得到保护。此时,可以基于处理后的字节码文件,通过预定的封装机制对该字节码文件进行封装,以生成相应的程序文件。

本申请实施例提供一种数据的处理方法,通过获取待处理的源代码文件,并对该源代码文件进行编译处理,得到相应的字节码文件,基于预定的字节码处理规则对该字节码文件中的预定字符串进行处理,得到处理后的字节码文件,其中,处理后的字节码文件中的预定字符串为经加密处理的密文,处理后的字节码文件中包含解密该密文相关的字节码数据,基于处理后的字节码文件生成相应的程序文件,这样,对源代码文件对应的字节码文件统一进行修改,将字节码文件中的预定字符串全部替换为加密处理后密文,从而不需要技术人员对源代码中的每一处位置进行人工修改,节省了人工修改的成本,提高了信息加工的效率,同时,如果后续有新增加的源代码或字节码,则新增的字节码也会进行加密处理,提高了后续的维护效率。

实施例二

如图2所示,本申请实施例提供一种数据的处理方法,该方法的执行主体可以为终端设备或服务器,其中,该终端设备可以如个人计算机等终端设备,还可以是如手机或平板电脑等移动终端设备。该服务器可以是一个独立的服务器,还可以是由多个服务器构成的服务器集群等,该服务器可以是某应用程序的发布服务器,也可以是某应用程序的封装的服务器等。该方法可以应用于对应用程序中的文件进行封装或对应用程序中的字符串进行保护等处理中。该方法具体可以包括以下步骤:

在步骤s202中,获取待处理的源代码文件。

上述步骤s202的具体处理过程可以参见上述实施例一中步骤s102的相关内容,在此不再赘述。

在实际应用中,由源代码文件到程序文件的过程中,可以经过一个或多个字节码文件进行转换,例如,可以经过一个字节码文件进行转换,则可以对上述源代码文件进行编译处理,得到相应的字节码文件,然后,可以基于该字节码文件生成相应的程序文件,此外,还可以经过多个字节码文件进行转换,如经过2个、3个或5个字节码文件进行转换等,本申请实施例对此不做限定,以下以经过多个字节码文件进行转换为例,其中的多个可以是2个,则可以参见下述步骤s204~步骤s206的处理。

在步骤s204中,对上述源代码文件进行编译处理,得到第一字节码文件。

在步骤s206中,将第一字节码文件进行编译处理,得到第二字节码文件。

其中,第一字节码文件和第二字节码文件的文件格式可以不同,对上述源代码文件进行编译处理的编译器与对第一字节码文件进行编译处理的编译器可以不同。

需要说明的是,并不是所有的由源代码文件到程序文件的过程都需要经过多个字节码文件进行转换,还可以经过一次字节码文件转换,本申请实施例对此不做限定。

在实际应用中,不论是第一字节码文件还是第二字节码文件均具有指定结构,其中,不同类型的字节码文件所具有的结构可能略有不同,但是,不论是第一字节码文件还是第二字节码文件均具有常量池,常量池中可以包括字节码文件中包含的字符串。

在步骤s208中,通过预定的项目构建工具提供的预定接口,创建相应的转换器,该转换器的输入数据类型为字节码,输出数据类型为字节码。

其中,项目构建工具可以用于管理、排布和调度由源代码文件到程序文件过程中的不同流程或处理。预定接口可以是预先设置的接口,可以用于与某些模块或装置相连接。转换器可以是对某数据进行处理的部件,转换器在使用的过程中可以预先设置输入数据类型和输出数据类型。

在实施中,可以根据实际情况,预先选取一种项目构建工具,通过该项目构建工具可以设置一个接口(即预定接口),并可以通过该预定接口创建一个转换器,可以将字节码处理规则的具体处理过程设置于该转换器中,这样,该转换器可以根据字节码处理规则对字节码文件进行处理。其中,该转换器创建后,需要为该转换器设置输入数据类型和输出数据类型,本实施例中,该转换器的输入数据类型可以为字节码,输出数据类型可以为字节码。

在步骤s210中,将第一字节码文件或第二字节码文件中的预定字符串输入到上述转换器中,以使该转换器基于预定的字节码处理规则对第一字节码文件或第二字节码文件中的预定字符串进行处理,得到处理后的字节码文件,其中,处理后的字节码文件中的预定字符串为经加密处理的密文,处理后的字节码文件中包含解密该密文所需信息的字符串,在预定字符串的读取操作指令之后包含调用解密该密文所需信息的字符串的操作指令,以对预定字符串进行解密。

其中,解密上述密文所需信息的字符串可以包括加密密钥的字符串和解密上述密文所需的函数的标识,如该函数的名称或该函数的索引信息等。读取操作指令可以包括ldc、ldc_w和ldc2_w的指令等。

在实施中,可以选择一种加密方式和相应的解密方式,然后,可以基于上述的加密方式和解密方式设置相应的字节码处理规则。当通过上述处理得到源代码文件对应的字节码文件后,可以在该字节码文件中查找上述预定字符串,查找到预定字符串后,则可以启动字节码处理规则,对该字节码文件中的预定字符串进行加密处理,得到预定字符串对应的密文。其中,得到的密文可以是难于理解的,从而保护程序文件中的预定字符串。此外,由于程序文件在后续还需要被读取,因此,还需要为预定字符串设置解密方式,并可以基于该解密方式在字节码文件中添加相应的数据,具体地,处理后的字节码文件中包含解密该密文所需信息的字符串,在预定字符串的读取操作指令之后包含调用解密该密文所需信息的字符串的操作指令,以对预定字符串进行解密。具体可以根据实际情况设定,本申请实施例对此不做限定。通过上述处理,即可得到处理后的字节码文件。

在步骤s212中,基于处理后的字节码文件生成相应的程序文件。

本申请实施例提供一种数据的处理方法,通过获取待处理的源代码文件,并对该源代码文件进行编译处理,得到相应的字节码文件,基于预定的字节码处理规则对该字节码文件中的预定字符串进行处理,得到处理后的字节码文件,其中,处理后的字节码文件中的预定字符串为经加密处理的密文,处理后的字节码文件中包含解密该密文相关的字节码数据,基于处理后的字节码文件生成相应的程序文件,这样,对源代码文件对应的字节码文件统一进行修改,将字节码文件中的预定字符串全部替换为加密处理后密文,从而不需要技术人员对源代码中的每一处位置进行人工修改,节省了人工修改的成本,提高了信息加工的效率,同时,如果后续有新增加的源代码或字节码,则新增的字节码也会进行加密处理,提高了后续的维护效率。

实施例三

本实施例将结合具体的应用场景,对本发明实施例提供的一种数据的处理方法进行详细的阐述,相应的应用场景为在android操作系统下的应用场景,其中,程序文件可以为apk文件,源代码文件可以是java文件或kotlin文件等,字节码文件可以为class文件或dex文件等。

如图3所示,本申请实施例提供了一种数据的处理方法,该方法的执行主体可以为终端设备或服务器。其中,该终端设备可以如个人计算机等终端设备,还可以是如手机或平板电脑等移动终端设备。该服务器可以是一个独立的服务器,还可以是由多个服务器构成的服务器集群等,该服务器可以是某应用程序的发布服务器,也可以是某应用程序的封装的服务器等。该方法可以应用于对应用程序中的文件进行封装或对应用程序中的字符串进行保护等处理中。该方法具体可以包括以下步骤:

在步骤s302中,获取生成apk文件所需的待处理的源代码文件。

其中,apk文件可以是android操作系统中文件格式为apk的文件,该apk文件通常为android操作系统中的应用程序的安装文件。源代码文件可以由开发者直接编写,其中的应用逻辑易于阅读,但是无法在任何操作平台运行,开发者使用的编程语言不同,源代码文件可能有所区别,用于android应用程序开发的语言一般有java编程语言、kotlin编程语言、groovy编程语言和scala编程语言等,java编程语言编写的源代码文件可以为java文件,kotlin编程语言编写的源代码文件可以为kotlin文件或kt文件,groovy编程语言编写的源代码文件可以为groovy文件,scala编程语言编写的源代码文件可以为scala文件等。

在实施中,可以对已生成的apk文件中的字符串进行处理,具体地,在android操作系统中,可以对该apk文件进行反编译得到相应的源代码文件。此外,还可以在应用程序由技术人员编写完成源代码文件进行发布之前获取其中的源代码文件。

在步骤s304中,对上述源代码文件进行编译处理,得到class文件。

其中,class文件中的字节码可以称为java字节码,源代码经过编译器编译之后,会变成java字节码,java文件可以使用javac编译器,kotlin文件可以使用kotlinc编译器。java文件、kotlin文件、groovy文件和scala文件最终都会编译成为java字节码的class文件。class文件中是由十六进制符号组成的文件,class文件中的十六进制符号组成的长串遵守java虚拟机规范。java虚拟机规范中规定了java虚拟机结构、class文件结构、字节码指令等内容。class文件是由一组以8位字节为基础单位的二进制流构成的文件,其中的各数据项目严格按照顺序紧凑地排列在class文件中,中间没有添加任何分隔符,这使得整个class文件中存储的内容几乎全都是程序需要的数据,没有空隙存在。class文件中存储的数据包括两种:无符号数和表。其中的无符号数属于最基本的数据类型,以u1、u2、u4、u8分别表示1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照utf-8编码构成的字符串值等。其中的表是一种复合数据结构,由无符号数或其他表构成。此外,在class文件中存在集合的概念,集合表示同一类数据项的集合,一般是由一个前置的计数器加若干个连续的同样类型的数据项组成,计数器表示此集合中数据项的个数,数据项表示数据内容。java字节码中的应用逻辑难以被阅读,如果需要阅读和修改java字节码,往往需要借助辅助工具,或者将java字节码转换为源代码。java字节码可以在计算机上的java虚拟机中运行。此外,源代码中的字符串和应用逻辑混杂在一起,分布在源代码文件的任意位置,而java字节码中的字符串位于class文件的一个特定区域,即常量池,常量池通常可以设置于class文件的开头部分。

常量池是一个集合,可以由两部分组成:常量池计数器和常量池。常量池计数器是一个u2的无符号数。常量池紧跟在常量池计数器后面的内容就是该class文件的常量池内容,常量池中存放的数据一般分为两种类型:即字面量和符号引用。其中的字面量是指文本字符串、声明为final的常量值等。其中的符号引用是一个更偏向于编译原理方面的概念,主要包括三类常量:1、类和接口的全限定名;2、字段的名称和描述符;3、方法的名称和描述符。在常量池中的常量共有14种类型,每个常量都是一个表,每一个表都有各自的组成结构。该14个常量有一个公共的特点,就是每个常量开始是一个用u1类型的无符号数表示的标志位,用于表示此常量属于哪种常量类型。

在实施中,在class文件中,应用逻辑部分(如什么时候展示界面等)都变成了难以阅读的二进制形式。如果试图用编辑器打开,其呈现的是乱码。并且目前已经有成熟的工具,把应用逻辑进一步混淆,此时即使逆向转换成源代码,应用逻辑部分也是难以阅读的。而字符串部分则不同,始终都是易于阅读的形式,如果源代码中的一个字符串为‘用户的密码是123’,则在最终的字节码文件的常量池中,该字符串的内容仍为‘用户的密码是123’,因此,为了保护字符串中的内容,可以对class文件中的预定字符串进行处理,具体可以参见下述相关内容。

在步骤s306中,通过预定的项目构建工具gradle提供的预定接口,创建相应的转换器,该转换器的输入数据类型为字节码,输出数据类型为字节码。

其中,gradle可以是一种项目构建工具,该项目构建工具与编译器不同,项目构建工具不具备编译的能力,但却能调用其他工具(如编译器等)实现编译或其他的操作。在生成一个android应用程序的过程中,会包含多个复杂的流程,编译只是其中一个流程,项目构建工具可以管理、排布、调度所有的流程。gradle是android应用程序的构建工具,通过gradle,可以在编译流程中任意的增加或修改某个或多个流程。

在实施中,gradle的转换器是gradle提供的一种接口,开发者能够自行定义一个转换器,通过该转换器能够在原有的编译流程中增加新的步骤。在创建完成转换器后,只需要指定该转换器的输入数据类型和输出数据类型,gradle就会在原有的编译流程中寻找一个合适的位置插入。

基于上述内容,可以开发一个gradle插件,以对原编译流程进行修改,该gradle插件可以具体以下功能:

1、通过gradle提供的接口,创建一个转换器transform。基于此,gradle会将所需要的类型的数据传递给转换器transform,转换器transform可以对传递的数据逐个进行修改,得到输出数据。

2、注册转换器transform的输入数据类型为java字节码,注册转换器transform的输出数据类型为java字节码,即如图4所示,插入在java文件编译成class文件之后,将class文件转换为dex文件之前。

在步骤s308中,将class文件中的预定字符串输入到上述转换器中,以使该转换器基于预定的字节码处理规则对class文件中的预定字符串进行处理,得到处理后的class文件,其中,处理后的class文件中的预定字符串为经加密处理的密文,处理后的class文件中包含解密该密文所需信息的字符串,在预定字符串的读取操作指令之后包含调用解密该密文所需信息的字符串的操作指令,以对预定字符串进行解密。

在实施中,可以根据实际情况,编写一个字符串加密及解密的应用程序,加密方式可以根据实际情况选定,可以为该应用程序提供一个加密密钥,并输入一个字符串,该应用程序就会输出一个经过加密处理的字符串。例如:

其中,encrypt函数的参数可以包括原字符串和加密密钥,encrypt函数可以对任意字符串进行加密处理,并可以返回加密处理后的结果。decrypt函数的参数可以包括加密处理后的字符串和解密密钥,并可以返回解密后的原文。

上述应用程序需要确保:在加密密钥不变的情况下,使用encrypt函数加密处理后的字符串,一定能够使用decrypt函数还原加密处理后的字符串,而且,加密处理后的字符串可读性很差,无法被阅读。

此外,还可以开发一个java字节码修改程序,该java字节码修改程序可以具备以下功能:

1、在class文件中,可以搜索到所有使用字符串的指令。

在实际应用中,可以使用字节码编辑工具读取到所有的字节码指令并逐个遍历。从中可以查找到如下指令:ldc、ldc_w和ldc2_w等。

例如,对于以下java源代码:

经过编译处理后,得到的字节码可以如下:

从中可以查找到如下指令:

ldc#3

上述查找到的指令表示读取常量池中的第三个字符串,即‘helloworld’。

其中,能够实现java字节码编辑的工具包括很多,如javassist、serp、bcel、asm等,上述工具都提供了在字节码中定位特定的结构和对字节码进行修改的能力等。

2、对查找到的使用字符串的指令的位置,进行如下处理:

a、使用上述编写的应用程序,由使用者任意给定一个加密密钥(如加密密钥为password),对常量池中被使用的字符串(即‘helloworld’)进行加密,得到经加密处理后的字符串(如为'?????')。

b、将常量池中被使用的字符串(即‘helloworld’)替换为经加密处理后的字符串(即'?????')。得到的常量池如下:

constantpool:

#1=methodref//java/lang/object."<init>":()v

#2=fieldref//java/lang/system.out:ljava/io/printstream;

#3=string//??????

在常量池末尾新增了两个常量,一个是给定的加密密钥,另一个为解密函数的标识(该标识可根据java语言规范推导出)。

c、最后得到的常量池如下:

需要说明的是,对每个字节码文件,上述处理只需执行一次。

d、将使用该常量的指令的下方,插入调用解密函数的指令,具体如下:

ldc#3

插入调用解密函数的指令后,如下:

ldc#3

ldc#4

invokestatic#5

基于上述内容,该java字节码修改程序能够将常量池中的字符串替换为其它的字符串,其中,需要替换的目标是任何字符串,需要替换的结果由上述编写的应用程序通过加密密钥和输入的原字符串确定。此外,在应用逻辑中,在所有读取常量池的指令后方,插入将读取的该字符串进行解密的指令。

基于上述内容,加密工具只需要根据要求,提供两个对字符串进行处理的函数。函数内容、加密方式、加密密钥的使用方式或进一步隐藏方案均可以根据安全要求程度进行调整。此外,修改的目标是字符串常量池及对字符串常量池的读取操作指令,从而避免了对java源代码中杂乱分布的字符串进行处理。

在步骤s310中,对处理后的class文件进行编译处理,得到dex文件。

其中,dex文件中包含的字节码可以称为android字节码。java字节码在经过dex编译器转换后变为android字节码。android字节码中的应用逻辑同样难以阅读,android字节码可以在android操作系统上运行。此外,dex文件中的字符串位于dex文件的一个特定区域,即常量池,可以位于dex文件的开头。dex文件中除了可以包括文件头外,还包括索引区和数据区,其中,索引区还可以包括字符串的索引、类型的索引、方法原型的索引、域的索引和方法的索引等。数据区还可以包括类的定义区、数据区和链接数据区等。其中的文件头中记录了dex文件的一些基本信息,以及大致的数据分布等。索引区中索引了整个dex文件中的字符串、类型、方法声明、字段以及方法的信息,其结构体的开始位置和个数,均来自dex文件的文件头中的记录(或通过map_list也可以索引到记录)。字符串索引区用于描述dex文件中所有的字符串信息。类型索引区用于描述dex文件中所有的类型,如类类型、基本类型、返回值类型等。方法声明索引区可以用于描述dex文件中所有的方法声明。字段索引区可以用于描述dex文件中所有的字段声明,该结构中的数据全部都是索引值,指明了字段所在的类、字段的类型以及字段名称。方法索引区可以用于描述dex文件中所有的方法,指明了方法所在的类、方法的声明以及方法名称等。

如上所述,源代码、java字节码、android字节码都会包含字符串和应用逻辑两部分,但由于格式不同,字符串存在的位置和形式存在差别。

在步骤s312中,基于dex文件生成相应的apk文件。

在实施中,可以通过预定的打包工具将生成的dex文件、资源文件以及androidmanifest.xml文件等组合成一个应用程序包(即apk文件),其中,androidmanifest.xml文件可以为应用全局配置文件。android操作系统在运行apk文件时,首先需要解压该apk文件,然后,获取编译后的androidmanifest.xml文件中的配置信息,执行dex文件中的程序。

本申请实施例提供一种数据的处理方法,通过获取待处理的源代码文件,并对该源代码文件进行编译处理,得到相应的字节码文件,基于预定的字节码处理规则对该字节码文件中的预定字符串进行处理,得到处理后的字节码文件,其中,处理后的字节码文件中的预定字符串为经加密处理的密文,处理后的字节码文件中包含解密该密文相关的字节码数据,基于处理后的字节码文件生成相应的程序文件,这样,对源代码文件对应的字节码文件统一进行修改,将字节码文件中的预定字符串全部替换为加密处理后密文,从而不需要技术人员对源代码中的每一处位置进行人工修改,节省了人工修改的成本,提高了信息加工的效率,同时,如果后续有新增加的源代码或字节码,则新增的字节码也会进行加密处理,提高了后续的维护效率。

实施例四

以上为本申请实施例提供的数据的处理方法,基于同样的思路,本申请实施例还提供一种数据的处理装置,如图5所示。

所述数据的处理装置包括:代码文件获取模块501、编译模块502、字符串处理模块503和程序文件生成模块504,其中:

代码文件获取模块501,用于获取待处理的源代码文件;

编译模块502,用于对所述源代码文件进行编译处理,得到相应的字节码文件;

字符串处理模块503,用于基于预定的字节码处理规则对所述字节码文件中的预定字符串进行处理,得到处理后的字节码文件,其中,所述处理后的字节码文件中的预定字符串为经加密处理的密文,所述处理后的字节码文件中包含解密所述密文相关的字节码数据;

程序文件生成模块504,用于基于所述处理后的字节码文件生成相应的程序文件。

本申请实施例中,所述处理后的字节码文件中包含解密所述密文所需信息的字符串,在所述预定字符串的读取操作指令之后包含调用解密所述密文所需信息的字符串的操作指令,以对所述预定字符串进行解密。

本申请实施例中,所述解密所述密文所需信息的字符串包括加密密钥的字符串和解密所述密文所需的函数的标识。

本申请实施例中,所述读取操作指令包括ldc、ldc_w和ldc2_w。

本申请实施例中,所述字符串处理模块503,包括:

转换器创建单元,用于通过预定的项目构建工具提供的预定接口,创建相应的转换器,所述转换器的输入数据类型为字节码,输出数据类型为字节码;

字符串处理单元,用于将所述字节码文件中的预定字符串输入到所述转换器中,以使所述转换器基于预定的字节码处理规则对所述字节码文件中的预定字符串进行处理,得到处理后的字节码文件。

本申请实施例中,所述编译模块502,包括:

第一编译单元,用于对所述源代码文件进行编译处理,得到第一字节码文件;

第二编译单元,用于对所述第一字节码文件进行编译处理,得到第二字节码文件;

所述字符串处理模块503,用于基于预定的字节码处理规则对所述第一字节码文件或所述第二字节码文件中的预定字符串进行处理,得到处理后的字节码文件。

本申请实施例中,所述字节码文件为基于源文件为java文件对应的字节码文件,所述字符串处理模块503,包括:

加密单元,用于基于encrypt函数对所述字节码文件中的预定字符串进行加密处理,得到所述密文;

处理单元,用于在所述字节码文件中添加用于解密所述密文的dencrypt函数的标识的字符串,并在所述预定字符串的读取操作指令之后添加调用所述dencrypt函数的操作指令,以得到处理后的字节码文件。

本申请实施例提供一种数据的处理装置,通过获取待处理的源代码文件,并对该源代码文件进行编译处理,得到相应的字节码文件,基于预定的字节码处理规则对该字节码文件中的预定字符串进行处理,得到处理后的字节码文件,其中,处理后的字节码文件中的预定字符串为经加密处理的密文,处理后的字节码文件中包含解密该密文相关的字节码数据,基于处理后的字节码文件生成相应的程序文件,这样,对源代码文件对应的字节码文件统一进行修改,将字节码文件中的预定字符串全部替换为加密处理后密文,从而不需要技术人员对源代码中的每一处位置进行人工修改,节省了人工修改的成本,提高了信息加工的效率,同时,如果后续有新增加的源代码或字节码,则新增的字节码也会进行加密处理,提高了后续的维护效率。

实施例五

基于同样的思路,本申请实施例还提供一种数据的处理设备,如图6所示。

该数据的处理设备可以为上述实施例提供的终端设备或服务器等。

数据的处理设备可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上的处理器601和存储器602,存储器602中可以存储有一个或一个以上存储应用程序或数据。其中,存储器602可以是短暂存储或持久存储。存储在存储器602的应用程序可以包括一个或一个以上模块(图示未示出),每个模块可以包括对数据的处理设备中的一系列计算机可执行指令。更进一步地,处理器601可以设置为与存储器602通信,在数据的处理设备上执行存储器602中的一系列计算机可执行指令。数据的处理设备还可以包括一个或一个以上电源603,一个或一个以上有线或无线网络接口604,一个或一个以上输入输出接口605,一个或一个以上键盘606。

具体在本实施例中,数据的处理设备包括有存储器,以及一个或一个以上的程序,其中一个或者一个以上程序存储于存储器中,且一个或者一个以上程序可以包括一个或一个以上模块,且每个模块可以包括对数据的处理设备中的一系列计算机可执行指令,且经配置以由一个或者一个以上处理器执行该一个或者一个以上程序包含用于进行以下计算机可执行指令:

获取待处理的源代码文件;

对所述源代码文件进行编译处理,得到相应的字节码文件;

基于预定的字节码处理规则对所述字节码文件中的预定字符串进行处理,得到处理后的字节码文件,其中,所述处理后的字节码文件中的预定字符串为经加密处理的密文,所述处理后的字节码文件中包含解密所述密文相关的字节码数据;

基于所述处理后的字节码文件生成相应的程序文件。

本申请实施例中,所述处理后的字节码文件中包含解密所述密文所需信息的字符串,在所述预定字符串的读取操作指令之后包含调用解密所述密文所需信息的字符串的操作指令,以对所述预定字符串进行解密。

本申请实施例中,所述解密所述密文所需信息的字符串包括加密密钥的字符串和解密所述密文所需的函数的标识。

本申请实施例中,所述读取操作指令包括ldc、ldc_w和ldc2_w。

本申请实施例中,所述基于预定的字节码处理规则对所述字节码文件中的预定字符串进行处理,得到处理后的字节码文件,包括:

通过预定的项目构建工具提供的预定接口,创建相应的转换器,所述转换器的输入数据类型为字节码,输出数据类型为字节码;

将所述字节码文件中的预定字符串输入到所述转换器中,以使所述转换器基于预定的字节码处理规则对所述字节码文件中的预定字符串进行处理,得到处理后的字节码文件。

本申请实施例中,所述对所述源代码文件进行编译处理,得到相应的字节码文件,包括:

对所述源代码文件进行编译处理,得到第一字节码文件;

将所述第一字节码文件进行编译处理,得到第二字节码文件;

所述基于预定的字节码处理规则对所述字节码文件中的预定字符串进行处理,得到处理后的字节码文件,包括:

基于预定的字节码处理规则对所述第一字节码文件或所述第二字节码文件中的预定字符串进行处理,得到处理后的字节码文件。

本申请实施例中,所述字节码文件为基于源文件为java文件对应的字节码文件,所述基于预定的字节码处理规则对所述字节码文件中的预定字符串进行处理,得到处理后的字节码文件,包括:

基于encrypt函数对所述字节码文件中的预定字符串进行加密处理,得到所述密文;

在所述字节码文件中添加用于解密所述密文的dencrypt函数的标识的字符串,并在所述预定字符串的读取操作指令之后添加调用所述dencrypt函数的操作指令,以得到处理后的字节码文件。

本申请实施例提供一种数据的处理设备,通过获取待处理的源代码文件,并对该源代码文件进行编译处理,得到相应的字节码文件,基于预定的字节码处理规则对该字节码文件中的预定字符串进行处理,得到处理后的字节码文件,其中,处理后的字节码文件中的预定字符串为经加密处理的密文,处理后的字节码文件中包含解密该密文相关的字节码数据,基于处理后的字节码文件生成相应的程序文件,这样,对源代码文件对应的字节码文件统一进行修改,将字节码文件中的预定字符串全部替换为加密处理后密文,从而不需要技术人员对源代码中的每一处位置进行人工修改,节省了人工修改的成本,提高了信息加工的效率,同时,如果后续有新增加的源代码或字节码,则新增的字节码也会进行加密处理,提高了后续的维护效率。

实施例六

本申请实施例还提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述数据的处理方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。其中,所述的计算机可读存储介质,如只读存储器(read-onlymemory,简称rom)、随机存取存储器(randomaccessmemory,简称ram)、磁碟或者光盘等。

以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1