首页> 中国专利> 一种手机应用软件自动生成水印的方法和系统

一种手机应用软件自动生成水印的方法和系统

摘要

本发明涉及一种手机应用软件自动生成水印的方法和系统,所述方法包括:水印产生步骤,给指定图片产生一个ASCII字符图片,模糊并分割该ASCII字符图片,将分割的每一部分ASCII字符图片映射为一段代码,形成水印代码;水印插入步骤,通过指定事件序列获取手机应用程序的执行路径,将执行路径中仅有一个入口点和一个出口点的程序序列作为基本块,选取仅执行一次的基本块,在该基本块的原始代码中随机插入水印代码;水印提取步骤:使用相同的事件序列运行手机应用程序,扫描手机应用程序的内存,并从内存中定位水印,再提取水印进行验证。本发明的水印构建方式独特,且不易被识别,能有效地识别重组软件,保护手机应用软件。

著录项

  • 公开/公告号CN103824006A

    专利类型发明专利

  • 公开/公告日2014-05-28

    原文格式PDF

  • 申请/专利权人 中国科学院信息工程研究所;

    申请/专利号CN201410089718.2

  • 发明设计人 陈恺;赵险峰;张颖君;

    申请日2014-03-12

  • 分类号G06F21/16;

  • 代理机构北京轻创知识产权代理有限公司;

  • 代理人杨立

  • 地址 100093 北京市海淀区闵庄路甲89号

  • 入库时间 2024-02-19 23:58:24

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2016-06-29

    授权

    授权

  • 2014-06-25

    实质审查的生效 IPC(主分类):G06F21/16 申请日:20140312

    实质审查的生效

  • 2014-05-28

    公开

    公开

说明书

技术领域

本发明涉及手机应用软件保护领域,特别是针对安卓应用软件和ios应 用软件,涉及的一种手机应用软件自动生成水印的方法和系统。

背景技术

智能手机已经成为人们日常生活中很普遍的工具,很多传统计算机的应 用也已经转移到智能手机上,例如社交网络,游戏等。因此,智能手机应用 软件的安全也日益重要。

安卓应用软件和ios应用软件目前在智能手机应用软件中占有很大比 例,其面临多种威胁,其中包括重组,即添加恶意负载或广告给合法的应用 软件并形成新的重组软件。攻击者经常使用重组的方法,因为该方法需要修 改的内容很少。当前的研究显示15%的安卓市场应用软件都是重组的软件。 由于普通用户无法区分合法软件和重组的软件,因此攻击者重组软件后被查 出的可能性很小。

现有的检测手机市场中重组软件的技术主要包括基于图的方法和基于 哈希的方法。但是,当软件中存在模糊技术时,检测率是低的。模糊技术主 要包括对控制流和数据流进行转换,使现有技术难于检测出重组的软件。因 此,考虑新的方法,检测出非法的重组软件,保护软件版权及用户使用的安 全性是非常有必要的。

在手机应用软件中加入水印可以有效解决这个问题。通过从应用软件中 提取水印,可以识别出应用软件的拥有者,并对重组的软件进行有效判定。 通常有两种水印方法:静态水印和动态水印。静态水印是将数据或变量插入 到应用程序中,一旦水印被破坏,便不能从目标应用软件中提取正确的水印。 动态水印使用运行信息作为水印,例如路径和内存状态,但是构建水印的动 态信息容易被识别。

结合动态水印和静态水印的特点,本发明提出了一种新的手机应用软件 自动生成水印方法。

发明内容

本发明所要解决的技术问题是提供一种手机应用软件自动生成水印方 法,用于解决识别手机应用软件的重组软件的问题。

本发明解决上述技术问题的技术方案如下:一种手机应用软件自动生成 水印的方法,包括:

水印产生步骤:给指定图片产生一个ASCII字符图片,模糊并分割该 ASCII字符图片,将分割的每一部分ASCII字符图片映射为一段代码,将每 段代码作为水印代码的一个片段,形成水印代码;

水印插入步骤:通过指定事件序列获取手机应用程序的执行路径,将执 行路径中仅有一个入口点和一个出口点的程序序列作为基本块,选取仅执行 一次的基本块,在该基本块的原始代码中随机插入水印代码;

水印提取步骤:使用与水印插入步骤相同的事件序列运行手机应用程 序,扫描手机应用程序的内存,并从内存中定位水印,再提取水印进行验证。

在上述技术方案的基础上,本发明还可以做如下改进。

进一步,所述水印产生步骤还包括:在分割ASCII字符图片前,随机选 择ASCII字符图片中的一部分字符,并将其随机放入分割成的各部分ASCII 字符图片中。

进一步,模糊ASCII字符图片的方法具体包括:在不影响图片识别的情 况下,在原始ASCII字符图片的空白区域加入若干与原始ASCII字符图片不 相关的字符。

进一步,所述步骤2插入水印代码后,采用适用的常量对水印代码进行 变形,且在变形后的水印代码中创建新的语句,使变形后的水印代码与原始 水印代码间的语义不变。

进一步,所述步骤2插入水印代码后,采用运行时发生变化的变量对水 印代码进行变形。

进一步,所述步骤1中,在水印代码的开始处插入标志位,该标志位用 于表示水印的开始;所述步骤3中定位水印时,检查内存中所有对象,若对 象中带有插入的标志位,则此对象为水印。

对应地,本发明的技术方案还包括一种手机应用程序自动生成水印的系 统,包括依次连接的水印产生模块、水印插入模块和水印提取模块:

所述水印产生模块,用于给指定图片产生一个ASCII字符图片,模糊并 分割该ASCII字符图片,将分割的每一部分ASCII字符图片映射为一段代码, 将各段代码叠加,形成水印代码;

所述水印插入模块,用于通过指定事件序列获取手机应用程序的执行路 径,将执行路径中仅有一个入口点和一个出口点的程序序列作为基本块,选 取仅执行一次的基本块,在该基本块的原始代码中随机插入水印代码;

所述水印提取模块,用于使用与所述水印插入模块中相同的事件序列运 行手机应用程序,扫描手机应用程序的内存,并从内存中定位水印,再提取 水印进行验证。

进一步,所述水印产生模块还用于:在分割ASCII字符图片前,随机选 择ASCII字符图片中的一部分字符,并将其随机放入分割后成的各部分 ASCII字符图片中。

进一步,所述水印插入模块插入水印代码后,采用适用的常量对水印代 码进行变形,且在变形后的水印代码中创建新的语句,使为变形后的水印代 码与原始水印代码间的语义不变。

进一步,所述水印插入模块插入水印代码后,采用运行时发生变化的变 量对水印代码进行变形。

本发明的有益效果是:本发明通过对图片的内在特征进行提取,形成 ASCII格式图片,对其进行模糊与分割,并将图中的每一部分映射为一段代 码,形成水印代码嵌入到原始代码中;在嵌入过程中,通过指定输入事件序 列,选择必经执行路径上的基本块进行插入,并对代码中的常量与变量进行 一定的变形,保证其不被恶意用户识别并替换;最后在水印验证过程中,可 以通过特殊标识有效识别水印部分并进行比较,对软件进行保护。本发明在 手机应用软件中加入了特殊构建的水印,水印构建方式独特,且不易被识别, 能有效地识别重组软件,保护手机应用软件。

附图说明

图1为本发明普通图片和ASCII字符图片的示例图;

图2为本发明手机应用软件自动生成水印的流程示意图;

图3为本发明手机应用软件自动生成水印的系统的结构示意图

图4为本发明ASCII字符图片的模糊与分割示例图。

具体实施方式

以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本 发明,并非用于限定本发明的范围。

为了在手机应用软件中加入好的水印,需要满足如下条件:1)通过语 义保留的变形,代码不容易被破坏。一般不需要考虑变形会破坏语义,因为 攻击者也希望重组后的软件能正常运行。2)代码不能被轻易识别,即添加 的代码没有特别之处。3)水印不容易被识别,否则攻击者会通过监控应用 软件来去掉相应的水印。

针对上述条件,本实施例设计了一种手机应用软件自动生成水印的方法 来满足上述要求,该方法是一种基于图片的水印方法。为了满足条件1),该 方法不直接使用应用程序中的静态代码或数据作为水印;为了满足条件2), 该方法尽量使用原来应用程序中的代码和数据结构,将这些代码与水印代码 结合;为了满足条件3),该方法并不使用一般格式的图片,而是使用ASCII 格式。如图1所示,给出了将普通图片转换成ASCII字符格式的图片的过程, ASCII字符格式的图片并非文件格式的图片,即使几个字符被篡改,两个图 片仍是可比较的,从而将ASCII水印图片加入到原始应用中,不容易被识别 出。

如图2所示,本实施例的主要流程分为水印产生步骤、水印插入步骤和 水印提取步骤。

水印产生步骤:给指定图片产生一个ASCII字符图片,模糊并分割该 ASCII字符图片,将分割的每一部分ASCII字符图片映射为一段代码,将每 段代码作为水印代码的一个片段,形成水印代码。本实施例的水印使用图片, 但是需要将图片原始格式进行转换,即产生一个ASCII字符图片轮廓,且为 了使得水印更强健,还需将轮廓分成几部分,不同部分将共享一些冗余信息。 通过这种方式,即使部分水印被篡改了,仍然可以判断应用程序中的水印是 否与原作者提供的相同。另外,该方法可以自动产生一些代码,在内存中动 态地画图,轮廓中的每一部分都对应于代码的一个片段。

水印插入步骤:通过指定输入事件序列获取手机应用程序的执行路径, 将执行路径中仅有一个入口点和一个出口点的程序序列作为基本块,选取仅 执行一次的基本块,在该基本块的原始代码中随机插入水印代码。在实际运 用中,不能直接将代码和应用程序组合在一起,因为水印的代码可能会无法 运行。因此,为了让水印代码正常运行,需要将其插入一定会运行的路径中, 而在提取水印过程中,原始作者也可以使用自己秘密的“输入”来触发相应 代码的运行。与运行在X86平台上的传统应用程序相比,手机应用程序多由 事件驱动。本实施例随机产生一系列事件序列作为秘密“输入”,获取相应 执行路径,然后依据输入将相应代码加入执行路径中。

水印提取步骤:使用指定输入事件序列运行手机应用程序,扫描手机应 用程序的内存,并从内存中定位水印,再提取水印进行验证。需要验证应用 程序的水印时,首先从应用程序中提取出来,即使用作者提供的秘密“输入” (如事件序列)来运行应用程序,然后扫描内存并获取水印。当提取出水印 后,将其与作者提供的水印做比较,如果相同,则证明软件是被重组的。需 要补充说明的是,本实施例中不需要两个水印完全相同。因此,即使图片的 一些部分被损坏,通过人眼或文本比较工具对ASCII相似性进行比较,进而 识别水印,来保护原始作者的版权。

对应地,如图3所示,本实施例也给出了一种手机应用程序自动生成水 印的系统,包括依次连接的水印产生模块、水印插入模块和水印提取模块:

所述水印产生模块,用于给指定图片产生一个ASCII字符图片,模糊并 分割该ASCII字符图片,将分割的每一部分ASCII字符图片映射为一段代码, 将每段代码作为水印代码的一个片段,形成水印代码;

所述水印插入模块,用于通过指定事件序列获取手机应用程序的执行路 径,将执行路径中仅有一个入口点和一个出口点的程序序列作为基本块,选 取仅执行一次的基本块,在该基本块的原始代码中随机插入水印代码;

所述水印提取模块,用于使用与所述水印插入模块中相同的事件序列运 行手机应用程序,扫描手机应用程序的内存,并从内存中定位水印,再提取 水印进行验证。

基于上述基本原理,本实施例具体的实施过程如下。

一、水印产生过程

水印产生过程主要是通过给图片产生一个ASCII字符型“草图”,进而 对草图进行模糊与分割,最后将草图的每一部分映射为一段代码产生水印, 准备加入到软件中。

(1)首先,由于文件格式的图片容易被识别,因此直接使用ASCII字 符来表示图片,产生的ASCII图片被称作“草图”。本实施例中主要通过使 用Textaizer Pro软件给指定图片产成不同类型的ASCII图片,同时可以通 过修改一些参数来改变ASCII图片的大小。因此在操作过程中是可以控制草 图的尺寸的,小的草图不容易被发现,但是当执行水印验证时,很难与原始 图片进行比对。从而,在不同情况下选择不同大小的草图。

(2)其次,为了使得水印更强健,采用如下两种技术:

(a)草图模糊。图片有一个特殊的特征,如果两个图片并非具有完全 相同的字符序列,但是可能表示相同的意义。因此,可以对草图进行模糊, 通过在原始草图中加入一些字符,在不影响模糊的草图识别情况下,在草图 的空白区域加入一些不相关的字符。图4显示了草图模糊的例子,以“secret  words”作为示例,左边最下图是原始图片草图模糊后的,与原始轮廓比较, 模糊的草图包含更多的字符。

(b)草图分割。通过将草图划分为几个部分,每两部分有一些冗余的 字符。即使划分的部分中一些被篡改,仍然可以将草图作为水印与原始图片 进行比较。为了划分草图,可随机选择草图中的一部分字符,并将其放入不 同部分。通过将分割的草图进行叠加,可以恢复水印。如图4所示,右边的 图片即为进行草图分割后的三个部分,将其叠加可恢复水印。

(3)最后,通过将草图的每一部分映射到一段代码,然后将代码叠加 到原始应用软件代码中,获取一个带水印的应用程序。该方法使用一维数组 来描述每一部分,使用数组中每个元素(如一个字节)来描述此部分中的一 个字符。但是这样数组可能很大,容易被攻击和发现。因此,可以将上面所 述“草图分割”划分图片的一部分分为多个片段,并使用多个数组来描述这 些部分,再移除数组中的回车符和换行符,因此,攻击者在不知道每一行中 字符数量的情况下,很难重组水印图片。但是对于编程人员,因为知道数量, 因此可以重建图片进行验证。

下面以例1进行说明。

例1:

上例中,水印是长度为500,并且定义了一个500字节的数组。在循环 中,将一部分“Array1”放入水印中。“Array1”对应水印的一部分。通过 获取Array1在原始水印的起始位置,当一部分代码被执行时,部分水印就 构建了。当代码的所有部分被执行,就可以看到内存中的一个完整水印。

二、水印插入过程

将水印代码插入到原始应用程序过程中,需要保证所有的水印代码能被 执行,否则无法提取内存中的水印进行比较。本实施例设计了一个基于事件 的插入方法,该方法通过获取一个确保运行的执行路径,并将水印代码插入 该路径。

(1)执行路径产生。与运行在X86平台上的传统应用程序不同,手机 应用程序多由事件驱动。如果直接从手机应用程序的起点获取执行路径,路 径的长度可能不足以插入水印。因此,通过随机产生一系列事件(如点击等), 使用这个事件序列作为手机应用程序的输入,并获取执行路径。通过这种方 式,无论在任何时间输入这个事件序列,应用程序的执行路径都是相同的。 因此当提取水印时需要使用相同的事件序列。

(2)基本块选择。在一个执行路径中存在很多基本块。一个基本块指 仅有一个入口点(第一条语句)和一个出口点(最后一条语句)的程序语句 序列,但并非所有的基本块都适合加入水印代码,因为有些基本块在执行路 径中执行多次,因此如果将水印加入这些基本块,则会执行多次。因此,需 要将执行多于一次的基本块进行剔除,选择只执行一次的基本块。

(3)水印代码插入。在执行路径中选择合适的基本块之后,将水印随 机插入选取的基本块的原始代码中。当应用程序执行一个指定的事件序列, 水印将存入内存中并可以执行。

(4)水印代码的转换。由于传统水印代码与应用程序的代码没有任何 关系,因此攻击者容易将其分离,水印不够健壮。本实施例通过分析原始应 用程序中常量与变量,增加水印代码和原始代码的相关性。

(a)语义保存的变形。对于水印中的任一字节b和任一常量c,我们使 用抵消语句来用c表达b。

下面以例2进行说明。

例2:

例2中,原始的水印代码如例1所示,将其进行变形。首先,改变Array1 中的几个字节(举例中的第1,第2个字节)。然后在水印代码最后增加两个 新的语句(pw.array[base]+=c和pw.array[base+1]-=c),其中c=0x30, 可知变形后的Array1中前2个字节为;0x39+0x30=0x69,0xA3-0x30=0x73。 由此可知,这两个新加的语句使得Array1与原始应用程序中的代码一致, 从而通过创建了原始代码和水印代码的关系来保持水印代码的语义不变。当 然,除了使用了加操作和减操作,也可以使用乘等。

(b)语义破坏的变形。如果仅采用适用常量来对水印代码进行变形, 通过分析任何两个变量之间的依赖性和只用到常量的代码,攻击者还是能识 别出。因此,需要使用运行时发生变化的变量来解决这个问题,即直接使用 一个二维操作来混合水印中的一个字符和一个变量。例如,增加一个语句 pw.array[base]+=v到原始代码中,其中v是一个原始应用程序中的变量。 因此pw.array[base]不再是原始的值,使得水印发生了改变。但是水印是一 个图片,仅改变几个字符并不会影响比较。与以前的方法不同,原始水印和 提取的水印不需要完全相同,具体比较过程在水印提取过程中进行介绍。

三、水印提取过程

当怀疑一个应用软件是重组软件时,可以提取其中的水印并与原始作者 提供的水印进行比较。由于本实施例提供的水印是一种动态水印验证,只有 当应用程序运行指定事件序列为输入时,才能在在内存中读取并提取水印进 行验证。

提取水印中的一个困难是定位包含水印的数组(例1中的“pw”)位置。 如果一个应用程序没有改变可以识别在水印上的操作语句。因为应用程序可 能被模糊,方法的指令和变量的名字被改变,因此不能直接定位水印,需要 使用特殊的标志位。从而在水印产生过程中,在水印代码的开始处插入一个 标志位,用于表示水印的开始,该标志位可以是应用程序中唯一的字符,例 如可以使用0XFFEEFEF8作为标志位。当要定位水印时,列举所有的对象, 并检查这些对象的最前面的几个字符。如果找到对象的标志位,此对象即为 水印。注意不同的应用程序有不同的标志位。这些标志位最好是秘密的字符, 否则攻击者可能定位水印并篡改它。

当然,原始作者也需要提供水印的一维信息,如一行中的字符数。否则, 水印仅是一维的数组,不能直接转换到图片中。这也是攻击者即使获得数组, 也不容易识别水印内容的原因。然后可以将提取的水印与原始作者提供的水 印做比较。比较过程可以直接通过人眼或文本比较工具对ASCII相似性进行 比较,进而识别水印,如果相似,确定是重组的应用程序,实现对软件版权 的保护。

以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明 的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发 明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号