程序的监控方法及其防御方法以及相关装置的制造方法_2

文档序号:8282627阅读:来源:国知局
"也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措 辞"包括"是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加 一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元 件被"连接"或"耦接"到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在 中间元件。此外,这里使用的"连接"或"耦接"可以包括无线连接或无线耦接。这里使用 的措辞"和/或"包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
[0049] 本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术 术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应 该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中 的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含 义来解释。
[0050] 本技术领域技术人员可以理解,这里所使用的"终端"、"终端设备"既包括无线信 号接收器的设备,其仅具备无发射能力的无线信号接收器的设备,又包括接收和发射硬件 的设备,其具有能够在双向通信链路上,执行双向通信的接收和发射硬件的设备。这种设备 可以包括:蜂窝或其他通信设备,其具有单线路显示器或多线路显示器或没有多线路显示 器的蜂窝或其他通信设备;PCS(Personal Communications Service,个人通信系统),其可 以组合语音、数据处理、传真和/或数据通信能力;PDA(Personal Digital Assistant,个 人数字助理),其可以包括射频接收器、寻呼机、互联网/内联网访问、网络浏览器、记事本、 日历和/或GPS (Global Positioning System,全球定位系统)接收器;常规膝上型和/或 掌上型计算机或其他设备,其具有和/或包括射频接收器的常规膝上型和/或掌上型计算 机或其他设备。这里所使用的"终端"、"终端设备"可以是便携式、可运输、安装在交通工具 (航空、海运和/或陆地)中的,或者适合于和/或配置为在本地运行,和/或以分布形式, 运行在地球和/或空间的任何其他位置运行。这里所使用的"终端"、"终端设备"还可以是 通信终端、上网终端、音乐/视频播放终端,例如可以是PDA、MID(Mobile Internet Device, 移动互联网设备)和/或具有音乐/视频播放功能的移动电话,也可以是智能电视、机顶盒 等设备。
[0051] 本技术领域技术人员可以理解,这里所使用的远端网络设备,其包括但不限于计 算机、网络主机、单个网络服务器、多个网络服务器集或多个服务器构成的云。在此,云由基 于云计算(Cloud Computing)的大量计算机或网络服务器构成,其中,云计算是分布式计算 的一种,由一群松散耦合的计算机集组成的一个超级虚拟计算机。本发明的实施例中,远端 网络设备、终端设备与WNS服务器之间可通过任何通信方式实现通信,包括但不限于,基于 3GPP、LTE、WIMAX的移动通信、基于TCP/IP、UDP协议的计算机网络通信以及基于蓝牙、红外 传输标准的近距无线传输方式。
[0052] Android有三种运行模式,包括:
[0053] UJNI :在开发过程中使用编译器将C/C++等语言直接编译成机器码,运行的时候 能够充分利用系统性能,这是最快的;
[0054] 2、Dalvik :Android L系统之前所有Android版本的运行方式,采用的是字节码, 在运行的时候解释执行变成机器能够识别的机器码,这个过程比较缓慢;
[0055] 3、ART :Android4. 4开始推出的新运行环境,在app安装时使用dex2oat工具直接 把DEX文件转换为机器码文件,运行的时候以机器码方式运行,可以充分利用系统性能,此 夕卜,改进的内存回收机制使得ART运行模式下的内存回收速度只有Dal vik运行时模式下的 50 %,也能够提升系统运行速度。
[0056] Andriod系统架构按照编程语言的不同,可以称为Java层,Native层和Linux kernel层。Java层的恶意软件或安全软件,都采用Java语言开发,而恶意软件可以通过向 系统注册一些事件,在用户不知情的情况下进行偷发短信、窃取通话等行为,而Java层的 开发使用的是Andriod SDK,拥有的权限有限,且Java语言不能直接访问内存,使得Java层 安全软件的主动防御行为变得困难。
[0057] 现有技术的监控方法一般只适用于Dalvik模式的Andriod系统,不适用于ART模 式的Android5. 0,个别监控方法也只能监控ART模式的JNI层,由于JNI层的hook需要找 到JNI层的函数,导致hook点很难找,且只能hook-部分函数,不能hook任意行为的函数。 本发明提供一种程序的监控方法,不仅可以用于native层的函数hook,还可以实现Java层 任意行为函数的hook,具体实施例如下:
[0058] SI 1、定位目标函数所执行的机器码
[0059] ART运行时执行的是翻译DEX字节码后得到的机器码指令,所以ART的核心是OAT 文件,OAT文件是一种Android私有ELF文件格式,包含从以前Dalvik的DEX文件翻译过 来的机器码指令,但是由于ART运行时提供了 Java虚拟机接口,而实现Java虚拟机接口不 得不依赖于DEX文件,所以OAT文件又包含原始的DEX文件内容。ART运行时内部会用两个 不同的术语描述类和方法,其中类描述为Class,类方法描述为Method。
[0060] 每一个Java函数都对应一个Method结构体,该结构体成员变量包括方法所在的 类对象指针、方法的属性、方法在dex文件中的index,方法的机器码指针以及方法native 代码的指针等,在Native层调用Java函数得到目标函数的Method结构体,结构体成员变 量const void*entry_point_from_compiled_code,指向目标函数执行的机器码地址,通过 该成员变量记录的地址找到目标函数执行的机器码。由于Android系统的版本差异,该成 员变量在结构体Method中的位置不确定,要通过动态探测获取。
[0061] S12、写入跳转指令对目标函数进行挂钩
[0062] 在具体实现中,本发明所述机器码为由ART编译后的二进制码,所述挂钩操作为 内联挂钩inline hook操作。针对监控的目标函数的机器码进行内联hook。Inline hook 不同于以前通过修改函数的调用地址的普通hook,是直接在目标函数的函数体内修改指 令,用一个跳转指令实现挂钩的目的。
[0063] ARM为32位指令集,被hook的目标函数被编译为ARM指令集的,写入目标函数跳 转指令,使目标函数跳转到自定义的hook函数,【具体实施方式】如下:
[0064] 先将自定义的hook函数和被hook的目标函数的地址保存下来;
[0065] 生成挂钩的代码,具体为12个字节,将自定义的hook函数地址加载入PC寄存器;
[0066] 将跳转指令写入目标函数的前12个字节。
[0067] 当要调用被hook的目标函数时,执行跳转指令跳转到自定义的hook函数。
[0068] 找到目标函数执行的机器码后,采用内联h〇〇k(inline hook)方式对其进行挂钩, 在其开头的12个字节内写入跳转指令,跳转指令采用arm指令,具体为MOV PC,LR,其中:
[0069] 当目标函数执行到该指令时就跳转到我们自定义的hook函数中,同时保存目标 函数调用的函数上下文,即保存其调用函数的内存地址。
[0070] 其中PC为当前的地址,LR为要跳转的地址,将LR传给PC,PC寄存器存储下一条 要执行的指令地址,指示下一条要执行的指令,即实现跳转。
[0071] 此外,在写入跳转指令之前要先检查是否可写,如果不可写要改成可写状态;并且 要判断目标函数是否已经被hook过,被hook过的函数不再进行hook。
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1