CN107885529B - 终端应用的挂钩方法及装置 - Google Patents

终端应用的挂钩方法及装置 Download PDF

Info

Publication number
CN107885529B
CN107885529B CN201711022165.9A CN201711022165A CN107885529B CN 107885529 B CN107885529 B CN 107885529B CN 201711022165 A CN201711022165 A CN 201711022165A CN 107885529 B CN107885529 B CN 107885529B
Authority
CN
China
Prior art keywords
jump instruction
operating system
function
jump
bit
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
Application number
CN201711022165.9A
Other languages
English (en)
Other versions
CN107885529A (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
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 filed Critical Beijing Qihoo Technology Co Ltd
Priority to CN201711022165.9A priority Critical patent/CN107885529B/zh
Publication of CN107885529A publication Critical patent/CN107885529A/zh
Application granted granted Critical
Publication of CN107885529B publication Critical patent/CN107885529B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30069Instruction skipping instructions, e.g. SKIP

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Mobile Radio Communication Systems (AREA)

Abstract

本发明公开了一种终端应用的挂钩方法及装置,涉及信息处理技术领域,主要目的在于提出一种新的挂钩函数方式,能够兼容基于32位操作系统和基于64位操作系统的挂钩函数,提升挂钩函数效率且提升挂钩兼容性。所述方法包括:在移动终端的应用调用目标函数时,识别从目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,新函数为待目标函数挂钩的函数;若为基于32位操作系统的短跳转指令,优先利用32位短跳转策略实现挂钩新函数;在利用32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩新函数;若基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩新函数。本发明适用于终端应用的挂钩。

Description

终端应用的挂钩方法及装置
技术领域
本发明涉及信息处理技术领域,特别是涉及一种终端应用的挂钩方法及装置。
背景技术
挂钩(hook)技术是Windows中提供的一种用以替换DOS下“中断”的系统机制,挂钩函数是Windows消息处理机制的一部分,通过设置“挂钩函数”,应用程序可以在系统对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。挂钩函数的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。
目前,基于32位操作系统的挂钩函数所跳转的内存范围,与基于64位操作系统的挂钩函数所跳转的内存范围不同,通常需要两套程序才能完成基于32位操作系统和基于64位操作系统的挂钩函数,然而,通过上述方式挂钩函数,挂钩函数效率较低且兼容性较差。因此,提出一种新的挂钩函数方式是目前亟待解决的技术问题。
发明内容
有鉴于此,本发明提供一种终端应用的挂钩方法及装置,主要目的在于提出一种新的挂钩函数方式,通过一套程序即可兼容基于32位操作系统和基于64位操作系统的挂钩函数,提升了挂钩函数效率。
依据本发明一方面,提供了一种终端应用的挂钩方法,包括:
在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;
若为基于32位操作系统的短跳转指令,则优先利用32位短跳转策略实现挂钩所述新函数;
在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数;
若基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数。
依据本发明另一方面,提供了一种终端应用的挂钩装置,包括:
识别单元,用于在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;
挂钩单元,用于若所述识别单元识别所述跳转指令为基于32位操作系统的短跳转指令,优先利用32位短跳转策略实现挂钩所述新函数;
所述挂钩单元,还用于在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数;
所述挂钩单元,还用于若所述识别单元识别所述跳转指令为基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数。
依据本发明又一方面,提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:
在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;
若为基于32位操作系统的短跳转指令,则优先利用32位短跳转策略实现挂钩所述新函数;
在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数;
若基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数。
依据本发明另一方面,提供了一种终端应用的挂钩装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤:
在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;
若为基于32位操作系统的短跳转指令,则优先利用32位短跳转策略实现挂钩所述新函数;
在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数;
若基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数。
借由上述技术方案,本发明提供一种终端应用的挂钩方法及装置,与目前在通常需要两套程序才能完成基于32位操作系统和基于64位操作系统的挂钩函数相比,本发明提供一种新的挂钩函数方式,在移动终端的应用调用目标函数时,能够识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;若为基于32位操作系统的短跳转指令,能够优先利用32位短跳转策略实现挂钩所述新函数;在利用所述32位短跳转策略挂钩失败后,能够利用32位长跳转策略实现挂钩所述新函数;若基于64位操作系统的短跳转指令,则能够利用64位短跳转策略实现挂钩所述新函数,从而能够兼容基于32位操作系统和基于64位操作系统的挂钩函数,提升挂钩函数效率且提升挂钩兼容性。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了本发明实施例提供的一种终端应用的挂钩方法流程图;
图2示出了本发明实施例提供的另一种终端应用的挂钩方法流程图;
图3示出了本发明实施例提供的又一种终端应用的挂钩方法流程图;
图4示出了本发明实施例提供的再一种终端应用的挂钩方法流程图;
图5示出了本发明实施例提供的又再一种终端应用的挂钩方法流程图;
图6示出了本发明实施例提供的又再一种终端应用的挂钩方法流程图;
图7示出了本发明实施例提供的一种终端应用的挂钩装置的结构示意图;
图8示出了本发明实施例提供的另一种终端应用的挂钩装置的结构示意图;
图9示出了本发明实施例提供的一种终端应用的挂钩装置的实体结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
如背景技术所述,基于32位操作系统的挂钩函数所跳转的内存范围,与基于64位操作系统的挂钩函数所跳转的内存范围不同,目前通常需要两套程序才能完成基于32位操作系统和基于64位操作系统的挂钩函数,然而,通过上述方式挂钩函数,挂钩函数效率较低且兼容性较差。因此,提出一种新的挂钩函数方式是目前亟待解决的技术问题。
为了解决上述问题,本发明实施例提供了一种终端应用的挂钩方法,如图1所示,所述方法包括:
101、在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令。若为基于32位操作系统的短跳转指令,则执行步骤102;若基于64位操作系统的短跳转指令,则执行步骤104。
其中,所述新函数可以为待所述目标函数挂钩的函数。识别所述跳转指令是否为基于32位操作系统的短跳转指令的过程可以为:首先识别所述跳转指令是否为基于32位操作系统的跳转指令,若是基于32位操作系统的跳转指令,然后再根据为所述跳转指令申请的内存范围,识别所述基于32位操作系统的跳转指令是否为基于32位操作系统的短跳转指令,若申请的内存范围小于16M,则确定为基于32位操作系统的Thumb短跳转指令;若申请的内存范围小于32M,则确定为基于32位操作系统的Arm短跳转指令。
此外,识别是否为基于64位操作系统的短跳转指令的过程可以为:首先识别所述跳转指令是否为基于64位操作系统的跳转指令,若是基于64位操作系统的跳转指令,然后再根据为所述跳转指令申请的内存范围,识别所述基于64位操作系统的跳转指令是否为基于64位操作系统的短跳转指令,若申请的内存范围小于128M,则确定为基于364位操作系统的短跳转指令。
102、优先利用32位短跳转策略实现挂钩所述新函数。
其中,所述32位短跳转策略可以为:将所述目标函数的机器码指令替换为基于32位操作系统的短跳转指令,即将所述目标函数的前4个字节指令替换为基于32位操作系统的短跳转指令;然后跳转到申请的内存地址,执行新函数,在执行完新函数,翻译并执行所述前4个字节指令,在执行完所述前4个字节指令,写入所述短跳转指令,以跳回所述目标函数。
103、在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数。
在本发明实施例中,由于短跳转策略挂钩函数,会受跳转范围限制,即基于32位操作系统的跳转指令为Arm跳转指令时,申请的内存范围大于32M,基于32位操作系统的跳转指令为Thumb跳转指令时,申请的内存范围大于16M,利用所述32位短跳转策略挂钩函数会失败,此时,将所述跳转指令识别为基于32位操作系统的长跳转指令,然后利用32位长跳转策略实现挂钩所述新函数。通过优先利用32位短跳转策略实现挂钩所述新函数,然后在失败的情况下,利用32位长跳转策略实现挂钩所述新函数,可以实现根据实际需求切换挂钩模式,且能够避免内存浪费。
其中,所述32位长跳转策略可以为:将所述目标函数的前8个字节指令替换为基于32位操作系统的长跳转指令;然后跳转到申请的内存地址,执行新函数,在执行完新函数,翻译并执行所述前8个字节指令,在执行完所述前8个字节指令,写入所述长跳转指令,以跳回所述目标函数。
104、利用64位短跳转策略实现挂钩所述新函数。
其中,所述64位短跳转策略可以为:将所述目标函数的机器码指令替换为基于64位操作系统的短跳转指令,即将所述目标函数的前4个字节指令替换为基于64位操作系统的短跳转指令;然后跳转到申请的内存地址,执行新函数,在执行完新函数,翻译并执行所述前4个字节指令,在执行完所述前4个字节指令,写入所述短跳转指令,以跳回所述目标函数。
本发明实施例提供的一种终端应用的挂钩方法,与目前在通常需要两套程序才能完成基于32位操作系统和基于64位操作系统的挂钩函数相比,本发明实施例提供一种新的挂钩函数方式,在移动终端的应用调用目标函数时,能够识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;若为基于32位操作系统的短跳转指令,能够优先利用32位短跳转策略实现挂钩所述新函数;在利用所述32位短跳转策略挂钩失败后,能够利用32位长跳转策略实现挂钩所述新函数;若基于64位操作系统的短跳转指令,则能够利用64位短跳转策略实现挂钩所述新函数,从而能够兼容基于32位操作系统和基于64位操作系统的挂钩函数,提升挂钩函数效率且提升挂钩兼容性。此外,由于在终端应用中添加新函数,操作系统就可以在无需root的情况下,根据用户自己实际的需要,利用新函数,对终端应用的某些功能进行更改、添加或删除,以提高终端应用的功能,使终端应用的功能多样化,能够适应不同用户的不同需求同时,通过在终端应用中添加新函数的方式,能够主动防御攻击的作用,提升终端应用的安全性。
进一步的,为了更好的说明上述终端应用的挂钩方法的过程,作为对上述实施例的细化和扩展,本发明实施例提供了另一种终端应用的挂钩方法,如图2所示,但不限于此,具体如下所示:
201、在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令。若为基于32位操作系统的短跳转指令,则执行步骤202a;若基于32位操作系统的长跳转指令,则执行步骤202b;若基于64位操作系统的短跳转指令,则执行步骤202c。
如图3所示,在本发明实施例中,为了识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,识别过程具体可以包括:识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的跳转指令;根据所述目标函数地址为所述跳转指令申请内存;若为基于32位操作系统的跳转指令,则确定申请的内存是否符合第一短跳转范围;若符合第一短跳转范围,则确定所述基于32位操作系统的跳转指令为基于32位操作系统的短跳转指令。其中,所述短跳转指令可以为b跳转指令或者b.w跳转指令。所述第一短跳转范围可以为小于32M的内存跳转范围或者16M的内存跳转范围。即若基于32位操作系统的b跳转指令申请的内存小于32M的内存跳转范围,则确定所述基于32位操作系统的跳转指令为基于32位操作系统的Arm短跳转指令。若基于32位操作系统的跳转指令申请的内存小于16M的内存跳转范围,则确定所述基于32位操作系统的b.w跳转指令为基于32位操作系统的Thumb短跳转指令。实现挂钩函数所对应的策略为32位短跳转策略,即利用32位短跳转策略实现挂钩所述新函数,步骤202a-204a可以为利用32位短跳转策略实现挂钩所述新函数的过程。
此外,若所述跳转指令为Ldr/Ldr.w跳转指令,基于32位操作系统的跳转指令申请的内存大于32M的内存跳转范围,或者大于16M的内存跳转范围,则确定所述基于32位操作系统的跳转指令为基于32位操作系统的长跳转指令。实现挂钩函数所对应的策略为32位长跳转策略,即利用32位长跳转策略实现挂钩所述新函数,步骤202b-204b可以为利用32位长跳转策略实现挂钩所述新函数的过程。
在本发明实施例中,为了识别从所述目标函数跳转到新函数的跳转指令是否为基于64位操作系统的短跳转指令,识别过程具体可以包括:识别从所述目标函数跳转到新函数的跳转指令是否为基于64位操作系统的跳转指令;根据所述目标函数地址为所述跳转指令申请内存;若为基于64位操作系统的跳转指令,则确定申请的内存是否符合第二短跳转范围;若符合第二短跳转范围,则确定所述基于64位操作系统的跳转指令为基于64位操作系统的短跳转指令。其中,所述跳转指令可以为b跳转指令,所述第二短跳转范围可以为小于128M的内存跳转范围。即若基于64位操作系统的跳转指令申请的内存小于128M的内存跳转范围,则确定所述基于64位操作系统的跳转指令为基于64位操作系统的短跳转指令。实现挂钩函数所对应的策略为64位短跳转策略,即利用64位短跳转策略实现挂钩所述新函数,步骤202c-204c可以为利用64位短跳转策略实现挂钩所述新函数的过程。
需要说明的是,为了避免内存浪费,申请较多的内存,所述根据所述目标函数地址为所述跳转指令申请内存的步骤具体可以包括:检测是否存在符合条件的内存;若存在,根据预设的优先占满符合条件的内存原则和所述目标函数地址为所述跳转指令申请内存。通过预设的优先占满符合条件的内存,可以实现将可利用的空闲内存占用上,避免内存浪费。
此外,为了为所述跳转指令申请到合适的内存,所述根据所述目标函数地址为所述跳转指令申请内存,具体包括:以所述目标函数地址为开始,以预设字节为单位向前向后申请原则为所述跳转指令申请内存。所述预设字节10k,即依次10k为单位向前向后申请原则为所述跳转指令申请内存。
202a、将所述目标函数的前4个字节指令替换为所述基于32位操作系统的短跳转指令,以跳转到为所述基于32位操作系统的短跳转指令申请的内存地址,并执行所述新函数。
其中,所述基于32位操作系统的短跳转指令可以为基于32位操作系统的Arm短跳转指令,也可以为基于32位操作系统的Thumb短跳转指令。若基于32位操作系统的短跳转指令为Thumb短跳转指令,则采用预设自解析原则,将所述目标函数的前4个字节指令替换为的Thumb短跳转指令。所述预设自解析原则可以为自行解析需要挂钩目标函数的头部字节数。由于Thumb操作码(opcode)默认长度等于2。当opcode高5位,且高位值在0x1D~0x1F区间,那么opcode等于4。通过解析opcode后,挂钩的尾部字节数可以为2个字节或者4个字节,最终挂钩的字节数范围可能值为4~12字节。
对于本发明实施例,为了支持自定义汇编代码功能,技术人员还可以预先写入自定义的汇编代码,在将所述目标函数的前4个字节指令替换为所述基于32位操作系统的短跳转指令,或者执行完所述新函数之后,所述方法还可以包括:执行自定义的汇编代码,以实现所述汇编代码对应的功能;在执行完汇编代码后,翻译并执行所述前4个字节指令;在执行完所述前4个字节指令后,跳回所述目标函数。通过自定义的汇编代码功能,可以使得技术人员或者开发者随意控制挂钩流程,如可监控函数调用等辅流程,具体地,可以通过自定义汇编代码功能定制实现基于安卓系统的艺术挂钩技术方案(android art hook)。
203a、在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前4个字节指令。
在本发明实施例中,可以通过检测是否存在继续调用所述目标函数的权限,或者检测是否需要监控所述目标函数的操作行为,来确定是否需要继续调用所述目标函数。若检测不需要继续调用所述目标函数,可以直接结束所述目标函数。翻译所述机器码指令的过程可以为将所述机器码指令翻译成处理器可以执行的二进制码。
204a、在执行完所述前4个字节指令后,跳回所述目标函数。
需要说明的是,可以在前4个字节指令地址后,写入所述短跳转指令,跳回所述目标函数。例如,所述机器码指令为前4个字节指令,可以在目标函数首地址+4个字节的内存地址后写入所述短跳转指令。
在本发明实施例中,步骤202a-204a所对应的32位短跳转策略,还可以如图4所示:
步骤1、在移动终端的应用调用目标函数时,识别从所述目标函数跳转新函数的短跳转指令,若识别到基于32位操作系统的b指令,确定所述b指令为基于32位操作系统的arm短跳转指令,所跳转的内存范围小于32M,则跳转到步骤3。
步骤2、在移动终端的应用调用目标函数时,若识别到基于32位操作系统的b.w指令,确定所述b.w指令为基于32位操作系统的thumb短跳转指令,所跳转的内存范围小于16M,则跳转到步骤3;
步骤3、将所述目标函数的前4个字节指令替换为步骤1或者步骤2所述的短跳转指令;
步骤4、跳转到根据所述短跳转指令申请的内存地址,并执行所述新函数;
步骤5、执行自定义汇编代码,在执行完自定义汇编代码后,跳转到步骤7;
步骤6、判断是否继续调用目标函数;若继续调用,则跳转到步骤7;若不继续调用,则结束所述目标函数;
步骤7、翻译所述目标函数的前4个字节指令并进行执行;
步骤8、在执行完前4个字节指令后,若所述目标函数的原地址指令不对齐,通过Nop指令对齐所述原地址,并在目标函数首地址+4的位置上写入短跳转指令b/b.w指令;
步骤9、跳回所述目标函数。
与步骤202a并列的步骤202b、将所述目标函数的前8个字节指令替换为所述基于32位操作系统的长跳转指令,以跳转到为所述基于32位操作系统的长跳转指令申请的内存地址,并执行所述新函数。
对于本发明实施例,为了支持自定义汇编代码功能,技术人员还可以预先写入自定义的汇编代码,在将所述目标函数的前8个字节指令替换为所述基于32位操作系统的长跳转指令,或者执行完所述新函数之后,所述方法还可以包括:执行自定义的汇编代码,以实现所述汇编代码对应的功能;在执行完汇编代码后,翻译并执行所述前8个字节指令;在执行完所述前8个字节指令后,跳回所述目标函数。通过自定义的汇编代码功能,可以使得技术人员或者开发者随意控制挂钩流程,如可监控函数调用等辅流程,具体地,可以通过自定义汇编代码功能定制实现android art hoo。
203b、在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前8个字节指令。
204b、在执行完所述前8个字节指令后,跳回所述目标函数。
需要说明的是,可以在前8个字节指令地址后,写入所述长跳转指令,跳回所述目标函数。例如,所述机器码指令为前8个字节指令,可以在目标函数首地址+8个字节的内存地址后写入所述短跳转指令。
在本发明实施例中,步骤202b-204b所对应的32位长跳转策略,在32位系统中,当且仅当无法使用短跳转方案来实现hook时,才会采用此方案。具体可以如图5所示:
步骤1、在移动终端的应用调用目标函数时,识别从所述目标函数跳转新函数的短跳转指令,若识别到基于32位操作系统的长跳转指令:Ldr/Ldr.w长跳转指令,则跳转到步骤2。
步骤2、将所述目标函数的前8个字节指令替换为步骤1所述的长跳转指令;
步骤3、跳转到根据所述长跳转指令申请的内存地址,并执行所述新函数;
步骤4、执行自定义汇编代码,在执行完自定义汇编代码后,跳转到步骤6;
步骤5、判断是否继续调用目标函数;若继续调用,则跳转到步骤6;若不继续调用,则结束所述目标函数;
步骤6、翻译所述目标函数的前8个字节指令并进行执行;
步骤8、在执行完前8个字节指令后,若所述目标函数的原地址指令不对齐,通过Nop指令对齐所述原地址,并在目标函数首地址+8的位置上写入Ldr/Ldr.w长跳转指令;
步骤9、跳回所述目标函数。
与步骤202a、202b并列的步骤202c、将所述目标函数的前4个字节指令替换为所述基于64位操作系统的短跳转指令,以跳转到为所述基于64位操作系统的短跳转指令申请的内存地址,并执行所述新函数。
对于本发明实施例,为了支持自定义汇编代码功能,技术人员还可以预先写入自定义的汇编代码,在将所述目标函数的前4个字节指令替换为所述基于64位操作系统的短跳转指令,或者执行完所述新函数之后,所述方法还可以包括:执行自定义的汇编代码,以实现所述汇编代码对应的功能;在执行完汇编代码后,翻译并执行所述前4个字节指令;在执行完所述前4个字节指令后,跳回所述目标函数。通过自定义的汇编代码功能,可以使得技术人员或者开发者随意控制挂钩流程,如可监控函数调用等辅流程,具体地,可以通过自定义汇编代码功能定制实现android art hook。
203c、在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前4个字节指令。
204c、在执行完所述前4个字节指令后,跳回所述目标函数。
在本发明实施例中,步骤202c-204c所对应的64位短跳转策略,Arm 64位hook采用4个字节b指令,限制跳转范围为128M内存跳转范围。实际应用过程中,无论是注入第三方进程挂钩还是本地进程挂钩。通过内存分配机制,在128M范围内可申请成功。具体可以如图6所示:
步骤1、在移动终端的应用调用目标函数时,识别从所述目标函数跳转新函数的短跳转指令,若识别到基于64位操作系统的b指令,所跳转的内存范围小于128M,则跳转到步骤2;
步骤2、将所述目标函数的前4个字节指令替换为步骤1所述的短跳转指令;
步骤3、跳转到根据所述短跳转指令申请的内存地址,并执行所述新函数;在执行新函数之前,可以先长跳转到新申请的内存地址1,由于长跳转没有跳转范围限制,然后在短跳转到新申请的内存地址2,执行所述新函数;
步骤4、执行自定义汇编代码,在执行完自定义汇编代码后,跳转到步骤6;
步骤5、判断是否继续调用目标函数;若继续调用,则跳转到步骤6;若不继续调用,则结束所述目标函数;
步骤6、翻译所述目标函数的前4个字节指令并进行执行;
步骤7、在执行完前4个字节指令后,若所述目标函数的原地址指令不对齐,通过Nop指令对齐所述原地址,并在目标函数首地址+4的位置上写入短跳转指令b/b.w指令;
步骤8、跳回所述目标函数。
需要说明的是,可以通过写入短跳转指令或者长跳转指令的方式,跳回所述目标函数,若实现利用32位短跳转策略或者利用64位短跳转策略实现挂钩所述新函数,可以通过写入短跳转指令跳回所述目标函数;若实现利用32位长跳转策略实现挂钩所述新函数,可以通过写入长跳转指令跳回所述目标函数;为了避免因字节不对齐产生的崩溃等异常情况,在写入所述短跳转指令或者所述长跳转指令之前,所述方法还可以包括:判断所述目标函数所对应的原地址是否对齐;若不对齐,则通过对齐nop指令将所述地址对齐。然后,在对齐所述地址后,写入短跳转指令或者长跳转指令,以实现跳回所述目标函数。
对于本发明实施例,为了证在执行完前4个字节指令或者前8个字节指令后,成功写入用于跳转回到所述目标函数的短跳转指令或者长跳转指令,所述方法还支持修改内存属性的功能,包括:通过调用修改保护mprotect函数,将内存属性修改为可读、可写、可执行的属性。
对于本发明实施例,为了保证成功跳回所述目标函数,执行所述目标函数,所述方法还支持刷新缓存的功能,包括:通过调用缓存刷新cacheflush函数刷新缓冲区。
需要说明的是,本发明的技术方案可以应用在分身应用上,例如通过上述挂钩函数方案,对分身应用的某些功能进行更改、添加或删除,以提高分身应用的功能,使分身应用的功能多样化,能够适应不同用户的不同需求。还可以应用在javahook上,本发明实施例不做限定。本发明的技术方案可以改变服务框架的原生ART hook机制,在操作系统无需Root的情况下,实现对应用功能的增强。其中,ART虚拟机库相比Dalvik虚拟机,使用预编译技术(Adead-of-Time compile)取代Dalvik中的即时编译技术,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用,这样的话,应用的启动(首次)和执行都会变得更加快速。ART hook相关文件可以包含Java函数以及相应的Java函数代码数据,该Java函数可以用以实现对应用功能的增强。在本发明实施例中的应用可以为系统应用、第三方应用、分身应用等,具体可以为游戏应用、购物应用、视频应用、搜索应用等。
对于本发明实施例的执行主体可以为用于实现在操作系统无需Root的情况下更新应用功能的应用优化装置。在确定应用所在操作系统采用ART虚拟机库模式后,可以对在服务框架原生ART hook相关文件上进行适配,修改其中的函数,使得服务框架插件在需要对应用的功能进行更新时,能够依赖该新生ART hook相关文件的代码数据。
在本发明实施例中,为了实现服务框架插件能够调用新生ART hook相关文件中的代码数据,需要先将服务框架插件的代码进行适配,然后将适配后的代码与新生ART hook相关文件注入到应用中,使得在服务框架插件实现对应用增强功能时采用新的ART hook机制,不采用原生的ART hook机制,进而实现在操作系统无需Root的情况下更新应用功能。同时,通过在终端应用中添加新函数的方式,能够起到主动防御攻击的作用,提升终端应用的安全性。
需要说明的是,为了实现增强终端应用本身的功能,可以通过Root替换了操作系统的应用进程处理文件(app process),该文件是所有系统和第三方应用的启动文件;在较新的操作系统中通常采用的ART虚拟机库机制当应用需要启动时,还需要利用上述这个应用进程处理文件,加载新的ART虚拟机库libart.so文件,进而可以通过Xposed插件基于libart.so文件数据对应用的某些功能进行更改、添加或删除等,以增强终端应用的功能。
本发明实施例提供的另一种终端应用的挂钩方法,与目前在通常需要两套程序才能完成基于32位操作系统和基于64位操作系统的挂钩函数相比,本发明实施例提供一种新的挂钩函数方式,在移动终端的应用调用目标函数时,能够识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;若为基于32位操作系统的短跳转指令,能够优先利用32位短跳转策略实现挂钩所述新函数;在利用所述32位短跳转策略挂钩失败后,能够利用32位长跳转策略实现挂钩所述新函数;若基于64位操作系统的短跳转指令,则能够利用64位短跳转策略实现挂钩所述新函数,从而能够兼容基于32位操作系统和基于64位操作系统的挂钩函数,提升挂钩函数效率且提升挂钩兼容性。
进一步地,作为图1的具体实现,本发明实施例提供了一种终端应用的挂钩装置,如图7所示,所述装置包括:识别单元31和挂钩函数32。
所述识别单元31,可以用于在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数。所述识别单元31是本装置中识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令的主要功能模块,也是本装置的核心模块。
所述挂钩单元32,可以用于若所述识别单元31识别所述跳转指令为基于32位操作系统的短跳转指令,则优先利用32位短跳转策略实现挂钩所述新函数。所述挂钩单元32是本装置中优先利用32位短跳转策略实现挂钩所述新函数的主要功能模块。
所述挂钩单元32,还可以用于在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数。所述挂钩单元32还是利用32位长跳转策略实现挂钩所述新函数的主要功能模块。
所述挂钩单元32,还可以用于若所述识别单元31识别所述跳转指令为基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数。所述挂钩单元32还是利用64位短跳转策略实现挂钩所述新函数的主要功能模块。
如图8所示,对于本发明实施例,为了实现识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述识别单元31包括:识别模块311、申请模块312和确定模块313。
所述识别模块311,可以用于识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的跳转指令。
所述申请模块312,可以用于根据所述目标函数地址为所述跳转指令申请内存。
所述确定模块313,可以用于若所述识别模块311识别所述跳转指令为基于32位操作系统的跳转指令,则确定申请的内存是否符合第一短跳转范围。
所述确定模块313,还用于若确定申请的内存符合第一短跳转范围,则确定所述基于32位操作系统的跳转指令为基于32位操作系统的短跳转指令。
所述识别模块311,还可以用于识别从所述目标函数跳转到新函数的跳转指令是否为基于64位操作系统的跳转指令。
所述确定模块313,还用于若所述识别模块311识别所述跳转指令为基于64位操作系统的跳转指令,则确定申请的内存是否符合第二短跳转范围。
所述确定模块313,还用于若申请的内存符合第二短跳转范围,则确定所述基于64位操作系统的跳转指令为基于64位操作系统的短跳转指令。
对于本发明实施例,所述挂钩单元32包括:替换模块321、翻译模块322和跳回模块323。
所述替换模块321,可以用于将所述目标函数的前4个字节指令替换为所述基于32位操作系统的短跳转指令,以跳转到为所述基于32位操作系统的短跳转指令申请的内存地址,并执行所述新函数。
所述翻译模块322,可以用于在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前4个字节指令。
所述跳回模块323,可以用于在执行完所述前4个字节指令后,跳回所述目标函数。
所述替换模块321,具体还可以用于识别所述基于32位操作系统的短跳转指令是否为Thumb短跳转指令;若为Thumb短跳转指令,则采用预设自解析原则,将所述目标函数的前4个字节指令替换为的Thumb短跳转指令。
所述替换模块321,还可以用于将所述跳转指令确定为基于32位操作系统的长跳转指令;将所述目标函数的前8个字节指令替换为所述基于32位操作系统的长跳转指令,以跳转到为所述基于32位操作系统的长跳转指令申请的内存地址,并执行所述新函数。
所述翻译模块322,还可以用于在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前8个字节指令。
所述跳回模块323,还可以用于在执行完所述前8个字节指令后,跳回所述目标函数。
所述替换模块321,还可以用于将所述目标函数的前4个字节指令替换为所述基于64位操作系统的短跳转指令,以跳转到为所述基于64位操作系统的短跳转指令申请的内存地址,并执行所述新函数。
所述翻译模块322,还可以用于在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前4个字节指令;
所述跳回模块323,还可以用于在执行完所述前4个字节指令后,跳回所述目标函数。
对于本发明实施例,还支持自定义汇编代码功能,所述挂钩函数还包括:执行模块324。
所述执行模块324,可以用于执行自定义的汇编代码,以实现所述汇编代码对应的功能;并在执行完汇编代码后,翻译并执行所述前4个字节指令;并在执行完所述前4个字节指令后,跳回所述目标函数。
所述执行模块324,还可以用于执行自定义的汇编代码,以实现所述汇编代码对应的功能;在执行完汇编代码后,翻译并执行所述前8个字节指令;并在执行完所述前8个字节指令后,跳回所述目标函数。
为了避免内存浪费,申请较多的内存,所述申请模块312,具体可以用于检测是否存在符合条件的内存;若存在,根据预设的优先占满符合条件的内存原则和所述目标函数地址为所述跳转指令申请内存。
为了为所述跳转指令申请到合适的内存,所述申请模块,具体用于以所述目标函数地址为开始,以预设字节为单位向前向后申请原则为所述跳转指令申请内存。
需要说明的是,本发明实施例提供的一种挂钩函数所涉及各功能单元的其他相应描述,可以参考图1中的对应描述,在此不再赘述。
基于上述如图1所示方法,相应的,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;若为基于32位操作系统的短跳转指令,则优先利用32位短跳转策略实现挂钩所述新函数;在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数;若基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数。
基于上述如图1所示方法和如图7所示终端应用的挂钩装置的实施例,本发明实施例还提供了一种终端应用的挂钩装置的实体结构,如图9所示,该装置包括:处理器41、存储器42、及存储在存储器42上并可在处理器上运行的计算机程序,所述处理器41执行所述程序时实现以下步骤:在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;若为基于32位操作系统的短跳转指令,则优先利用32位短跳转策略实现挂钩所述新函数;在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数;若基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数。该装置还包括:总线43,被配置为耦接处理器41及存储器42。
通过本发明的上述技术方案,能够实现基于32位操作系统和基于64位操作系统在短跳转下挂钩函数,基于32位操作系统在长跳转下挂钩函数,从而能够提升挂钩函数的成功率。同时可以解决基于32位操作系统,基于64位操作系统挂钩函数不兼容的问题,能够兼容基于32位操作系统和基于64位操作系统的挂钩函数,提升挂钩函数效率且提升挂钩兼容性。此外,由于在终端应用中添加新函数,操作系统就可以在无需root的情况下,根据用户自己实际的需要,利用新函数,对终端应用的某些功能进行更改、添加或删除,以提高终端应用的功能,使终端应用的功能多样化,能够适应不同用户的不同需求同时,通过在终端应用中添加新函数的方式,能够主动防御攻击的作用,提升终端应用的安全性。
本发明还提供如下技术方案:
A1、一种终端应用的挂钩方法,包括:
在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;
若为基于32位操作系统的短跳转指令,则优先利用32位短跳转策略实现挂钩所述新函数;
在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数;
若基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数。
A2、如A1所述的方法,所述识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,具体包括:
识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的跳转指令;
根据所述目标函数地址为所述跳转指令申请内存;
若为基于32位操作系统的跳转指令,则确定申请的内存是否符合第一短跳转范围;
若符合第一短跳转范围,则确定所述基于32位操作系统的跳转指令为基于32位操作系统的短跳转指令。
A3、如A1所述的方法,所述识别从所述目标函数跳转到新函数的跳转指令是否为基于64位操作系统的短跳转指令,具体包括:
识别从所述目标函数跳转到新函数的跳转指令是否为基于64位操作系统的跳转指令;
若为基于64位操作系统的跳转指令,则确定申请的内存是否符合第二短跳转范围;
若符合第二短跳转范围,则确定所述基于64位操作系统的跳转指令为基于64位操作系统的短跳转指令。
A4、如A1所述的方法,所述优先利用32位短跳转策略实现挂钩所述新函数,具体包括:
将所述目标函数的前4个字节指令替换为所述基于32位操作系统的短跳转指令,以跳转到为所述基于32位操作系统的短跳转指令申请的内存地址,并执行所述新函数;
在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前4个字节指令;
在执行完所述前4个字节指令后,跳回所述目标函数。
A5、如A4所述的方法,所述将所述目标函数的前4个字节指令替换为所述基于32位操作系统的短跳转指令,具体包括:
识别所述基于32位操作系统的短跳转指令是否为Thumb短跳转指令;
若为Thumb短跳转指令,则采用预设自解析原则,将所述目标函数的前4个字节指令替换为的Thumb短跳转指令。
A6、如A1所述的方法,所述在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略挂钩所述新函数,具体包括:
将所述跳转指令确定为基于32位操作系统的长跳转指令;
将所述目标函数的前8个字节指令替换为所述基于32位操作系统的长跳转指令,以跳转到为所述基于32位操作系统的长跳转指令申请的内存地址,并执行所述新函数;
在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前8个字节指令;
在执行完所述前8个字节指令后,跳回所述目标函数。
A7、如A1所述的方法,所述利用64位短跳转策略实现挂钩所述新函数,具体包括:
将所述目标函数的前4个字节指令替换为所述基于64位操作系统的短跳转指令,以跳转到为所述基于64位操作系统的短跳转指令申请的内存地址,并执行所述新函数;
在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前4个字节指令;
在执行完所述前4个字节指令后,跳回所述目标函数。
A8、如A4或A7任一项所述的方法,所述方法还包括:
执行自定义的汇编代码,以实现所述汇编代码对应的功能;
在执行完汇编代码后,翻译并执行所述前4个字节指令;
在执行完所述前4个字节指令后,跳回所述目标函数。
A9、如A6所述的方法,所述方法还包括:
执行自定义的汇编代码,以实现所述汇编代码对应的功能;
在执行完汇编代码后,翻译并执行所述前8个字节指令;
在执行完所述前8个字节指令后,跳回所述目标函数。
A10、如A2或A3任一项所述的方法,所述根据所述目标函数地址为所述跳转指令申请内存,具体包括:
检测是否存在符合条件的内存;
若存在,根据预设的优先占满符合条件的内存原则和所述目标函数地址为所述跳转指令申请内存。
A11、如A2或A3任一项所述的方法,所述根据所述目标函数地址为所述跳转指令申请内存,具体包括:
以所述目标函数地址为开始,以预设字节为单位向前向后申请原则为所述跳转指令申请内存。
B12、一种终端应用的挂钩装置,包括:
识别单元,用于在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;
挂钩单元,用于若所述识别单元识别所述跳转指令为基于32位操作系统的短跳转指令,优先利用32位短跳转策略实现挂钩所述新函数;
所述挂钩单元,还用于在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数;
所述挂钩单元,还用于若所述识别单元识别所述跳转指令为基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数。
B13、如B12所述的装置,所述识别单元包括:
识别模块,用于识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的跳转指令;
申请模块,用于根据所述目标函数地址为所述跳转指令申请内存;
确定模块,用于若所述识别模块识别所述跳转指令为基于32位操作系统的跳转指令,则确定申请的内存是否符合第一短跳转范围;
所述确定模块,还用于若确定申请的内存符合第一短跳转范围,则确定所述基于32位操作系统的跳转指令为基于32位操作系统的短跳转指令。
B14、如B12所述的装置,所述识别单元包括:
识别模块,用于识别从所述目标函数跳转到新函数的跳转指令是否为基于64位操作系统的跳转指令;
确定模块,用于若所述识别模块识别所述跳转指令为基于64位操作系统的跳转指令,则确定申请的内存是否符合第二短跳转范围;
所述确定模块,还用于若申请的内存符合第二短跳转范围,则确定所述基于64位操作系统的跳转指令为基于64位操作系统的短跳转指令。
B15、如B12所述的装置,所述挂钩单元包括:
替换模块,用于将所述目标函数的前4个字节指令替换为所述基于32位操作系统的短跳转指令,以跳转到为所述基于32位操作系统的短跳转指令申请的内存地址,并执行所述新函数;
翻译模块,用于在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前4个字节指令;
跳回模块,用于在执行完所述前4个字节指令后,跳回所述目标函数。
B16、如B14所述的装置,
所述替换模块,用于识别所述基于32位操作系统的短跳转指令是否为Thumb短跳转指令;若为Thumb短跳转指令,则采用预设自解析原则,将所述目标函数的前4个字节指令替换为的Thumb短跳转指令。
B17、如B12所述的装置,所述挂钩单元包括:
替换模块,用于将所述跳转指令确定为基于32位操作系统的长跳转指令;将所述目标函数的前8个字节指令替换为所述基于32位操作系统的长跳转指令,以跳转到为所述基于32位操作系统的长跳转指令申请的内存地址,并执行所述新函数;
翻译模块,用于在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前8个字节指令;
跳回模块,用于在执行完所述前8个字节指令后,跳回所述目标函数。
B18、如B12所述的装置,所述挂钩单元包括:
替换模块,用于将所述目标函数的前4个字节指令替换为所述基于64位操作系统的短跳转指令,以跳转到为所述基于64位操作系统的短跳转指令申请的内存地址,并执行所述新函数;
翻译模块,用于在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前4个字节指令;
跳回模块,用于在执行完所述前4个字节指令后,跳回所述目标函数。
B19、如B14或B18任一项所述的装置,所述挂钩函数还包括:
执行模块,用于执行自定义的汇编代码,以实现所述汇编代码对应的功能;并在执行完汇编代码后,翻译并执行所述前4个字节指令;并在执行完所述前4个字节指令后,跳回所述目标函数。
B20、如B17所述的装置,所述挂钩函数还包括:
执行模块,用于执行自定义的汇编代码,以实现所述汇编代码对应的功能;在执行完汇编代码后,翻译并执行所述前8个字节指令;并在执行完所述前8个字节指令后,跳回所述目标函数。
B21、如B13或B14任一项所述的装置,
所述申请模块,具体用于检测是否存在符合条件的内存;若存在,根据预设的优先占满符合条件的内存原则和所述目标函数地址为所述跳转指令申请内存。
B22、如B13或B14任一项所述的装置,
所述申请模块,具体用于以所述目标函数地址为开始,以预设字节为单位向前向后申请原则为所述跳转指令申请内存。
C23、一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:
在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;
若为基于32位操作系统的短跳转指令,则优先利用32位短跳转策略实现挂钩所述新函数;
在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数;
若基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数。
D24、一种终端应用的挂钩装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤:
在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;
若为基于32位操作系统的短跳转指令,则优先利用32位短跳转策略实现挂钩所述新函数;
在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数;
若基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
可以理解的是,上述方法及装置中的相关特征可以相互参考。另外,上述实施例中的“第一”、“第二”等是用于区分各实施例,而并不代表各实施例的优劣。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的应用程序的运行性能分析装置及系统中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。

Claims (22)

1.一种终端应用的挂钩方法,其特征在于,包括:
在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;
若为基于32位操作系统的短跳转指令,则优先利用32位短跳转策略实现挂钩所述新函数;
在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数;
若基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数;
其中,所述优先利用32位短跳转策略实现挂钩所述新函数,具体包括:
将所述目标函数的前4个字节指令替换为所述基于32位操作系统的短跳转指令,以跳转到为所述基于32位操作系统的短跳转指令申请的内存地址,并执行所述新函数;
在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前4个字节指令;
在执行完所述前4个字节指令后,跳回所述目标函数。
2.根据权利要求1所述的方法,其特征在于,所述识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,具体包括:
识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的跳转指令;
根据所述目标函数地址为所述跳转指令申请内存;
若为基于32位操作系统的跳转指令,则确定申请的内存是否符合第一短跳转范围;
若符合第一短跳转范围,则确定所述基于32位操作系统的跳转指令为基于32位操作系统的短跳转指令。
3.根据权利要求1所述的方法,其特征在于,所述识别从所述目标函数跳转到新函数的跳转指令是否为基于64位操作系统的短跳转指令,具体包括:
识别从所述目标函数跳转到新函数的跳转指令是否为基于64位操作系统的跳转指令;
若为基于64位操作系统的跳转指令,则确定申请的内存是否符合第二短跳转范围;
若符合第二短跳转范围,则确定所述基于64位操作系统的跳转指令为基于64位操作系统的短跳转指令。
4.根据权利要求1所述的方法,其特征在于,所述将所述目标函数的前4个字节指令替换为所述基于32位操作系统的短跳转指令,具体包括:
识别所述基于32位操作系统的短跳转指令是否为Thumb短跳转指令;
若为Thumb短跳转指令,则采用预设自解析原则,将所述目标函数的前4个字节指令替换为的Thumb短跳转指令。
5.根据权利要求1所述的方法,其特征在于,所述在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略挂钩所述新函数,具体包括:
将所述跳转指令确定为基于32位操作系统的长跳转指令;
将所述目标函数的前8个字节指令替换为所述基于32位操作系统的长跳转指令,以跳转到为所述基于32位操作系统的长跳转指令申请的内存地址,并执行所述新函数;
在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前8个字节指令;
在执行完所述前8个字节指令后,跳回所述目标函数。
6.根据权利要求1所述的方法,其特征在于,所述利用64位短跳转策略实现挂钩所述新函数,具体包括:
将所述目标函数的前4个字节指令替换为所述基于64位操作系统的短跳转指令,以跳转到为所述基于64位操作系统的短跳转指令申请的内存地址,并执行所述新函数;
在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前4个字节指令;
在执行完所述前4个字节指令后,跳回所述目标函数。
7.根据权利要求1或6所述的方法,其特征在于,所述方法还包括:
执行自定义的汇编代码,以实现所述汇编代码对应的功能;
在执行完汇编代码后,翻译并执行所述前4个字节指令;
在执行完所述前4个字节指令后,跳回所述目标函数。
8.根据权利要求5所述的方法,其特征在于,所述方法还包括:
执行自定义的汇编代码,以实现所述汇编代码对应的功能;
在执行完汇编代码后,翻译并执行所述前8个字节指令;
在执行完所述前8个字节指令后,跳回所述目标函数。
9.根据权利要求2或3所述的方法,其特征在于,所述根据所述目标函数地址为所述跳转指令申请内存,具体包括:
检测是否存在符合条件的内存;
若存在,根据预设的优先占满符合条件的内存原则和所述目标函数地址为所述跳转指令申请内存。
10.根据权利要求2或3所述的方法,其特征在于,所述根据所述目标函数地址为所述跳转指令申请内存,具体包括:
以所述目标函数地址为开始,以预设字节为单位向前向后申请原则为所述跳转指令申请内存。
11.一种终端应用的挂钩装置,其特征在于,包括:
识别单元,用于在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;
挂钩单元,用于若所述识别单元识别所述跳转指令为基于32位操作系统的短跳转指令,优先利用32位短跳转策略实现挂钩所述新函数;
所述挂钩单元,还用于在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数;
所述挂钩单元,还用于若所述识别单元识别所述跳转指令为基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数;
其中,所述挂钩单元包括:
替换模块,用于将所述目标函数的前4个字节指令替换为所述基于32位操作系统的短跳转指令,以跳转到为所述基于32位操作系统的短跳转指令申请的内存地址,并执行所述新函数;
翻译模块,用于在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前4个字节指令;
跳回模块,用于在执行完所述前4个字节指令后,跳回所述目标函数。
12.根据权利要求11所述的装置,其特征在于,所述识别单元包括:
识别模块,用于识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的跳转指令;
申请模块,用于根据所述目标函数地址为所述跳转指令申请内存;
确定模块,用于若所述识别模块识别所述跳转指令为基于32位操作系统的跳转指令,则确定申请的内存是否符合第一短跳转范围;
所述确定模块,还用于若确定申请的内存符合第一短跳转范围,则确定所述基于32位操作系统的跳转指令为基于32位操作系统的短跳转指令。
13.根据权利要求11所述的装置,其特征在于,所述识别单元包括:
识别模块,用于识别从所述目标函数跳转到新函数的跳转指令是否为基于64位操作系统的跳转指令;
确定模块,用于若所述识别模块识别所述跳转指令为基于64位操作系统的跳转指令,则确定申请的内存是否符合第二短跳转范围;
所述确定模块,还用于若申请的内存符合第二短跳转范围,则确定所述基于64位操作系统的跳转指令为基于64位操作系统的短跳转指令。
14.根据权利要求11所述的装置,其特征在于,
所述替换模块,还用于识别所述基于32位操作系统的短跳转指令是否为Thumb短跳转指令;若为Thumb短跳转指令,则采用预设自解析原则,将所述目标函数的前4个字节指令替换为的Thumb短跳转指令。
15.根据权利要求11所述的装置,其特征在于,
替换模块,还用于将所述跳转指令确定为基于32位操作系统的长跳转指令;将所述目标函数的前8个字节指令替换为所述基于32位操作系统的长跳转指令,以跳转到为所述基于32位操作系统的长跳转指令申请的内存地址,并执行所述新函数;
翻译模块,还用于在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前8个字节指令;
跳回模块,还用于在执行完所述前8个字节指令后,跳回所述目标函数。
16.根据权利要求11所述的装置,其特征在于,
替换模块,还用于将所述目标函数的前4个字节指令替换为所述基于64位操作系统的短跳转指令,以跳转到为所述基于64位操作系统的短跳转指令申请的内存地址,并执行所述新函数;
翻译模块,还用于在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前4个字节指令;
跳回模块,还用于在执行完所述前4个字节指令后,跳回所述目标函数。
17.根据权利要求13或16所述的装置,其特征在于,所述挂钩函数还包括:
执行模块,用于执行自定义的汇编代码,以实现所述汇编代码对应的功能;并在执行完汇编代码后,翻译并执行所述前4个字节指令;并在执行完所述前4个字节指令后,跳回所述目标函数。
18.根据权利要求15所述的装置,其特征在于,所述挂钩函数还包括:
执行模块,用于执行自定义的汇编代码,以实现所述汇编代码对应的功能;在执行完汇编代码后,翻译并执行所述前8个字节指令;并在执行完所述前8个字节指令后,跳回所述目标函数。
19.根据权利要求12所述的装置,其特征在于,
所述申请模块,具体用于检测是否存在符合条件的内存;若存在,根据预设的优先占满符合条件的内存原则和所述目标函数地址为所述跳转指令申请内存。
20.根据权利要求12所述的装置,其特征在于,
所述申请模块,具体用于以所述目标函数地址为开始,以预设字节为单位向前向后申请原则为所述跳转指令申请内存。
21.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现以下步骤:
在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;
若为基于32位操作系统的短跳转指令,则优先利用32位短跳转策略实现挂钩所述新函数;
在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数;
若基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数;
其中,所述优先利用32位短跳转策略实现挂钩所述新函数,具体包括:
将所述目标函数的前4个字节指令替换为所述基于32位操作系统的短跳转指令,以跳转到为所述基于32位操作系统的短跳转指令申请的内存地址,并执行所述新函数;
在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前4个字节指令;
在执行完所述前4个字节指令后,跳回所述目标函数。
22.一种终端应用的挂钩装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现以下步骤:
在移动终端的应用调用目标函数时,识别从所述目标函数跳转到新函数的跳转指令是否为基于32位操作系统的短跳转指令,或者是否为基于64位操作系统的短跳转指令,所述新函数为待所述目标函数挂钩的函数;
若为基于32位操作系统的短跳转指令,则优先利用32位短跳转策略实现挂钩所述新函数;
在利用所述32位短跳转策略挂钩失败后,利用32位长跳转策略实现挂钩所述新函数;
若基于64位操作系统的短跳转指令,则利用64位短跳转策略实现挂钩所述新函数;
其中,所述优先利用32位短跳转策略实现挂钩所述新函数,具体包括:
将所述目标函数的前4个字节指令替换为所述基于32位操作系统的短跳转指令,以跳转到为所述基于32位操作系统的短跳转指令申请的内存地址,并执行所述新函数;
在执行完所述新函数后,若确定需要继续调用所述目标函数,则翻译并执行所述前4个字节指令;
在执行完所述前4个字节指令后,跳回所述目标函数。
CN201711022165.9A 2017-10-26 2017-10-26 终端应用的挂钩方法及装置 Active CN107885529B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201711022165.9A CN107885529B (zh) 2017-10-26 2017-10-26 终端应用的挂钩方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201711022165.9A CN107885529B (zh) 2017-10-26 2017-10-26 终端应用的挂钩方法及装置

Publications (2)

Publication Number Publication Date
CN107885529A CN107885529A (zh) 2018-04-06
CN107885529B true CN107885529B (zh) 2021-06-22

Family

ID=61782727

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201711022165.9A Active CN107885529B (zh) 2017-10-26 2017-10-26 终端应用的挂钩方法及装置

Country Status (1)

Country Link
CN (1) CN107885529B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112559920B (zh) * 2020-12-23 2022-11-04 苏州三六零智能安全科技有限公司 基于跳转指令的hook方法、装置、设备及存储介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1838074A (zh) * 2006-02-22 2006-09-27 北京金山软件有限公司 一种64位视窗操作系统下获取函数参数的方法及系统
US20090013124A1 (en) * 2007-07-03 2009-01-08 Dsp Group Limited Rom code patch method
CN103885750A (zh) * 2014-04-04 2014-06-25 深圳市大成天下信息技术有限公司 在目标函数中挂钩新函数的装置、方法以及电子设备
CN105094870A (zh) * 2014-05-13 2015-11-25 中标软件有限公司 64位Linux操作系统兼容32位应用软件的方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1838074A (zh) * 2006-02-22 2006-09-27 北京金山软件有限公司 一种64位视窗操作系统下获取函数参数的方法及系统
US20090013124A1 (en) * 2007-07-03 2009-01-08 Dsp Group Limited Rom code patch method
CN103885750A (zh) * 2014-04-04 2014-06-25 深圳市大成天下信息技术有限公司 在目标函数中挂钩新函数的装置、方法以及电子设备
CN105094870A (zh) * 2014-05-13 2015-11-25 中标软件有限公司 64位Linux操作系统兼容32位应用软件的方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
MinHook - The Minimalistic x86/x64 API Hooking Library;Tsuda Kageyu;《https://www.codeproject.com/Articles/44326/MinHook-The-Minimalistic-x-x-API-Hooking-Libra》;20150317;第1-6页 *

Also Published As

Publication number Publication date
CN107885529A (zh) 2018-04-06

Similar Documents

Publication Publication Date Title
CN107908444B (zh) 终端应用的挂钩方法及装置
CN107077337B (zh) 用于执行根据两个指令集架构编译的应用编码的系统和方法
US8850573B1 (en) Computing device with untrusted user execution mode
CN107102944B (zh) 一种调用函数的分析方法及装置
CN108021357B (zh) 程序调用的优化方法及装置
US20040015972A1 (en) Executing native code in place of non-native code
JP2021022399A (ja) 後方互換性のためのなりすましcpuid
CN114756856B (zh) 一种基于函数动态载入的代码重用攻击防御方法
CN111428241A (zh) 一种多安全访问策略控制方法及计算设备
CN107885529B (zh) 终端应用的挂钩方法及装置
CN106997313B (zh) 一种应用程序的信号处理方法、系统及终端设备
CN107943517A (zh) 终端应用的挂钩方法及装置
CN107506623B (zh) 应用程序的加固方法及装置、计算设备、计算机存储介质
CN110609705B (zh) 一种提高mcu总线效率的方法、智能终端、存储介质及芯片
US9442724B2 (en) Start control apparatus for controlling a start of an information device by using an interrupt generation code, information device, and start control method
CN107861807B (zh) 程序调用的优化方法及装置
CN115309499A (zh) 虚拟机中数组处理方法、装置、电子设备及可读存储介质
CN110688320A (zh) 全局变量的检测方法、装置及终端设备
US8726244B2 (en) Software breakpoint handling by eliminating instruction replacement and execution under certain conditions
CN114902336B (zh) 具有子字段最小和最大箝位的内容可寻址存储器
US11893113B2 (en) Return-oriented programming protection
US11144329B2 (en) Processor microcode with embedded jump table
CN113254941A (zh) 一种Linux内核源码处理方法、装置和设备
CN113312088A (zh) 一种程序指令的执行方法及装置
CN110633137A (zh) 一种应用程序的安装包启动方法、装置及电子设备

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