[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

CN104598809B - 程序的监控方法及其防御方法以及相关装置 - Google Patents

程序的监控方法及其防御方法以及相关装置 Download PDF

Info

Publication number
CN104598809B
CN104598809B CN201510080320.7A CN201510080320A CN104598809B CN 104598809 B CN104598809 B CN 104598809B CN 201510080320 A CN201510080320 A CN 201510080320A CN 104598809 B CN104598809 B CN 104598809B
Authority
CN
China
Prior art keywords
function
hook
java
module
program
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.)
Expired - Fee Related
Application number
CN201510080320.7A
Other languages
English (en)
Other versions
CN104598809A (zh
Inventor
李常坤
路轶
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Qihoo Technology Co Ltd
Original Assignee
Beijing Qihoo Technology Co Ltd
Qizhi Software Beijing Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Qihoo Technology Co Ltd, Qizhi Software Beijing Co Ltd filed Critical Beijing Qihoo Technology Co Ltd
Priority to CN201510080320.7A priority Critical patent/CN104598809B/zh
Publication of CN104598809A publication Critical patent/CN104598809A/zh
Application granted granted Critical
Publication of CN104598809B publication Critical patent/CN104598809B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
    • G06F21/53Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by executing in a restricted environment, e.g. sandbox or secure virtual machine
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/03Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
    • G06F2221/033Test or assess software

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明提供一种程序的监控方法及装置,通过向定位的目标函数写入跳转指令进行挂钩;分发给已注册的Java回调函数,并防止创建的临时变量被系统垃圾回收机制回收;不做处理的目标函数跳回挂钩处,否则继续处理目标函数。所述发明可以实现ART模式下的对Android系统的任意Java函数进行监控,并且不破坏目标函数的堆栈,使ART的垃圾回收机制可以正常进行内存回收。本发明还提供一种程序的防御方法及装置,采用上述程序的监控方法实现ART模式下的Android系统的防御机制。

Description

程序的监控方法及其防御方法以及相关装置
技术领域
本发明涉及计算机软件安全技术领域,具体而言,本发明涉及一种程序的监控方法及相关装置,以及一种程序的防御方法及相关装置。
背景技术
Android系统中的安全防御技术,通过以公知的方式向进程注入代码,劫持进程函数,以此类手段来实现对进程的监控和响应,现有技术主要是针对Android 4.4之前的版本中的Dalvik虚拟机技术而实现这种安全防御目的的。自Android 4.4之后,Android逐渐采用ART虚拟机代替Dalvik,这两者在技术上体现出一些差异。
Dalvik是Google公司自己设计用于Android平台的Java虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
ART代表Android Runtime,其处理应用程序执行的方式完全不同于Dalvik,Dalvik是依靠一个Just-In-Time(JIT)编译器去解释字节码。开发者编译后的应用代码需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运行。ART则完全改变了这套做法,在应用安装时就预编译字节码到机器码,这一机制称为Ahead-Of-Time(AOT)编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。
由于Dalvik与ART两种模式存在以上的区别,表现到内存空间,前者存在虚拟空间和真实空间之分,后者只有混合空间。因此,在ART模式下,企图通过传统的安全防御技术,来实现对程序进程所调用的函数的监控,将变得更加困难,尤其是对ART模式下的进程所施加的一些监控操作,将会改进其内存栈的结构,在栈上留下痕迹,导致内存访问出错。
更为关键的是,ART的垃圾回收机制也不同于Dalvik,前者只在虚拟空间回收内存垃圾,而后者在混合环境下的真实空间回收垃圾,如果未能考虑这一因素,无论是实现监控技术本身的内存数据,还是被监控进程自身的数据,在资源紧张时,均容易被ART的垃圾回收机制不当回收,导致进程崩溃。特别地,当Android 5.0版本之后,采用紧凑型内存回收机制,会对内存对象进行移动,如果未能跟踪这一变动,同样也会导致内存访问异常。
发明内容
本发明的目的旨在解决上述至少一个问题,提供一种程序的监控方法及相关装置,用于监控Android 5.0版本的应用程序函数;相应的,还提供一种程序的防御方法及相关装置。
本发明提供一种程序的监控方法,包括以下步骤:
定位目标函数所执行的机器码;
写入跳转指令对目标函数进行挂钩;
分发hook函数给已注册的Java回调函数,并防止创建的临时变量被系统垃圾回收机制回收;
是否继续处理hook后的目标函数;
若不处理,则跳回目标函数的挂钩处;
若处理则不跳回,对目标函数执行相应处理。
具体的,所述挂钩操作采用inline hook的方式。
具体的,所述跳转指令具体为ARM指令。
具体的,所述防止创建的临时变量被系统垃圾回收机制回收具体指Java函数调用Java函数和Java函数调用Native函数两种情况。
一种程序的监控装置,其特征在于,包括:
挂钩模块:用于定位目标函数所执行的机器码;
跳转模块:用于写入跳转指令对目标函数进行挂钩;
分发模块:用于分发hook函数给已注册的Java回调函数,并防止创建的临时变量被垃圾回收机制回收;
判断模块:用于判断是否处理hook后的目标函数;
跳回模块:用于跳回目标函数的挂钩处;
处理模块:用于对目标函数执行相应处理操作。
具体的,所述挂钩模块采用inline hook的方式。
具体的,所述跳转模块执行的跳转指令为ARM指令。
具体的,所述防止创建的临时变量被系统垃圾回收机制回收具体指Java函数调用Java函数和Java函数调用Native函数两种情况。
一种程序的防御方法,包括以下步骤:
向系统的服务进程注入so文件;
监控系统中应用程序的事件行为;
响应服务进程的指令,处理所述应用程序进程的事件行为,其中,所上述监控的步骤采用上述程序的监控方法执行。
一种程序的防御装置,包括:
注入模块:用于向系统的服务进程注入so文件;
监控模块:用于监控系统中应用程序的事件行为;
响应模块:用于响应服务进程的指令,处理所述应用程序进程的事件行为,
其中,所述监控模块用于执行上述程序的监控方法。
相比现有技术,本发明的方案具有以下优点:
1.提供一种程序的监控方法,通过内联hook将ARM指令集的跳转指令写入目标函数的机器码,实现对ART模式下的Android的任意Java函数的hook。
2.本发明提供的一种程序的监控方法中,分发hook函数给已注册的Java回调函数,并防止创建的临时变量被垃圾回收机制回收。对垃圾回收机制的规避,防止临时变量被回收包括两种情况,分别为Java调Java的垃圾回收机制和Java调Native的垃圾回收机制。这样不仅可以避免Java层调Java层时创建的临时变量被标记,不被回收,也可以避免Java层调Native层时创建的临时变量被标记,不被回收。同时,也可以使ART的垃圾回收机制顺利完成垃圾对象内存的回收。
3.提供一种程序的防御方法,通过采用本发明所述一种ART模式下的函数监控方法实现在ART模式下的防御机制,对ART模式下的Android系统Java层函数进行监控,不同于现有技术的只在JNI层通信时对有限的一些目标函数进行拦截的方法,直接在Java层hook可以很容易找到要拦截的目标函数,并且可以实现对任意行为的目标函数进行拦截。
本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:
图1为一种程序的监控方法的流程示意图;
图2为一种程序的监控装置的原理框图;
图3为一种程序的防御方法的流程示意图;
图4为一种程序的防御装置的原理框图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
本技术领域技术人员可以理解,这里所使用的“终端”、“终端设备”既包括无线信号接收器的设备,其仅具备无发射能力的无线信号接收器的设备,又包括接收和发射硬件的设备,其具有能够在双向通信链路上,执行双向通信的接收和发射硬件的设备。这种设备可以包括:蜂窝或其他通信设备,其具有单线路显示器或多线路显示器或没有多线路显示器的蜂窝或其他通信设备;PCS(Personal Communications Service,个人通信系统),其可以组合语音、数据处理、传真和/或数据通信能力;PDA(Personal Digital Assistant,个人数字助理),其可以包括射频接收器、寻呼机、互联网/内联网访问、网络浏览器、记事本、日历和/或GPS(Global Positioning System,全球定位系统)接收器;常规膝上型和/或掌上型计算机或其他设备,其具有和/或包括射频接收器的常规膝上型和/或掌上型计算机或其他设备。这里所使用的“终端”、“终端设备”可以是便携式、可运输、安装在交通工具(航空、海运和/或陆地)中的,或者适合于和/或配置为在本地运行,和/或以分布形式,运行在地球和/或空间的任何其他位置运行。这里所使用的“终端”、“终端设备”还可以是通信终端、上网终端、音乐/视频播放终端,例如可以是PDA、MID(Mobile Internet Device,移动互联网设备)和/或具有音乐/视频播放功能的移动电话,也可以是智能电视、机顶盒等设备。
本技术领域技术人员可以理解,这里所使用的远端网络设备,其包括但不限于计算机、网络主机、单个网络服务器、多个网络服务器集或多个服务器构成的云。在此,云由基于云计算(Cloud Computing)的大量计算机或网络服务器构成,其中,云计算是分布式计算的一种,由一群松散耦合的计算机集组成的一个超级虚拟计算机。本发明的实施例中,远端网络设备、终端设备与WNS服务器之间可通过任何通信方式实现通信,包括但不限于,基于3GPP、LTE、WIMAX的移动通信、基于TCP/IP、UDP协议的计算机网络通信以及基于蓝牙、红外传输标准的近距无线传输方式。
Android有三种运行模式,包括:
1、JNI:在开发过程中使用编译器将C/C++等语言直接编译成机器码,运行的时候能够充分利用系统性能,这是最快的;
2、Dalvik:Android L系统之前所有Android版本的运行方式,采用的是字节码,在运行的时候解释执行变成机器能够识别的机器码,这个过程比较缓慢;
3、ART:Android4.4开始推出的新运行环境,在app安装时使用dex2oat工具直接把DEX文件转换为机器码文件,运行的时候以机器码方式运行,可以充分利用系统性能,此外,改进的内存回收机制使得ART运行模式下的内存回收速度只有Dalvik运行时模式下的50%,也能够提升系统运行速度。
Andriod系统架构按照编程语言的不同,可以称为Java层,Native层和Linuxkernel层。Java层的恶意软件或安全软件,都采用Java语言开发,而恶意软件可以通过向系统注册一些事件,在用户不知情的情况下进行偷发短信、窃取通话等行为,而Java层的开发使用的是Andriod SDK,拥有的权限有限,且Java语言不能直接访问内存,使得Java层安全软件的主动防御行为变得困难。
现有技术的监控方法一般只适用于Dalvik模式的Andriod系统,不适用于ART模式的Android5.0,个别监控方法也只能监控ART模式的JNI层,由于JNI层的hook需要找到JNI层的函数,导致hook点很难找,且只能hook一部分函数,不能hook任意行为的函数。本发明提供一种程序的监控方法,不仅可以用于native层的函数hook,还可以实现Java层任意行为函数的hook,具体实施例如下:
S11、定位目标函数所执行的机器码
ART运行时执行的是翻译DEX字节码后得到的机器码指令,所以ART的核心是OAT文件,OAT文件是一种Android私有ELF文件格式,包含从以前Dalvik的DEX文件翻译过来的机器码指令,但是由于ART运行时提供了Java虚拟机接口,而实现Java虚拟机接口不得不依赖于DEX文件,所以OAT文件又包含原始的DEX文件内容。ART运行时内部会用两个不同的术语描述类和方法,其中类描述为Class,类方法描述为Method。
每一个Java函数都对应一个Method结构体,该结构体成员变量包括方法所在的类对象指针、方法的属性、方法在dex文件中的index,方法的机器码指针以及方法native代码的指针等,在Native层调用Java函数得到目标函数的Method结构体,结构体成员变量constvoid*entry_point_from_compiled_code,指向目标函数执行的机器码地址,通过该成员变量记录的地址找到目标函数执行的机器码。由于Android系统的版本差异,该成员变量在结构体Method中的位置不确定,要通过动态探测获取。
S12、写入跳转指令对目标函数进行挂钩
在具体实现中,本发明所述机器码为由ART编译后的二进制码,所述挂钩操作为内联挂钩inline hook操作。针对监控的目标函数的机器码进行内联hook。Inline hook不同于以前通过修改函数的调用地址的普通hook,是直接在目标函数的函数体内修改指令,用一个跳转指令实现挂钩的目的。
ARM为32位指令集,被hook的目标函数被编译为ARM指令集的,写入目标函数跳转指令,使目标函数跳转到自定义的hook函数,具体实施方式如下:
先将自定义的hook函数和被hook的目标函数的地址保存下来;
生成挂钩的代码,具体为12个字节,将自定义的hook函数地址加载入PC寄存器;
将跳转指令写入目标函数的前12个字节。
当要调用被hook的目标函数时,执行跳转指令跳转到自定义的hook函数。
找到目标函数执行的机器码后,采用内联hook(inline hook)方式对其进行挂钩,在其开头的12个字节内写入跳转指令,跳转指令采用arm指令,具体为MOV PC,LR,其中:
当目标函数执行到该指令时就跳转到我们自定义的hook函数中,同时保存目标函数调用的函数上下文,即保存其调用函数的内存地址。
其中PC为当前的地址,LR为要跳转的地址,将LR传给PC,PC寄存器存储下一条要执行的指令地址,指示下一条要执行的指令,即实现跳转。
此外,在写入跳转指令之前要先检查是否可写,如果不可写要改成可写状态;并且要判断目标函数是否已经被hook过,被hook过的函数不再进行hook。
S13、分发hook函数给已注册的Java回调函数,并防止创建的临时变量被系统垃圾回收机制回收
目前的ART实现了两种垃圾回收(Garbage Collection)技术,一种是Mark-Sweep,另一种是Semi-Space。基本思想是,将所有对象在内存的位置记录在位图A中,从所有对象的根出发,扫描根对象的所有引用,扫描对象的所有引用的引用,一层层通过栈的结构进行逐层遍历,直至叶子节点的对象。并且在扫描的过程中,将涉及到的对象位置记录在位图B中。扫描结束后,对比两张位图A和B,所有A中标记为1,B中标记为0的对象被视为垃圾,并根据位图中的索引检索得到该对象,释放该对象占用的内存。同时,“Large Object Space”(大对象空间)被引入ART垃圾回收机制,用于处理应用程序内存中的大对象,比如图片。这些大的对象会使堆变得碎片化,产生严重问题,而智能的内存分配方案可以减少碎片化程度,使GC的调用频率大幅减少。ART中还有一个moving collector用来压缩活动对象,对内存空间进行整理,使内存空间更加紧凑,从而使得GC的整体性能有巨大提升。
ART垃圾回收机制减轻了以前垃圾回收的很多负担,执行过程中不再需要暂停,而标记过程也通过两次标记尽可能在暂停其他线程之前完成标记,从而使暂停只需在一个简单的检查与校验中完成。
通过inline hook的方式将目标函数的流程引入自定义的hook函数,需要获取目标函数的参数,第一个参数是方法指针;第二个参数可能是第一个参数,也可能是类指针,当为静态方法时就是第一个指针;当为类方法时就是类指针,依次找到目标函数的所有参数,通过这些参数得到函数的方法信息,从而作进一步处理。
Java应用程序在拦截目标函数通过向自定义的hook函数注册一个回调函数,由hook函数进行分发,调用各Java的回调函数,从而把拦截的目标函数信息传递给Java应用程序。在该过程中,当ART出现内存不足的情况时就会进行垃圾回收,或者申请的内存达到一定限度,或者程序主动要求GC时,都会启动垃圾回收线程,释放垃圾对象的内存。
由于hook导致栈帧增长,垃圾回收机制通过栈结构寻找临时变量,并回收未标记的对象,所以需要防止hook后调用的函数的临时变量被回收。本发明主要针对以下两种情况采取相应措施:
1.Java函数调Java函数
Java函数调用栈中的每层栈都对应一个Method指针,即被调用函数的Method结构体,通过该结构体可以计算获得当前层的栈高,并且标记Method结构体中记录的临时变量个数。根据当前层的栈高和栈帧得到上一层被调用函数的Method结构体,并标记其中的临时变量,依此方法继续找下一个函数的调用并依次标记其临时变量,最终标记完所有被压栈的被调用函数的临时变量,从而避免这些临时变量被回收。
2.Java函数调Native函数
如果Java层的函数调用了Native层的函数,则栈是Native层函数的栈,由于Native层的编译器不同于Java层的ART编译器,从而无法知道Native层的函数用了多少栈,此时的栈高也无法知道,也就是说此时的Method指针为空。为了获取栈高,采用链表的方法,ART垃圾回收机制会自动查找结构体ManagerStack,其中的一个成员变量为指针,指向链表的首地址,链表指向下一个Method,再由该Method记录的栈高得到临时变量的个数,并标记这些临时变量,防止被垃圾回收机制回收。
此外,Android5.0的垃圾回收机制有紧凑型内存回收机制,会做内存整理,移动对象的内存,防止过多的内存碎片产生。这就导致当我们创建了一个对象,长时间占用该对象的指针,而该对象被GC做内存整理移动到其他地方,在Native使用该对象时已经被移动了,则该对象的指针所指向的内存对象已经不是该对象了,所以本发明采用如下方法规避此问题:
1.将hook函数创建的Java对象转成JNI对象
将Java类型的对象转成JNI类型的对象,也就是将进行hook时需要保存的hook函数上下调用关系的一个变量转换成JNI对象。
2.将JNI对象传递给ART的接口函数进行解码
ART的接口函数DecodeJObject(jobject obj)可以将JNI对象进行解码,得到Java对象。所述接口函数代码如下:
3.解码后获取JNI对象引用的hook函数创建的原Java对象
JNI对象只是对Java对象的引用,通过解码得到的Java对象才是真正的原Java对象。将解码得到的Java原对象赋给相应的变量。
S14、是否继续处理hook后的目标函数
S15、若不处理,则跳回目标函数的挂钩处
如果通过Java回调函数获取到目标函数的信息后,不对目标函数作任何处理,将之前的hook函数保存的被hook的目标函数的跳转地址写回PC寄存器,则目标函数会继续执行被覆盖的原代码。同时,将已标记的hook函数的临时变量转换成为未标记状态,由垃圾回收线程自动回收。
S16、若处理则不跳回,对目标函数执行相应处理
相应地,本发明还提供一种程序的监控装置,包括挂钩模块11、跳转模块12、分发模块13、判断模块14、跳回模块15及处理模块16。其中,
挂钩模块11用于定位目标函数所执行的机器码。在Native层调用一些Java函数得到目标函数的Method结构体,结构体有个成员变量,指向目标函数执行的机器码。通过该成员变量记录的地址找到目标函数执行的机器码。
跳转模块12用于写入跳转指令对目标函数进行挂钩。ARM为32位指令集,被hook的目标函数被编译为ARM指令集的,写入目标函数跳转指令,使目标函数跳转到自定义的hook函数,具体实施方式如下:
先将自定义的hook函数和被hook的目标函数的地址保存下来;
生成挂钩的代码,具体为12个字节,将自定义的hook函数地址加载入PC寄存器;
将跳转指令写入目标函数的前12个字节。
当要调用被hook的目标函数时,执行跳转指令跳转到自定义的hook函数。
找到目标函数执行的机器码后,采用内联hook(inline hook)方式对其进行挂钩,在其开头的12个字节内写入跳转指令,跳转指令采用arm指令,具体为MOV PC,LR,其中;
当目标函数执行到该指令时就跳转到我们自定义的hook函数中,同时保存目标函数调用的函数上下文,即保存其调用函数的内存地址。
其中PC为当前的地址,LR为要跳转的地址,将LR传给PC,PC寄存器存储下一条要执行的指令地址,指示下一条要执行的指令,即实现跳转。
此外,在写入跳转指令之前要先检查是否可写,如果不可写要改成可写状态;并且要判断目标函数是否已经被hook过,被hook过的函数不再进行hook。
分发模块13用于分发hook函数给已注册的Java回调函数,并防止创建的临时变量被系统垃圾回收机制回收。具体过程为:
通过inline hook的方式将目标函数的流程引入自定义的hook函数,需要获取目标函数的参数,第一个参数是方法指针;第二个参数可能是第一个参数,也可能是类指针,当为静态方法时就是第一个指针;当为类方法时就是类指针,依次找到目标函数的所有参数,通过这些参数得到函数的方法信息,从而作进一步处理。
Java应用程序在拦截目标函数通过向自定义的hook函数注册一个回调函数,由hook函数进行分发,调用各Java的回调函数,从而把拦截的目标函数信息传递给Java应用程序。在该过程中,当ART出现内存不足的情况时就会进行垃圾回收,此时启动垃圾回收线程,释放垃圾对象的内存。
由于hook导致栈帧增长,垃圾回收机制通过栈结构寻找临时变量,并回收未标记的对象,所以需要防止hook后调用的函数的临时变量被回收。本发明主要针对以下两种情况采取相应措施:
1.Java函数调Java函数
Java函数的每层栈都对应一个Method指针,该指针中记录该层的栈高,根据记录的栈高可知临时变量的个数,标记这些临时变量,从而避免这些临时变量被回收。
2.Java函数调Native函数
如果Java层的函数调用了Native层的函数,则栈是Native层函数的栈,由于Native层的编译器不同于Java层的ART编译器,从而无法知道Native层的函数用了多少栈,此时的栈高也无法知道,也就是说此时的Method指针为空。为了获取栈高,采用链表的方法,ART垃圾回收机制会自动查找结构体ManagerStack,其中的一个成员变量为指针,指向链表的首地址,链表指向下一个Method,再由该Method记录的栈高得到临时变量的个数,并标记这些临时变量,防止被垃圾回收机制回收。
判断模块14用于确定是否处理hook后的目标函数。
跳回模块15用于跳回目标函数的挂钩处。如果通过Java回调函数获取到目标函数的信息后,不对目标函数作任何处理,将之前的hook()函数保存的被hook的目标函数的跳转地址写回PC寄存器,则目标函数会继续执行被覆盖的原代码。同时,将已标记的hook函数的临时变量转换成未标记状态,由垃圾回收线程自动回收。
处理模块16用于对目标函数执行相应处理。
本发明提供一种程序的防御方法,具体实施方式为:
S11、向系统的服务进程注入so文件
so注入就是从一个进程向另一个进程注入一个so文件,通过该so文件实现函数的拦截功能。具体操作过程为:
步骤1:ptrace_attach到目标进程,让目标进程发生ptrace_syscall时停止;
步骤2:ptrace_getregs保存目标进程的上下文,即目标进程的寄存器状态;
步骤3:ptrace_setregs改写目标进程的PC寄存器,使得它指向函数mmap的地址;
步骤4:ptrace_cont让目标进程恢复执行,此时会执行函数mmap;
步骤5:ptrace_getregs获得目标进程的R0寄存器值,即为函数mmap的返回值,指向目标进程地址空间分配的一块内存;
步骤6:ptrace_poketext往目标进程分配地址写入要注入的代码。
步骤7:ptrace_setregs改写目标进程的PC寄存器,使得它指向上述注入代码的起始地址;
步骤8:ptrace_detach目标进程,目标进程恢复执行后,就会执行注入;
S12、监控系统中应用程序的事件行为
当监控到系统中应用程序的某些事件行为,如读取联系人、发送短信、读取照片等时间行为时,对其进行拦截,提取应用程序特征信息,例如UID、包名等信息。
本实施例所述监控过程是基于ART模式的Android系统,具体监控步骤由上述ART模式下的函数监控方法执行,通过hook应用程序的相应事件行为对应的函数,获取其特征信息。在此过程中,由于ART虚拟机的编译器不同于Linux内核的编译器,所以要同时做好内存管理,以免影响ART虚拟机中的GC机制。
S13、响应服务进程的指令,处理所述应用程序进程的事件行为
基于上述步骤获取的特征信息,从本地或远程已知设置数据(例如存储于本地的或远程的数据库中)中检验该特征信息所对应的应用程序的事件行为是否应被限制或被禁止,当其为应被限制或应被禁止的应用程序时,由系统服务进程发出指令,监控模块响应并对其进行处理。该已知设置数据可以存储各个UID与是否被限制或被禁止的信息之间的映射关系。这一处理过程,能够提供更安全有效的监控效果,通过配置所述的已知设置数据,尤其在该已知设置数据能够得到及时的远程的更新时,可以借助这类数据来及时阻止移动终端的恶意应用程序的运行。
相应地,本发明还提供一种程序的防御装置,包括注入模块11、监控模块12、响应模块13。其中,
注入模块11用于向系统的服务进程注入so文件,具体操作过程为:
步骤1:ptrace_attach到目标进程,让目标进程发生ptrace_syscall时停止;
步骤2:ptrace_getregs保存目标进程的上下文,即目标进程的寄存器状态;
步骤3:ptrace_setregs改写目标进程的PC寄存器,使得它指向函数mmap的地址;
步骤4:ptrace_cont让目标进程恢复执行,此时会执行函数mmap;
步骤5:ptrace_getregs获得目标进程的R0寄存器值,即为函数mmap的返回值,指向目标进程地址空间分配的一块内存;
步骤6:ptrace_poketext往目标进程分配地址写入要注入的代码。
步骤7:ptrace_setregs改写目标进程的PC寄存器,使得它指向上述注入代码的起始地址;
步骤8:ptrace_detach目标进程,目标进程恢复执行后,就会执行注入;
监控模块12用于监控系统中应用程序的事件行为。当监控到系统中应用程序的某些事件行为,如读取联系人、发送短信、读取照片等时间行为时,对其进行拦截,提取应用程序特征信息,例如UID、包名等信息。
本实施例所述监控过程是基于ART模式的Android系统,具体监控步骤由上述ART模式下的函数监控方法执行,通过hook应用程序相应的事件行为对应的函数,获取其特征信息。在此过程中,由于ART虚拟机的编译器不同于Linux内核的编译器,所以要同时做好内存管理,以免影响ART虚拟机中的GC机制。
响应模块13用于响应服务进程的指令,处理所述应用程序进程的事件行为。基于上述步骤获取的特征信息,从本地或远程已知设置数据(例如存储于本地的或远程的数据库中)中检验该特征信息所对应的应用程序的事件行为是否应被限制或被禁止,当其为应被限制或应被禁止的应用程序时,由系统服务进程发出指令,监控模块响应并对其进行处理。该已知设置数据可以存储各个UID与是否被限制或被禁止的信息之间的映射关系。这一处理过程,能够提供更安全有效的监控效果,通过配置所述的已知设置数据,尤其在该已知设置数据能够得到及时的远程的更新时,可以借助这类数据来及时阻止移动终端的恶意应用程序的运行。
以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (10)

1.一种程序的监控方法,其特征在于,包括以下步骤:
定位目标函数所执行的机器码;
写入跳转指令对目标函数进行挂钩;
分发hook函数给已注册的Java回调函数,并防止创建的临时变量被系统垃圾回收机制回收,所述防止创建的临时变量被系统垃圾回收机制回收具体指Java函数调Java函数和Java函数调Native函数两种情况,所述防止创建的临时变量被系统垃圾回收机制回收还包括对系统垃圾回收机制的内存整理操作进行规避,步骤如下:将hook函数创建的Java对象转成JNI对象之后将JNI对象传递给ART的接口函数进行解码,解码后获取JNI对象引用的hook函数创建的原Java对象;是否继续处理hook后的目标函数;
若不处理,则跳回目标函数的挂钩处;
若处理则不跳回,对目标函数执行相应处理。
2.根据权利要求1所述的一种程序的监控方法,其特征在于,所述挂钩操作采用inlinehook的方式。
3.根据权利要求1所述的一种程序的监控方法,其特征在于,所述跳转指令具体为ARM指令。
4.根据权利要求1所述的一种程序的监控方法,其特征在于,所述ART接口函数为DecodeJObject(jobject obj)函数。
5.一种程序的监控装置,其特征在于,包括:
挂钩模块:用于定位目标函数所执行的机器码;
跳转模块:用于写入跳转指令对目标函数进行挂钩;
分发模块:用于分发hook函数给已注册的Java回调函数,并防止创建的临时变量被系统垃圾回收机制回收,所述防止创建的临时变量被系统垃圾回收机制回收具体指Java函数调Java函数和Java函数调Native函数,所述防止创建的临时变量被系统垃圾回收机制回收还包括对系统垃圾回收机制的内存整理操作进行规避,步骤如下:将hook函数创建的Java对象转成JNI对象之后将JNI对象传递给ART的接口函数进行解码,解码后获取JNI对象引用的hook函数创建的原Java对象;
判断模块:用于判断是否继续处理hook后的目标函数;
跳回模块:用于跳回目标函数的挂钩处;
处理模块:用于对目标函数执行相应处理。
6.根据权利要求5所述的一种程序的监控装置,其特征在于,所述挂钩模块采用inlinehook的方式。
7.根据权利要求5所述的一种程序的监控装置,其特征在于,所述跳转模块执行的跳转指令为ARM指令。
8.根据权利要求5所述的一种程序的监控装置,其特征在于,所述ART接口函数为DecodeJObject(jobject obj)函数。
9.一种程序的防御方法,包括以下步骤:
向系统的服务进程注入so文件;
监控系统中应用程序的事件行为;
响应服务进程的指令,处理所述应用程序进程的事件行为,
其特征在于,上述监控步骤由权利要求1至4中任一所述的一种程序的监控方法执行。
10.一种程序的防御装置,包括:
注入模块:用于向系统的服务进程注入so文件;
监控模块:用于监控系统中应用程序的事件行为;
响应模块:用于响应服务进程的指令,处理所述应用程序进程的事件行为,
其特征在于,所述监控模块用于执行如权利要求1至4任一所述的一种程序的监控方法。
CN201510080320.7A 2015-02-13 2015-02-13 程序的监控方法及其防御方法以及相关装置 Expired - Fee Related CN104598809B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510080320.7A CN104598809B (zh) 2015-02-13 2015-02-13 程序的监控方法及其防御方法以及相关装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510080320.7A CN104598809B (zh) 2015-02-13 2015-02-13 程序的监控方法及其防御方法以及相关装置

Publications (2)

Publication Number Publication Date
CN104598809A CN104598809A (zh) 2015-05-06
CN104598809B true CN104598809B (zh) 2017-04-19

Family

ID=53124587

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510080320.7A Expired - Fee Related CN104598809B (zh) 2015-02-13 2015-02-13 程序的监控方法及其防御方法以及相关装置

Country Status (1)

Country Link
CN (1) CN104598809B (zh)

Families Citing this family (31)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106547580B (zh) * 2015-09-22 2020-08-28 腾讯科技(深圳)有限公司 挂钩函数的方法、装置、移动终端及存储介质
CN106909457A (zh) * 2015-12-23 2017-06-30 北京奇虎科技有限公司 内存管理方法及装置
CN105630651A (zh) * 2015-12-28 2016-06-01 北京像素软件科技股份有限公司 性能监视方法和装置
CN107122247B (zh) * 2017-04-27 2021-11-02 腾讯科技(深圳)有限公司 一种静态占用图片的检测方法和装置
CN107391219B (zh) * 2017-07-07 2018-09-18 腾讯科技(深圳)有限公司 函数编译方法和装置
CN109471767A (zh) * 2017-09-08 2019-03-15 福建省天奕网络科技有限公司 一种hook虚拟机中的函数的方法及终端
CN109471768B (zh) * 2017-09-08 2023-04-18 阿里巴巴集团控股有限公司 业务问题的监控方法、装置以及电子设备
CN109558332B (zh) * 2017-09-26 2022-10-25 北京金山安全软件有限公司 一种对象回收方法、装置、电子设备及存储介质
CN109558304B (zh) * 2017-09-27 2020-10-30 北京邮电大学 一种组件关联分析方法、装置及电子设备
CN107943517A (zh) * 2017-10-26 2018-04-20 北京奇虎科技有限公司 终端应用的挂钩方法及装置
CN107908391B (zh) * 2017-11-20 2021-06-04 北京奇虎科技有限公司 程序调用的优化方法及装置
CN107861807B (zh) * 2017-11-20 2021-06-25 北京奇虎科技有限公司 程序调用的优化方法及装置
CN108021357B (zh) * 2017-11-20 2022-03-11 北京奇虎科技有限公司 程序调用的优化方法及装置
CN108446119A (zh) * 2017-12-28 2018-08-24 北京奇虎科技有限公司 内联控制方法及装置
CN110046497B (zh) * 2018-01-16 2023-06-20 腾讯科技(深圳)有限公司 一种函数挂钩实现方法、装置和存储介质
CN110162311A (zh) * 2018-02-13 2019-08-23 中兴通讯股份有限公司 一种应用安装方法、应用安装包的生成方法
CN110554998B (zh) * 2018-03-30 2024-02-13 腾讯科技(深圳)有限公司 一种通过替换函数内部指令的钩子方法、装置、终端及存储介质
CN108959070B (zh) * 2018-06-13 2022-05-10 珠海金山网络游戏科技有限公司 一种基于代码对象的Python钩子函数方法和装置
CN109271792B (zh) * 2018-08-15 2022-02-18 中国人民解放军陆军工程大学 一种基于Android本地层挂钩的终端外设控制方法及装置
CN111026598A (zh) * 2018-10-09 2020-04-17 迈普通信技术股份有限公司 数据采集方法及装置
CN111352629B (zh) * 2018-12-24 2024-06-18 北京奇虎科技有限公司 一种程序调用的优化方法及装置
CN109635589B (zh) * 2018-12-25 2022-06-14 成都卫士通信息产业股份有限公司 So文件调用的方法及装置
CN110096338B (zh) * 2019-05-10 2021-12-14 百度在线网络技术(北京)有限公司 智能合约执行方法、装置、设备及介质
CN110704184B (zh) * 2019-09-19 2022-09-06 海南车智易通信息技术有限公司 一种应用内存优化方法、装置和移动终端
CN111428241B (zh) * 2019-10-31 2023-12-29 北京统信软件技术有限公司 一种多安全访问策略控制方法及计算设备
CN111966427B (zh) * 2020-08-17 2022-06-21 四川长虹电器股份有限公司 一种Android native调用Java API的实现方法
CN112882695B (zh) * 2021-03-02 2023-11-28 百果园技术(新加坡)有限公司 传参方法、装置、计算机设备及存储介质
CN113392416B (zh) * 2021-06-28 2024-03-22 北京恒安嘉新安全技术有限公司 获取应用程序加解密数据的方法、装置、设备及存储介质
CN114138691A (zh) * 2021-11-05 2022-03-04 杭州薮猫科技有限公司 基于回调机制的内核扩展方法、装置及设备
CN116361777A (zh) * 2021-12-27 2023-06-30 北京有竹居网络技术有限公司 权限管理方法、装置、存储介质及电子设备
CN115017058B (zh) * 2022-08-04 2022-11-29 飞腾信息技术有限公司 一种内核模块的测试方法、装置、电子设备及存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102810143A (zh) * 2012-04-28 2012-12-05 天津大学 基于Android平台手机应用程序的安全检测系统及方法
US8359496B1 (en) * 2010-08-31 2013-01-22 Google Inc. Fault-resistant just-in-time compiler
CN103744727A (zh) * 2014-01-16 2014-04-23 Tcl集团股份有限公司 一种启动服务的方法、装置和智能设备
CN104156662A (zh) * 2014-08-28 2014-11-19 北京奇虎科技有限公司 进程监控的方法、装置和智能终端
CN104317673A (zh) * 2014-10-24 2015-01-28 新华瑞德(北京)网络科技有限公司 应用程序的回收方法、装置及其恢复方法、装置

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8359496B1 (en) * 2010-08-31 2013-01-22 Google Inc. Fault-resistant just-in-time compiler
CN102810143A (zh) * 2012-04-28 2012-12-05 天津大学 基于Android平台手机应用程序的安全检测系统及方法
CN103744727A (zh) * 2014-01-16 2014-04-23 Tcl集团股份有限公司 一种启动服务的方法、装置和智能设备
CN104156662A (zh) * 2014-08-28 2014-11-19 北京奇虎科技有限公司 进程监控的方法、装置和智能终端
CN104317673A (zh) * 2014-10-24 2015-01-28 新华瑞德(北京)网络科技有限公司 应用程序的回收方法、装置及其恢复方法、装置

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
"Dalvik虚拟机代码注入和内存追踪设计与实现";罗曼;《中国优秀硕士学位论文全文数据库 信息科技辑》;20140115(第01期);I137-7 *
"基于Android沙箱的软件行为分析系统的设计与实现";李彬;《中国优秀硕士学位论文全文数据库 信息科技辑》;20131115(第11期);3.1.1节、4.2.2节、4.3节、5.2.1节、5.3.3节,图2-1、4-1、4-7、4-8 *

Also Published As

Publication number Publication date
CN104598809A (zh) 2015-05-06

Similar Documents

Publication Publication Date Title
CN104598809B (zh) 程序的监控方法及其防御方法以及相关装置
EP3491568B1 (en) Kernel-based detection of target application functionality using virtual address mapping
US10698668B1 (en) Custom code transformations during compilation process
KR102255767B1 (ko) 가상 머신 감사를 위한 시스템 및 방법들
CN102592082B (zh) 通过操作码随机化的安全
CN103907098A (zh) 用于管理程序环境中的关键地址空间保护的系统和方法
EP3190537A1 (en) Protection method and device for application data
CN103064784A (zh) 面向Xen环境的运行时内存泄漏检测方法及其实现系统
US20130311600A1 (en) Event-responsive download of portions of streamed applications
EP3113019A1 (en) Policy-based compression of machine code generated by a virtual machine
CN109271789B (zh) 恶意进程检测方法、装置、电子设备及存储介质
US7600223B2 (en) Abstracted managed code execution
CN105683985A (zh) 虚拟机内省
US10891214B2 (en) Transferring a debug configuration amongst carrier threads for debugging a carried thread
Wagner et al. “Slimming” a Java virtual machine by way of cold code removal and optimistic partial program loading
US7743377B2 (en) Cooperative threading in a managed code execution environment
CN113176926B (zh) 一种基于虚拟机自省技术的api动态监控方法及系统
US9841982B2 (en) Locating import class files at alternate locations than specified in classpath information
US20190102279A1 (en) Generating an instrumented software package and executing an instance thereof
US7549045B2 (en) Delegate registration in a managed code execution environment
US7716686B1 (en) System, method and computer program product for interface hooking
CN115543586B (zh) 应用层系统进程的启动方法、装置、设备及可读存储介质
WO2004034256A2 (en) Method and apparatus for managing independent asynchronous i/0 operations within a virtual machine
CN101794293B (zh) 扩展文件属性信息的安全管理至虚拟硬盘
US20190087321A1 (en) Re-playable Execution Optimized for Page Sharing in a Managed Runtime Environment

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20220728

Address after: Room 801, 8th floor, No. 104, floors 1-19, building 2, yard 6, Jiuxianqiao Road, Chaoyang District, Beijing 100015

Patentee after: BEIJING QIHOO TECHNOLOGY Co.,Ltd.

Address before: 100088 room 112, block D, 28 new street, new street, Xicheng District, Beijing (Desheng Park)

Patentee before: BEIJING QIHOO TECHNOLOGY Co.,Ltd.

Patentee before: Qizhi software (Beijing) Co.,Ltd.

CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20170419