CN110046479A - 一种基于安卓操作系统的链接库文件反调试方法及装置 - Google Patents

一种基于安卓操作系统的链接库文件反调试方法及装置 Download PDF

Info

Publication number
CN110046479A
CN110046479A CN201910216722.3A CN201910216722A CN110046479A CN 110046479 A CN110046479 A CN 110046479A CN 201910216722 A CN201910216722 A CN 201910216722A CN 110046479 A CN110046479 A CN 110046479A
Authority
CN
China
Prior art keywords
thread
debug
android
current thread
current
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.)
Granted
Application number
CN201910216722.3A
Other languages
English (en)
Other versions
CN110046479B (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.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen 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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201910216722.3A priority Critical patent/CN110046479B/zh
Publication of CN110046479A publication Critical patent/CN110046479A/zh
Application granted granted Critical
Publication of CN110046479B publication Critical patent/CN110046479B/zh
Active 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/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation

Abstract

本发明公开了一种基于安卓操作系统的链接库文件反调试方法及装置,所述方法包括:基于原生开发工具包设置反调试线程,所述反调试线程通过加载接口被加载,所述加载接口用于Android虚拟机加载所述链接库文件;所述反调试线程用于以轮询方式判断当前线程是否被调试;若所述当前线程被调试,则直接终止当前线程;将所述反调试线程通过所述原生开发工具包集成为独立组件;基于所述原生开发工具包将所述独立组件与相关应用软件打包成Android应用程序安装包。本发明通过在研发阶段实现反调试线程,从而使得包括反调试线程所在的独立组件的应用程序编译出来的应用程序安装包具有了反调试的能力,当黑客想分析应用程序安装包时,调试器挂载不上去,显著提高安全性。

Description

一种基于安卓操作系统的链接库文件反调试方法及装置
技术领域
本发明涉及黑客检测领域,尤其涉及应用于一种基于安卓操作系统的链接库文件反调试方法及装置。
背景技术
随着越来越多的基于Android操作系统的相关开发人员使用NDK开发程序,针对于基于Android操作系统的原生代码生成的链接库文件(so文件)的恶意调试,恶意篡改的方法也日益增多,较新版本的交互式反汇编器,比如IDA反汇编器等调试工具也都增加了对so文件的支持,从而降低了对so文件的调试和修改难度,如果so文件被篡改,则会有危害用户信息的风险。
为了避免so文件被轻易篡改,基于Android操作系统的代码编写人员需要研究反调试技术方案。反调试技术方案的目的在于达到这样一种技术效果:当代码意识到自己被调试时,它们可能改变正常的执行路径或者修改自身程序让自己崩溃,从而增加调试时间和复杂度。
现有技术中应用于so文件的反调试技术方案与so文件所依赖的应用程序线程是分离的,从而使得反调试技术方案无法集成到包括so文件的应用程序安装包之中,为反调试的及时实施带来了困难。
发明内容
为了使得应用于so文件的反调试技术方案能够植入so文件所依赖的应用程序线程,从而使得反调试技术方案能够集成到包括so文件的应用程序安装包之中,以便于实时实现反调试保护,本发明提供了一种基于安卓操作系统的链接库文件反调试方法及装置。
一方面,本发明提供了一种基于安卓操作系统的链接库文件反调试方法,所述方法包括:
基于原生开发工具包设置反调试线程,所述反调试线程通过加载接口被加载,所述加载接口用于Android虚拟机加载所述链接库文件;所述反调试线程用于以轮询方式判断当前线程是否被调试;若所述当前线程被调试,则直接终止当前线程;
将所述反调试线程通过所述原生开发工具包集成为独立组件;
基于所述原生开发工具包将所述独立组件与相关应用软件打包成Android应用程序安装包。
另一方面提供了一种基于安卓操作系统的链接库文件反调试装置,所述装置包括:
反调试线程设置模块,用于基于原生开发工具包设置反调试线程,所述反调试线程通过加载接口被加载,所述加载接口用于Android虚拟机加载所述链接库文件;所述反调试线程用于以轮询方式判断当前线程是否被调试;若所述当前线程被调试,则直接终止当前线程;
独立组件集成模块,用于将所述反调试线程通过所述原生开发工具包集成为独立组件;
Android应用程序安装包集成模块,用于基于所述原生开发工具包将所述独立组件与相关应用软件打包成Android应用程序安装包。
另一方面提供了一种计算机可读存储介质,用于存储程序,所述程序被执行时实现所述的的一种基于安卓操作系统的链接库文件反调试方法。
另一方面提供了一种终端设备,所述终端设备包括上述的一种基于安卓操作系统的链接库文件反调试装置。
另一方面提供了一种电子设备,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行本申请提供的基于安卓操作系统的链接库文件反调试方法。
本发明实施例提供的一种基于安卓操作系统的链接库文件反调试方法及装置,通过在研发阶段实现反调试线程,从而使得包括反调试线程所在的独立组件的应用程序编译出来的应用程序安装包具有了反调试的能力。本发明实施例中得到的Android应用程序安装包不仅适用于真实Android手机,同时适用于现在市面上各类的Android模拟器。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案和优点,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它附图。
图1是本发明实施例提供的一种基于安卓操作系统的链接库文件反调试方法流程图;
图2是本发明实施例提供的反调试线程的运行逻辑示意图;
图3是本发明实施例提供的一种反调试线程构建方法流程图;
图4是本发明实施例提供的另一种反调试线程构建方法流程图;
图5是本发明实施例提供的调试器挂载之前/proc/net/tcp的值示意图;
图6是本发明实施例提供的调试器挂载之前/proc/net/tcp的值示意图;
图7是本发明实施例提供的另一种反调试线程构建方法图;
图8是本发明实施例提供的另一种反调试线程构建方法图;
图9是本发明实施例提供的一种基于安卓操作系统的链接库文件反调试装置框图;
图10是本发明实施例提供的一种用于实现本发明实施例所提供的方法的设备的硬件结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或服务器不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
本发明实施例旨在提供一种基于安卓操作系统的链接库文件反调试方法。所述链接库文件具体为Android操作系统中的so文件。so文件为使用C语言或C++语言开发得到的链接库文件。为了便于对本发明实施例进行清楚明确的说明,首先对于Android操作系统、so文件及其相关背景进行介绍。
Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由谷歌(Google)公司和开放手机联盟领导及开发。Android自问世以来得以迅速发展,各大移动设备生产商纷纷投入成本设计开发属于自己的Android操作系统,从2016年开始,Android已经超越由苹果公司开发的移动操作系统(iOS操作系统)成为全球最有影响力的操作系统。
由于Android操作系统的开源性,研发人员为了提高其安全性和使用性能,将基于Android操作系统的应用程序的很多逻辑使用原生代码写在了JNI层。JNI是JavaNativeInterface的缩写,它提供了若干的应用程序接口实现了Java和其他语言的通信(主要是C语言和C++语言),其中Java语言为基于Android操作系统开发应用软件所使用的语言。JNI标准作为Java平台的一部分,它允许Java代码和基于其他语言编写的代码进行交互,使用原生代码得到的文件即为so文件。
具体而言,so文件是Linux环境下的程序函数库,即编译好的可以供其他程序使用的代码和数据,其作用类似于windows环境中的动态链接库文件文件(Dynamic LinkableLibrary即DLL库文件)。so文件大多是由C或C++编译出来,在Linux环境中不能直接运行,而是通过与源文件连接从而生成可执行文件来发挥作用的文件,其也可以被称之为共享库文件。
Android操作系统本身在安全性上的缺陷可能导致so文件由于被反调试而产生安全隐患,因此,有必要为so文件设计保护方案,即设计基于Android应用程序中so文件的反调试方案。
目前现有技术中Android反调试的方案均只是提供了通用的检测基于Android的线程是否被调试的某种手段,并未与基于Android操作系统的应用软件进行集成,无法跟随Android操作系统的应用软件一起发布,无法批量化和产业化使得其无法实现自动实时的反调试保护,导致其实用价值较低,也难以被推广使用。
有鉴于此,为了为Android应用程序中链接库文件提供自动实时的反调试保护,本发明实施例提供一种基于安卓操作系统的链接库文件反调试方法,如图1所示,所述方法包括:
S101.基于原生开发工具包设置反调试线程,所述反调试线程通过加载接口被加载,所述加载接口用于Android虚拟机加载所述链接库文件;所述反调试线程用于以轮询方式判断当前线程是否被调试;若所述当前线程被调试,则直接终止当前线程。
本发明实施例中原生开发工具包NDK(Native Development Kit)是Android操作系统的一个工具开发包,用于快速开发C、C++链接库,并自动将基于C、C++开发的代码所生成的链接库文件(so文件)和应用程序一起打包成Android应用程序安装包(AndroidPackage,apk)。从而在Android应用程序的研发、发布和运行等环节通过NDK实现Java代码与原生代码的交互,原生代码包括但不限于C语言代码和C++语言代码。
NDK使得Java代码与原生代码混合的开发方式成为官方支持的开发方式。使用NDK,可以将要求高性能的应用逻辑和要求高保密性能的应用逻辑使用原生代码开发,从而提高应用程序的执行效率和安全性。
具体地,所述加载接口可以为JNI_OnLoad函数。由于Android虚拟机执行到System.loadLibrary()函数时,就会立即呼叫JNI_OnLoad(),从而进入链接库文件的加载,通过设计JNI_OnLoad函数可以达到加载反调试线程的目的。
事实上,本发明实施例所述的链接库可以为Android中的so文件,而so文件的作用可以类比为Windows操作系统中的动态链接库文件(DLL文件),相应的,加载接口JNI_OnLoad的作用即为DLL中的PROCESS ATTATCH,可以做初始化的动作。
显而易见,所述加载接口在基于Android的应用软件开发阶段即可进行设置,因此,本发明实施例中的技术方案可以被理解为一种在软件研发阶段设定的反调试方案,并且伴随研发得到的应用软件进行发布以及后续的使用,因此,可以伴随应用软件的整个生命周期,从而在全生命周期中保护so文件不被调试。
S103.将所述反调试线程通过所述原生开发工具包集成为独立组件。
反调试线程从Android应用程序开发过程中即被编写出来,所述反调试线程所在的独立组件能够同时适配Google公司的原生只读存储器(Read-Only Memory,ROM)和任意第三方的ROM,且与中央处理器的架构平台无关,适配Dalvik和ART两种虚拟机运行环境,兼容性更优。
Dalvik虚拟机是由Google公司设计用于Android平台的虚拟机。Dalvik虚拟机也是Google合作开发的Android移动设备平台的核心组成部分之一。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
Android 4.4提供了一种与Dalvik截然不同的运行环境ART虚拟机,ART虚拟机与Dalvik虚拟机最大的不同在于,启用ART虚拟机后,系统在安装应用的时候会进行一次预编译,将字节码转换为机器语言存储在本地,这样在运行程序时就不会每次都进行一次编译了,执行效率也大大提升。这种编译的方式更接近于C、C++语言。
本发明实施例中基于NDK得到的独立组件难以被反编译,所以在安全性方面有保证,并且可以使得所述独立组件可以在其他平台使用,具有可移植性。
S105.基于所述原生开发工具包将所述独立组件与相关应用软件打包成Android应用程序安装包。
本发明实施例中反调试线程在应用软件开发过程中被编写出来,从而使得包括反调试线程所在的独立组件的应用程序编译出来的应用程序安装包具有了反调试的能力,当黑客试图动态或者静态分析应用程序安装包时,调试器挂载不上去无法分析,显著提高了安全性。本发明实施例中得到的Android应用程序安装包不仅适用于真实Android手机,同时适用于现在市面上各类的Android模拟器。
如图2所示,其示出了本发明实施例中反调试线程的运行逻辑示意图,其通过轮询的方式实现实时的反调试保护。若在应用软件运行的某个时刻出现黑客入侵,所述反调试线程可以及时作出反应终止当前线程而保护应用软件不受伤害。
本发明实施例提供的一种基于安卓操作系统的链接库文件反调试方法通过在研发阶段实现反调试线程,并将所述反调试线程集成入Android应用程序安装包的方式实现了对于Android应用程序中链接库文件全生命周期的反调试保护,相较于现有技术具备较好的智能性。相对应的,现有技术中的反调试方案并未集成入Android应用程序安装包,因此无法实现自动实时的反调试保护。
具体而言,现有技术中一个常见的问题为若用户从应用市场下载了一个应用软件,可是应用软件的打开功能不全,甚至出现了非法广告,出现这一问题的原因可能为应用软件代码被篡改。基于本发明实施例提供的技术方案,可以实时监测是否被调试器挂载,从而及时终止进程,避免基于调试器挂载的方式篡改代码,避免了这一问题的发生。
进一步地,在实际的研发过程中,本发明实施例中的技术方案也具备较好的可操作性。比如,在使用android studio或eclipse等开发环境开发Android应用程序的时候,通过添加NDK的支持,直接加入本发明实施例提供的独立组件,编译安装后,即可使得其应用软件中的链接库实时受到反调试保护,可以及时阻止各类反编译调试器挂载,保护应用软件的安全。
在一个优选的实施方式中,通过深入研究Android NDK开发的流程,Android系统Ptrace模块的原理,找到了一种在开发Android应用软件过程中加入一段代码逻辑即可以实现Android原生代码反调试的目的的技术方案,即可以基于Linux内核的Ptrace模块实现所述反调试线程。为了便于对所述反调试线程进行说明,本发明实施例中首先详述基于Linux内核的Ptrace模块实现调试判断的原理:
Ptrace模块可以允许一个线程监视和控制另一个线程的执行,并且修改被监视线程的内存、寄存器等的内部数据,主要引用于断点调试和系统调用跟踪。通过研究Linux内核Ptrace模块的源码可知,该函数的原型为:
longptrace(int request,pid_tpid,void*addr,void*data)
其中,request为请求类型,pid为被调试线程的线程标识,其中request可以取PTRACE_TRACEME、PTRACE_ATTACH、PTRACE_DETACH、PTRACE_SYSCALL等宏对应的值。
其中PTRACE_TRACEME请求本线程被其父线程跟踪,交付给这个线程的所有信号(除SIGKILL之外),都将使其停止,父线程将通过wait()函数获知这一情况,PTRACE_TRACEME通常是与fork/exec函数一起使用。对于每一个线程,PTRACE_TRACEME只能被调用一次。
其中PTRACE_ATTACH请求根据线程标识将调试线程附加到被调试线程上,PTRACE_ATTACH向被调试线程发送SIGSTOP信号使之停下,但是在ptrace(PTRACE_ATTACH,pid,0,0)执行完毕时被调试线程可能还没有被暂停,可以使用waitpid()函数等待其停下。
其中PTRACE_DETACH请求将被调试线程与调试线程分离,使被调试线程正常运行。
其中PTRACE_SYSCALL请求使被调试线程继续运行,但是在下一个系统调用的入口处或出口处停下,或者是执行完一条指令后停下。例如,调试线程可以监视被调试线程系统调用入口处的参数,接着再使用SYSCALL监视系统调用的返回值。
相应的,对应于Ptrace模块的原理,外部调试器与调试对象建立调试关系有两种方式,这两种方式对应着ptrace建立跟踪关系的两种方式:
第一种方式基于PTRACE_TRACEME来调试。具体为使用fork函数,利用fork函数执行被测试的子线程,fork函数被定义在#include<sys/types.h>中,为Android操作系统支持的函数。子线程在被执行之前调用ptrace(PTRACE_TRACEME),建立了与父线程跟踪关系,而父线程即为外部调试器对应的线程,从而使得外部调试器达到跟踪子线程的目的。
第二种方式基于PTRACE_ATTACH来调试。外部调试器可以调用ptrace(PTRACE_ATTACH,pid,…),建立自己与线程号为pid的线程间的跟踪关系,即利用PTRACE_ATTACH,使自身变成被调试程序的父线程。
根据上述对于Ptrace模块以及外部调试器的研究结果,本发明实施例中提供了一种反调试线程构建方法,如图3所示,所述方法包括:
S201.获取当前线程标识。
S202.根据所述当前线程标识构建跟踪函数以使得所述跟踪函数以所述当前线程为跟踪对象。
具体地,所述跟踪函数即为long ptrace(int request,pid_tpid,void*addr,void*data),通过对上述Ptrace模块的描述内容可知,在PTRACE_TRACEME宏定义对应的跟踪方式中,通过将ptrace的跟踪对象设置为当前线程本身,则其它进程就无法再调试当前线程,并且一个线程仅能够被ptrace一次。
S203.轮询读取/proc/pid/status的TracerPid的值。
TracerPid字段的值的获取是Linux内核层完成的,由于内核的代码保护权限最高,不会轻易被篡改,所以保证了该值的正确性。
S204.判断读取结果是否为0。
S205.若否,则判定存在调试器挂载,终止当前线程。
在一个可行的实施方式中,若是,则不进行任何操作。
检测/proc/pid/status的TracerPid的值,如果不为0,就表示有调试器挂载,这时直接终止当前线程,从而让调试器挂载失败。
在另一个可行的实施方式中,还可以通过检测android_server端口号达到反调试的目的。本发明实施例中还提供了一种反调试线程构建方法,如图4所示,所述方法包括:
S301.轮询读取/proc/net/tcp文件中的端口连接信息。
S302.判断所述端口连接信息中是否存在android_server的默认监听的端口号。
S303.若存在,则判定存在调试器挂载,终止当前线程。
在一个可行的实施方式中,若不存在,则不进行任何操作。
在Android操作系统中,android_server的默认监听的端口号是23946,在Linux系统的/proc/net/tcp文件会记录系统的端口连接信息,所以通过查询这个文件的内容可以判断是否有调试器挂载。请参考图5,其示出了调试器挂载之前/proc/net/tcp的值,请参考图6,其示出了调试器挂载之后/proc/net/tcp的值。
显然,当有调试器挂载应用程序对应的/proc/net/tcp的值会发生变化,即出现5D8A的端口,这个十六进制转为十进制是23946的表示,所以通过检测这个文件中的端口号可以达到反调试的作用。
在另一个可行的实施方式中,还可以通过检测android_server关键字达到反调试的目的。本发明实施例中还提供了一种反调试线程构建方法,如图7所示,所述方法包括:
S401.轮询读取/proc/pid/cmdline的值。
S402.判断读取结果是否为android_server。
S403若是,则判定存在调试器挂载,终止当前线程。
在一个可行的实施方式中,若否,则不进行任何操作。
当应用程序处于被调试状态下,android_server线程的cmdline的值会写有android_server,所以通过读取/proc/pid/cmdline的值,如果有值且为android_server则判定处于调试状态。
上述三种实施方式中的反调试线程构建方法均同时适用于Android应用程序动态运行状态和静态运行状态,达到了Android原生代码反调试的目的,增加了安全性,保护了链接库文件。
在另一个可行的实施方式中,还可以通过反调试线程轮询查看当前线程的虚拟地址空间或dump内存。即通过监测地址空间或dump内存判断当前线程是否处于调试中,若是,则终止当前线程。Dump内存是一种镜像文件,可以记录当前线程的执行状态。
本发明实施例认为若当前线程处于调试状态,则/proc/pid/mem或/proc/pid/maps下dump内存数据必然存在打开、读取等基本操作,因此,若检测到上述基本操作中至少一个操作时,则可以判定当前线程处于调试之中。
Linux下Inotify模块可以支持查看当前线程的虚拟地址空间或dump内存。然而,对于很多定制的Android操作系统,其相关Linux的功能模块被舍弃了,所以有的Android操作系统并不包含Inotify模块,因此,通过查看当前线程的虚拟地址空间或dump内存来判断是否被调试的技术方案有其自身的适配场景。
在另一个可行的实施方式之中,本发明实施例中还提供了一种反调试线程构建方法,如图8所示,所述方法包括:
S501.轮询读取/proc/pid/task文件。
S502.根据读取结果获取当前线程数。
S503.若所述当前线程数不大于1,则判定存在调试器挂载,终止当前线程。
本发明实施例中反调试程序可以跟随独立组件嵌入应用程序安装包,应用程序安装包运行后通常会有不止一个线程同时运行,本发明实施例中轮询读取/proc/pid/task文件,该文件会反映当前的线程数,此时如果当前线程数不大于1,即可判定为调试状态,直接终止当前线程。
本发明实施例提供了多种反调试线程的构建方法,从而达到对链接库文件进行反调试保护的目的,反调试线程基于NDK被集成独立组件,也同时具备的高安全性、可移植性等诸多优势。
对于反调试线程的逻辑,本发明实施例基于轮询机制给出了多种反调试方案,其中基于Ptrace模块进行反调试轮询监测的方案为依赖内核直接得到监测结果的方案,具备最高的可靠性;通过读取android_server端口号或关键字的方案较为快捷;通过查看当前线程的虚拟地址空间或dump内存进行反调试监测的方案需要依赖Inotify模块,而Inotify模块在某些Linux环境中可能被舍弃了,因此,其适用性受到一定限制;而读取当前线程数的方案的设计原理在于反调试程序被嵌入应用程序安装包,因此,其是与本发明实施例试图使得应用程序安装包具备反调试能力的动机相适配的方案。
本发明实施例中各种反调试方案均各有优势,可以根据实际情况进行自由选择或组合使用,本发明实施例并不限定其具体的使用方式。
本发明实施例还提供了一种基于安卓操作系统的链接库文件反调试装置,如图9所示,所述装置包括:
反调试线程设置模块601,用于基于原生开发工具包设置反调试线程,所述反调试线程通过加载接口被加载,所述加载接口用于Android虚拟机加载所述链接库文件;所述反调试线程用于以轮询方式判断当前线程是否被调试;若所述当前线程被调试,则直接终止当前线程;
独立组件集成模块602,用于将所述反调试线程通过所述原生开发工具包集成为独立组件;
Android应用程序安装包集成模块603,用于基于所述原生开发工具包将所述独立组件与相关应用软件打包成Android应用程序安装包
具体地,所述反调试线程设置模块包括:
第一反调试单元,用于获取当前线程标识;根据所述当前线程标识构建跟踪函数以使得所述跟踪函数以所述当前线程为跟踪对象;轮询读取/proc/pid/status的TracerPid的值:判断读取结果是否为0:若否,则判定存在调试器挂载,终止当前线程;
或,
第二反调试单元,用于轮询读取/proc/net/tcp文件中的端口连接信息;判断所述端口连接信息中是否存在android_server的默认监听的端口号;若存在,则判定存在调试器挂载,终止当前线程;
或,
第三反调试单元,用于轮询读取/proc/pid/cmdline的值;判断读取结果是否为android_server;若是,则判定存在调试器挂载,终止当前线程;
或,
第四反调试单元,用于轮询读取/proc/pid/task文件;根据读取结果获取当前线程数;若所述当前线程数不大于1,则判定存在调试器挂载,终止当前线程。
其中,第一反调试单元、第二反调试单元、第三反调试单元、第四反调试单元可以独立或组合进行使用,也可以根据Android应用程序安装包的运行场景或运行环境进行适配选用。
从外,所述反调试线程设置模块还可以通过监测当前线程的地址空间或dump内存判断当前线程是否处于调试中,若是,则终止当前线程,从而达到反调试的目的。当然,这种反调试以所述Android应用程序安装包的运行环境支持Inotify为前提。
反调试线程设置模块中不同单元实现不同的反调试方案,其中基于Ptrace模块进行反调试轮询监测的方案为依赖内核直接得到监测结果的方案,具备最高的可靠性;通过读取android_server端口号或关键字的方案较为快捷;通过查看当前线程的虚拟地址空间或dump内存进行反调试监测的方案需要依赖Inotify模块,而Inotify模块在某些Linux环境中可能被舍弃了,因此,其适用性受到一定限制;而读取当前线程数的方案的设计原理在于反调试程序被嵌入应用程序安装包,因此,其是与本发明实施例试图使得应用程序安装包具备反调试能力的动机相适配的方案。
本发明实施例中各种反调试方案均各有优势,反调试线程设置模块中可以根据实际情况对各个单元进行自由选择或组合使用,本发明实施例并不限定其具体的使用方式。
本发明实施例提供的一种基于安卓操作系统的链接库文件反调试装置与方法实施例基于相同的发明构思。
本发明实施例还提供了一种计算机存储介质,所述计算机存储介质可以存储有多条指令,所述指令适于由处理器加载并执行本发明实施例所述的.一种基于安卓操作系统的链接库文件反调试方法的步骤。
具体地,所述指令的内容包括:
基于原生开发工具包设置反调试线程,所述反调试线程通过加载接口被加载,所述加载接口用于Android虚拟机加载所述链接库文件;所述反调试线程用于以轮询方式判断当前线程是否被调试;若所述当前线程被调试,则直接终止当前线程;
将所述反调试线程通过所述原生开发工具包集成为独立组件;
基于所述原生开发工具包将所述独立组件与相关应用软件打包成Android应用程序安装包。
进一步地,所述指令的内容还包括:
构建反调试线程,所述构建反调试线程包括:
获取当前线程标识;
根据所述当前线程标识构建跟踪函数以使得所述跟踪函数以所述当前线程为跟踪对象;
轮询读取/proc/pid/status的TracerPid的值:
判断读取结果是否为0:
若否,则判定存在调试器挂载,终止当前线程。
进一步地,所述指令的内容还包括:
构建反调试线程,所述构建反调试线程包括:
轮询读取/proc/net/tcp文件中的端口连接信息;
判断所述端口连接信息中是否存在android_server的默认监听的端口号;
若存在,则判定存在调试器挂载,终止当前线程。
进一步地,所述指令的内容还包括:
构建反调试线程,所述构建反调试线程包括:
轮询读取/proc/pid/cmdline的值;
判断读取结果是否为android_server;
若是,则判定存在调试器挂载,终止当前线程。
进一步地,所述指令的内容还包括:
构建反调试线程,所述构建反调试线程包括:
通过反调试线程轮询查看当前线程的虚拟地址空间或dump内存,根据查看结果判断当前线程是否处于调试中,若是,则终止当前线程。
进一步地,所述指令的内容还包括:
构建反调试线程,所述构建反调试线程包括:
轮询读取/proc/pid/task文件;
根据读取结果获取当前线程数;
若所述当前线程数不大于1,则判定存在调试器挂载,终止当前线程。
进一步地,图10示出了一种用于实现本发明实施例所提供的一种基于安卓操作系统的链接库文件反调试方法的设备的硬件结构示意图,所述设备可以为计算机终端、移动终端或服务器,所述设备还可以参与构成本发明实施例所提供的一种基于安卓操作系统的链接库文件反调试装置或系统。如图10所示,计算机终端10(或移动设备10或服务器10)可以包括一个或多个(图中采用102a、102b,……,102n来示出)处理器102(处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)、用于存储数据的存储器104、以及用于通信功能的传输装置106。除此以外,还可以包括:显示器、输入/输出接口(I/O接口)、通用串行总线(USB)端口(可以作为I/O接口的端口中的一个端口被包括)、网络接口、电源和/或相机。本领域普通技术人员可以理解,图10所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,计算机终端10还可包括比图10中所示更多或者更少的组件,或者具有与图10所示不同的配置。
应当注意到的是上述一个或多个处理器102和/或其他数据处理电路在本文中通常可以被称为“数据处理电路”。该数据处理电路可以全部或部分的体现为软件、硬件、固件或其他任意组合。此外,数据处理电路可为单个独立的处理模块,或全部或部分的结合到计算机终端10(或移动设备)中的其他元件中的任意一个内。如本申请实施例中所涉及到的,该数据处理电路作为一种处理器控制(例如与接口连接的可变电阻终端路径的选择)。
存储器104可用于存储应用软件的软件程序以及模块,如本发明实施例中所述的一种基于安卓操作系统的链接库文件反调试方法对应的程序指令/数据存储装置,处理器102通过运行存储在存储器104内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的一种黑客攻击分级检测方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至计算机终端10。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
传输装置106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括计算机终端10的通信供应商提供的无线网络。在一个实例中,传输装置106包括一个网络适配器(Network Interface Controller,NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输装置106可以为射频(Radio Frequency,RF)模块,其用于通过无线方式与互联网进行通讯。
显示器可以例如触摸屏式的液晶显示器(LCD),该液晶显示器可使得用户能够与计算机终端10(或移动设备)的用户界面进行交互。
需要说明的是:上述本发明实施例先后顺序仅仅为了描述,不代表实施例的优劣。且上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置和服务器实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种基于安卓操作系统的链接库文件反调试方法,其特征在于,所述方法包括:
基于原生开发工具包设置反调试线程,所述反调试线程通过加载接口被加载,所述加载接口用于Android虚拟机加载所述链接库文件;所述反调试线程用于以轮询方式判断当前线程是否被调试;若所述当前线程被调试,则直接终止当前线程;
将所述反调试线程通过所述原生开发工具包集成为独立组件;
基于所述原生开发工具包将所述独立组件与相关应用软件打包成Android应用程序安装包。
2.根据权利要求1所述方法,其特征在于,还包括构建反调试线程,所述构建反调试线程包括:
获取当前线程标识;
根据所述当前线程标识构建跟踪函数以使得所述跟踪函数以所述当前线程为跟踪对象;
轮询读取/proc/pid/status的TracerPid的值:
判断读取结果是否为0:
若否,则判定存在调试器挂载,终止当前线程。
3.根据权利要求1所述的方法,其特征在于,还包括构建反调试线程,所述构建反调试线程包括:
轮询读取/proc/net/tcp文件中的端口连接信息;
判断所述端口连接信息中是否存在android_server的默认监听的端口号;
若存在,则判定存在调试器挂载,终止当前线程。
4.根据权利要求1所述的方法,其特征在于,还包括构建反调试线程,所述构建反调试线程包括:
轮询读取/proc/pid/cmdline的值;
判断读取结果是否为android_server;
若是,则判定存在调试器挂载,终止当前线程。
5.根据权利要求1所述的方法,其特征在于,还包括构建反调试线程,所述构建反调试线程包括:
通过反调试线程轮询查看当前线程的虚拟地址空间或dump内存,根据查看结果判断当前线程是否处于调试中,若是,则终止当前线程。
6.根据权利要求1所述的方法,其特征在于,还包括构建反调试线程,所述构建反调试线程包括:
轮询读取/proc/pid/task文件;
根据读取结果获取当前线程数;
若所述当前线程数不大于1,则判定存在调试器挂载,终止当前线程。
7.一种基于安卓操作系统的链接库文件反调试装置,其特征在于,所述装置包括:
反调试线程设置模块,用于基于原生开发工具包设置反调试线程,所述反调试线程通过加载接口被加载,所述加载接口用于Android虚拟机加载所述链接库文件;所述反调试线程用于以轮询方式判断当前线程是否被调试;若所述当前线程被调试,则直接终止当前线程;
独立组件集成模块,用于将所述反调试线程通过所述原生开发工具包集成为独立组件;
Android应用程序安装包集成模块,用于基于所述原生开发工具包将所述独立组件与相关应用软件打包成Android应用程序安装包。
8.根据权利要求7所述装置,其特征在于,所述反调试线程设置模块包括:
第一反调试单元,用于获取当前线程标识;根据所述当前线程标识构建跟踪函数以使得所述跟踪函数以所述当前线程为跟踪对象;轮询读取/proc/pid/status的TracerPid的值:判断读取结果是否为0:若否,则判定存在调试器挂载,终止当前线程;
或,
第二反调试单元,用于轮询读取/proc/net/tcp文件中的端口连接信息;判断所述端口连接信息中是否存在android_server的默认监听的端口号;若存在,则判定存在调试器挂载,终止当前线程;
或,
第三反调试单元,用于轮询读取/proc/pid/cmdline的值;判断读取结果是否为android_server;若是,则判定存在调试器挂载,终止当前线程;
或,
第四反调试单元,用于轮询读取/proc/pid/task文件;根据读取结果获取当前线程数;若所述当前线程数不大于1,则判定存在调试器挂载,终止当前线程。
9.根据权利要求7所述装置,其特征在于:
所述反调试线程设置模块用于通过监测当前线程的地址空间或dump内存判断当前线程是否处于调试中,若是,则终止当前线程。
10.一种计算机可读存储介质,用于存储程序,其特征在于,所述程序被执行时实现权利要求1-6中任一项所述的一种基于安卓操作系统的链接库文件反调试方法。
CN201910216722.3A 2019-03-21 2019-03-21 一种基于安卓操作系统的链接库文件反调试方法及装置 Active CN110046479B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910216722.3A CN110046479B (zh) 2019-03-21 2019-03-21 一种基于安卓操作系统的链接库文件反调试方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910216722.3A CN110046479B (zh) 2019-03-21 2019-03-21 一种基于安卓操作系统的链接库文件反调试方法及装置

Publications (2)

Publication Number Publication Date
CN110046479A true CN110046479A (zh) 2019-07-23
CN110046479B CN110046479B (zh) 2023-02-28

Family

ID=67274004

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910216722.3A Active CN110046479B (zh) 2019-03-21 2019-03-21 一种基于安卓操作系统的链接库文件反调试方法及装置

Country Status (1)

Country Link
CN (1) CN110046479B (zh)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111026439A (zh) * 2019-11-22 2020-04-17 广州华多网络科技有限公司 应用程序的兼容方法、装置、设备及计算机存储介质
CN111240752A (zh) * 2019-12-31 2020-06-05 北京元心科技有限公司 操作系统自适配方法及系统
CN111639312A (zh) * 2020-06-02 2020-09-08 腾讯科技(成都)有限公司 反调试方法、装置、存储介质及电子装置
CN112363917A (zh) * 2020-10-30 2021-02-12 北京五八信息技术有限公司 应用程序调试异常的处理方法、装置、电子设备及介质
CN112527677A (zh) * 2020-12-23 2021-03-19 北京深思数盾科技股份有限公司 应用程序的保护方法及电子设备
CN113350799A (zh) * 2021-05-26 2021-09-07 上海蛮犀科技有限公司 一种移动应用防修改器的安全防护方法
CN113886774A (zh) * 2021-12-07 2022-01-04 北京微步在线科技有限公司 一种反调试方法及装置
CN113987471A (zh) * 2021-10-29 2022-01-28 山西大鲲智联科技有限公司 可执行文件执行方法、装置、电子设备和计算机可读介质

Citations (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102760219A (zh) * 2011-12-20 2012-10-31 北京安天电子设备有限公司 一种Android平台软件保护系统、方法及设备
CN103324481A (zh) * 2013-06-26 2013-09-25 网宿科技股份有限公司 通过汇编实现代码混淆的编译方法和系统
CN104063311A (zh) * 2013-05-27 2014-09-24 腾讯科技(深圳)有限公司 一种应用测试方法及装置
CN105612527A (zh) * 2013-08-22 2016-05-25 Inka安特沃客有限公司 为基于通用中间语言的程序提供安全性的方法
CN105701423A (zh) * 2015-12-31 2016-06-22 深圳前海微众银行股份有限公司 应用于云端支付业务的数据存储方法及装置
CN106055983A (zh) * 2016-07-27 2016-10-26 北京鼎源科技有限公司 一种基于IDA通信的Android应用反调试方法
CN106874769A (zh) * 2016-12-30 2017-06-20 腾讯科技(深圳)有限公司 漏洞的防御方法和装置
CN107330320A (zh) * 2016-04-29 2017-11-07 腾讯科技(深圳)有限公司 应用进程监控的方法和装置
CN108021791A (zh) * 2016-10-31 2018-05-11 腾讯科技(深圳)有限公司 数据保护方法及装置
CN108170503A (zh) * 2018-01-24 2018-06-15 腾讯科技(深圳)有限公司 一种跨系统运行安卓应用的方法、终端及存储介质
CN108259479A (zh) * 2017-12-28 2018-07-06 广州启生信息技术有限公司 业务数据处理方法、客户端与计算机可读存储介质
CN108733988A (zh) * 2017-04-19 2018-11-02 北京洋浦伟业科技发展有限公司 安卓平台上可执行程序的保护方法

Patent Citations (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102760219A (zh) * 2011-12-20 2012-10-31 北京安天电子设备有限公司 一种Android平台软件保护系统、方法及设备
CN104063311A (zh) * 2013-05-27 2014-09-24 腾讯科技(深圳)有限公司 一种应用测试方法及装置
CN103324481A (zh) * 2013-06-26 2013-09-25 网宿科技股份有限公司 通过汇编实现代码混淆的编译方法和系统
CN105612527A (zh) * 2013-08-22 2016-05-25 Inka安特沃客有限公司 为基于通用中间语言的程序提供安全性的方法
EP3038004A1 (en) * 2013-08-22 2016-06-29 Inka Entworks, Inc. Method for providing security for common intermediate language-based program
CN105701423A (zh) * 2015-12-31 2016-06-22 深圳前海微众银行股份有限公司 应用于云端支付业务的数据存储方法及装置
CN107330320A (zh) * 2016-04-29 2017-11-07 腾讯科技(深圳)有限公司 应用进程监控的方法和装置
CN106055983A (zh) * 2016-07-27 2016-10-26 北京鼎源科技有限公司 一种基于IDA通信的Android应用反调试方法
CN108021791A (zh) * 2016-10-31 2018-05-11 腾讯科技(深圳)有限公司 数据保护方法及装置
CN106874769A (zh) * 2016-12-30 2017-06-20 腾讯科技(深圳)有限公司 漏洞的防御方法和装置
CN108733988A (zh) * 2017-04-19 2018-11-02 北京洋浦伟业科技发展有限公司 安卓平台上可执行程序的保护方法
CN108259479A (zh) * 2017-12-28 2018-07-06 广州启生信息技术有限公司 业务数据处理方法、客户端与计算机可读存储介质
CN108170503A (zh) * 2018-01-24 2018-06-15 腾讯科技(深圳)有限公司 一种跨系统运行安卓应用的方法、终端及存储介质

Non-Patent Citations (5)

* Cited by examiner, † Cited by third party
Title
刘剑卓: "NDK的开发方式", 《ANDROID手机游戏开发从入门到精通》 *
张一峰等: "基于LLVM的Android Native文件保护方法", 《通信技术》 *
张晓等: "基于SMC的Android软件保护研究与实现", 《信息网络安全》 *
-明-: "APP加固各种反调试", 《HTTPS://BLOG.CSDN.NET/PEIKM/ARTICLE/DETAILS/81976147?OPS_REQUEST_MISC=%257B%2522REQUEST%255FID%2522%253A%2522166634095116782395388226%2522%252C%2522SCM%2522%253A%252220140713.130102334.PC%255FALL.%2522%257D&REQUEST_ID=166634095116782395388226...》 *
朱洪军等: "一种Android应用加固方案", 《计算机应用与软件》 *

Cited By (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111026439A (zh) * 2019-11-22 2020-04-17 广州华多网络科技有限公司 应用程序的兼容方法、装置、设备及计算机存储介质
CN111026439B (zh) * 2019-11-22 2023-03-24 广州方硅信息技术有限公司 应用程序的兼容方法、装置、设备及计算机存储介质
CN111240752A (zh) * 2019-12-31 2020-06-05 北京元心科技有限公司 操作系统自适配方法及系统
CN111639312A (zh) * 2020-06-02 2020-09-08 腾讯科技(成都)有限公司 反调试方法、装置、存储介质及电子装置
CN112363917A (zh) * 2020-10-30 2021-02-12 北京五八信息技术有限公司 应用程序调试异常的处理方法、装置、电子设备及介质
CN112363917B (zh) * 2020-10-30 2022-03-04 北京五八信息技术有限公司 应用程序调试异常的处理方法、装置、电子设备及介质
CN112527677A (zh) * 2020-12-23 2021-03-19 北京深思数盾科技股份有限公司 应用程序的保护方法及电子设备
CN113350799A (zh) * 2021-05-26 2021-09-07 上海蛮犀科技有限公司 一种移动应用防修改器的安全防护方法
CN113987471A (zh) * 2021-10-29 2022-01-28 山西大鲲智联科技有限公司 可执行文件执行方法、装置、电子设备和计算机可读介质
CN113886774A (zh) * 2021-12-07 2022-01-04 北京微步在线科技有限公司 一种反调试方法及装置
CN113886774B (zh) * 2021-12-07 2022-02-11 北京微步在线科技有限公司 一种反调试方法及装置

Also Published As

Publication number Publication date
CN110046479B (zh) 2023-02-28

Similar Documents

Publication Publication Date Title
CN110046479A (zh) 一种基于安卓操作系统的链接库文件反调试方法及装置
CN100555218C (zh) 用于改善片上仿真系统中高级语言的仿真速度的装置和方法
CN102422261B (zh) 对所引起的异常的通知
CN104205064A (zh) 将程序事件记录事件向运行时间检测事件的变换
CN103620561B (zh) 用于n路运行时互操作调试的方法和系统
CN101344899B (zh) 一种片上系统的仿真测试方法及仿真测试系统
CN102760090B (zh) 除错方法及计算机系统
KR20070109432A (ko) 커널 인지 디버깅 장치 및 방법
CN103748562A (zh) 测试、验证和调试架构
CN103559431A (zh) 安卓系统用户权限的检测方法、装置和系统
CN103377120A (zh) 一种应用程序测试方法及装置
CN105204393A (zh) 基于虚核单片机的单片机生产研发工具及其实现方法
CN104375938A (zh) 安卓应用程序的动态行为监测方法及系统
Li et al. Microservice patterns for the life cycle of industrial edge software
Fu et al. nAdroid: statically detecting ordering violations in Android applications
CN105164642A (zh) 对合同的操作系统支持
Chang et al. Implementation of JVM tool interface on Dalvik virtual machine
Malenko et al. Device driver and system call isolation in embedded devices
Yu et al. An automated framework to support testing for process‐level race conditions
CN100533401C (zh) 测试具有异步微控制器的集成电路的仿真和调试接口
GB2450505A (en) Authorised debugging
Laing et al. An experience report on extracting and viewing memory events via wireshark
Bernauer et al. A comprehensive compiler-assisted thread abstraction for resource-constrained systems
CN112948241B (zh) 应用程序的反调试方法、装置、电子设备及存储介质
Wahba et al. Initiating a design pattern catalog for embedded network systems

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