CN108021791B - 数据保护方法及装置 - Google Patents
数据保护方法及装置 Download PDFInfo
- Publication number
- CN108021791B CN108021791B CN201610929145.9A CN201610929145A CN108021791B CN 108021791 B CN108021791 B CN 108021791B CN 201610929145 A CN201610929145 A CN 201610929145A CN 108021791 B CN108021791 B CN 108021791B
- Authority
- CN
- China
- Prior art keywords
- main process
- debugging
- function
- program
- source code
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 303
- 230000008569 process Effects 0.000 claims abstract description 234
- 230000002159 abnormal effect Effects 0.000 claims abstract description 127
- 230000006870 function Effects 0.000 claims description 223
- 238000011084 recovery Methods 0.000 claims description 23
- 230000003068 static effect Effects 0.000 claims description 20
- 238000005336 cracking Methods 0.000 description 10
- 238000010586 diagram Methods 0.000 description 8
- 230000010354 integration Effects 0.000 description 6
- 238000004891 communication Methods 0.000 description 3
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 238000001514 detection method Methods 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 230000005856 abnormality Effects 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 238000006467 substitution reaction Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 1
- 230000008439 repair process Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/12—Protecting executable software
- G06F21/14—Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Multimedia (AREA)
- Technology Law (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明实施例公开一种数据保护方法,所述方法包括:在源代码的关键函数中添加异常指令;基于添加有所述异常指令的源代码生成带有反调试功能的程序;所述程序的主进程创建子进程并由子进程调试主进程,当主进程运行到异常指令后停止运行;子进程接收到异常信号时,判断主进程是否被其他调试器调试;若所述主进程未被其他调试器调试,检测所述主进程停止运行的原因;检测到所述主进程停止运行的原因是因主进程的异常指令而产生时,将主进程异常指令恢复为正常指令并恢复所述主进程运行。本发明实施例同时还公开了一种数据保护装置。
Description
技术领域
本发明涉及软件安全技术领域,具体涉及一种数据保护方法及装置。
背景技术
目前,为了增强软件的防护能力,防止破解者对软件进行破解,通常采用反调试的方式进行保护。现有安卓(Android)上反调试方案主要分为以下几类:
第一类方案是检查父进程名或检查当前运行的所有进程名,对于通过调试器启动的程序可以检查父进程名,也可以直接检查系统当前运行的所有进程名,查看有没有已知的调试器名。但是,进程中有调试器名称并不能说明本身被调试,而且外界调试器只要改一个名称即可绕过检测,另外,目前Android程序(App,Application)无法直接通过调试器启动,可见这类方案的反调试保护效果不好。
第二类方案是子进程调试主进程相互守护,主进程创建出子进程后,子进程调试主进程,这时主进程无法被其他进程调试,主进程再检查子进程的状态,如果发现子进程状态不对或者子进程已经不存在便终止运行。但是,外界调试器还可以调试被调试进程除主线程之外的其他线程,另外,轮询会使得程序性能明显下降。
发明内容
有鉴于此,本发明期望提供一种数据保护方法及装置,保证外界调试器分析主程序时无法绕过异常指令,能提高破解反调试的难度,相比于采用轮询方式的反调试方案来说,不会因程序增加反调试功能而使程序性能明显下降。
本发明的技术方案是这样实现的:
一方面,本发明实施例提供了一种数据保护方法,所述方法包括:在源代码的关键函数中添加异常指令;基于添加有所述异常指令的源代码生成带有反调试功能的程序;所述程序开始运行时,所述程序的主进程创建子进程并由所述子进程调试所述主进程,当所述主进程运行到所述异常指令后停止运行;
所述子进程接收到异常信号时,判断所述主进程是否被其他调试器调试;
若所述主进程未被其他调试器调试,检测所述主进程停止运行的原因;
检测到所述主进程停止运行的原因是因主进程的异常指令而产生时,将主进程异常指令恢复为正常指令并恢复所述主进程运行。
另一方面,本发明实施例提供了一种数据保护装置,所述装置包括:
生成模块,用于在源代码的关键函数中添加异常指令;基于添加有所述异常指令的源代码生成带有反调试功能的程序;
初始化模块,用于所述程序开始运行时,所述程序的主进程创建子进程并由所述子进程调试所述主进程,当所述主进程运行到所述异常指令后停止运行;
接收模块,用于接收异常信号;
控制模块,用于判断所述主进程是否被其他调试器调试;若所述主进程未被其他调试器调试,检测所述主进程停止运行的原因;检测到所述主进程停止运行的原因是因主进程的异常指令而产生时,将主进程的异常指令恢复为正常指令并恢复所述主进程运行。
采用本发明实施例所述技术方案,数据保护装置在源代码的关键函数中添加异常指令;基于添加有所述异常指令的源代码生成带有反调试功能的程序;其中,当所述程序运行到所述异常指令时,所述程序将被停止运行;程序开始运行时,由子进程使用预设系统函数调试所述程序的主进程,并在确定所述程序被停止运行是因所述异常指令而产生时,向所述主进程发送恢复信号,使所述程序恢复运行。这样,由于在开发者开发出的源代码的关键函数中添加了异常指令,而该异常指令能够使得带有反调试功能的程序运行到该异常指令时,使得程序停止运行,而且由于程序每运行到关键函数时,均会遇到异常指令,提高了对关键函数的保护程度,也保证了外界调试器分析主程序时无法绕过异常指令,进而能提高破解反调试的难度。
附图说明
图1为本发明实施例提供的数据保护方法的实现流程示意图;
图2为本发明实施例提供的生成带有反调试功能的程序的一种实现流程示意图;
图3为本发明实施例提供的添加反调试代码的一种实现流程图;
图4为本发明实施例提供的反调试功能运行原理示意图;
图5为本发明实施例提供的子进程调试主进程的一种实现流程示意图;
图6为本发明实施例提供的数据保护装置的组成结构示意图;
图7是本发明实施例中用于实现数据保护装置的一个可选的硬件结构示意图;
图8为本发明实施例提供的数据保护系统的一种交互示意图。
具体实施方式
为了能够更加详尽地了解本发明的特点与技术内容,下面先介绍一下本发明中所涉及的重要缩略语和关键术语。
Android:一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由谷歌(Google)公司和开放手机联盟领导及开发。
Ptrace:Ptrace系统调用提供了一种使父进程得以监视和控制其它进程的方式,它还能够改变子进程中的寄存器和内核映像,因而可以实现断点调试和系统调用的跟踪。
Makefile:一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为Makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
下面结合附图对本发明的实现进行详细阐述,所附附图仅供参考说明之用,并非用来限定本发明。
本发明实施例提供一种数据保护方法,所述方法应用于产品侧,所述产品可以是数据保护装置,其表现形式为反调试代码集成工具包。如图1所示,所述方法主要包括:
101:在源代码的关键函数中添加异常指令。
这里,所述源代码可以是尚未编译成第一程序之前的代码。例如,所述源代码是开发者开发完成的代码,但尚未编译成该代码对应的第一程序之前的代码。
可选地,所述异常指令负责对预设错误函数指针的调用,使由添加有所述异常指令的源代码编译而成的程序在运行时,运行到所述异常指令将导致该程序出错。
在一可选实施方式中,所述在源代码的关键函数中添加异常指令,包括:
获取函数列表;其中,所述函数列表中存储有需保护的关键函数的函数标识;
基于所述函数列表确定所述源代码中的关键函数。
这里,所述函数列表可以由开发者提供。
由于开发者更清楚源代码中哪些函数是需要保护的,那么,反调试代码集成工具包只需在开发者开发出的源代码的关键函数中添加异常指令,而该异常指令能够使得带有反调试功能的程序运行到该异常指令时,使得程序终止运行,而且由于程序每运行到关键函数时,均会遇到异常指令,提高了对关键函数的保护程度,也保证了外界调试器分析主程序时无法绕过异常指令,进而能提高外界调试器破解反调试的难度。
需要说明的是,所述异常指令除了可以是上述的错误指针,实际上也可以是例如“1除以0”这类异常指令。
102、基于添加有所述异常指令的源代码生成带有反调试功能的程序。
其中,当所述程序运行到所述异常指令时,所述程序将停止运行。
在一可选实施方式中,所述基于添加有所述异常指令的源代码生成带有反调试功能的程序,包括:
在添加有所述异常指令的源代码中添加反调试代码,生成带有反调试功能的代码;
通过编译所述带有反调试功能的代码,生成带有反调试功能的程序。
示例性的,图2示出了生成带有反调试功能的程序的一种实现流程图,在图2中,原始代码包括源代码以及函数列表;生成带有反调试功能的程序的具体流程如图2所示,反调试代码集成工具包首先从原始代码中获取需要保护的函数列表,然后通过运行反调试代码集成工具包的脚本,在关键函数中添加异常指令,并在源代码中添加反调试代码,生成带有反调试功能的代码;最后,开发者通过编译操作对该带有反调试功能的代码进行编译,即可生成带有反调试功能的程序。
具体地,所述在添加有所述异常指令的源代码中添加反调试代码,包括:
A11、将反调试静态库文件对应的反调试代码以及反调试头文件对应的反调试代码引入源代码;
A12、在源代码中添加对反调试初始化函数的调用;
A13、在源代码中添加空函数;
A14、在源代码中添加预设错误函数指针以及对所述预设错误函数指针的
调用。
本实施例中,并不对A11、A12、A13、A14上述四个步骤中的执行个顺序进行限定。
示例性的,图3示出了运行反调试代码集成工具包的脚本后,在源代码中添加反调试代码的一种实现流程图,在图3中,首先,将反调试静态库文件对应的反调试代码以及反调试头文件对应的反调试代码引入源代码;然后,在源代码中添加对反调试初始化函数的调用;接着,在源代码中添加空函数;最后,在源代码中添加预设错误函数指针以及对所述预设错误函数指针的调用。
其中,所述将反调试静态库文件对应的反调试代码以及反调试头文件对应的反调试代码引入源代码,包括:
将反调试静态库文件以及反调试头文件放入源代码中;
通过修改源代码的第一源文件的方式将反调试静态库文件对应的反调试代码以及反调试头文件对应的反调试代码引入到源代码中;其中,所述第一源文件中记录有源代码中各类文件的编译顺序以及需要编译的文件。
可选地,所述第一源文件是Makefile。具体地,通过修改源代码的Makefile的方式将反调试静态库文件对应的反调试代码以及反调试头文件对应的反调试代码引入到源代码中。
本实施例中,可选地,所述预设系统函数为ptrace系统函数。
步骤103、所述程序开始运行时,所述程序的主进程创建子进程并由所述子进程调试所述主进程,当所述主进程运行到所述异常指令后停止运行。
这里,由所述程序的子进程使用预设系统函数调试所述程序的主进程,便于对主进程的状态进行检测。
本实施例中,所述程序是带有反调试功能的程序。
示例性的,图4示出了反调试功能运行原理示意图,如图4所示,带有反调试功能的程序运行一开始,该程序的主进程会先进入反调试初始化函数,该反调试初始化函数首先查找到编译前添加的空函数对应的空函数指针,接着创建子进程,然后,子进程使用ptrace函数调试主进程,主进程被调试后继续运行。这样,由于有该程序的子进程来调试主进程,那么,外界调试器件便无法调试主进程。
步骤104、所述子进程接收到异常信号时,判断所述主进程是否被其他调试器调试。
这里,所述异常信号是由操作系统向子进程发送的。
步骤105、若所述主进程未被其他调试器调试,检测所述主进程停止运行的原因。
在一具体实施例中,所述检测所述主进程停止运行的原因,包括:
基于所述异常信号获取错误函数指针地址;
根据所述错误函数指针地址判断所述主进程停止运行的原因。
例如,能够为子进程后续控制主进程提供依据。
进一步地,在一实施例中,所述方法还包括:
若确定所述主进程被其他调试器调试,向所述主进程发送终止信号,由所述主进程依据所述终止信号终止运行。
如此,带有反调试功能的程序运行到该异常指令时,所述程序停止运行,若子进程确定所述程序被其他调试器调试,则终止所述程序,从而起到保护所述程序的作用,即起到了反调试的作用。
步骤106、检测到所述主进程停止运行的原因是因主进程的异常指令而产生时,将主进程异常指令恢复为正常指令并恢复所述主进程运行。
其中,所述异常指令是预先在源代码的关键函数中添加的使所述主进程停止运行的指令。
在一可选实施方式中,所述将主进程异常指令恢复为正常指令并恢复所述主进程运行,包括:
将错误函数指针修复为空函数指针,并向主进程发送恢复信号,恢复所述主进程运行。
这里,所述错误函数指针是基于所述异常信号确定的。
在一具体实施方式中,所述将所述错误函数指针修复为空函数指针,包括:
获取主进程的当前寄存器列表;
将所述寄存器列表中程序计数器寄存器值由所述错误函数指针修复为通过反调试初始化函数中获取的空函数指针;
将修复后的寄存器列表通过系统调用再设置回主进程,所述主进程基于所述修复后的寄存器列表从所述空函数开始执行。
如此,由于带有反调试功能的程序是为了阻止破解者对该程序进行非法操作,当不存在外界调试器调试该程序的情况下,子进程确定该程序被停止运行是因所述异常指令而产生时,向主进程发送恢复信号,使所述程序恢复运行;即不会因异常指令而影响程序的正常运行。因而,对于用户来说,用户使用带有反调试的程序的体验,与使用普通程序的体验是一样的。
这里,程序计数器寄存器是寄存器列表中的一个寄存器。
如此,若子进程检测到程序被停止运行是因所述异常指令而产生时,通过对主进程当前寄存器的修复,能够使所述程序恢复运行,从而不会因异常指令而影响程序的正常运行。
进一步地,在一实施例中,所述方法还包括:
检测到所述主进程停止运行的原因是因所述主进程的源代码而产生时,向所述主进程发送恢复信号,恢复所述主进程继续运行。
如此,若所述主进程未被其他调试器调试,子进程确定所述主进程出现异常是因所述主进程的源代码而产生,向主进程发送恢复信号,使所述程序继续运行。
示例性的,图5示出了在程序运行过程中子进程调试主进程的一种实现流程示意图,如图5所示,该流程主要包括:
步骤501:主进程运行到异常指令;
步骤502:主进程向子进程发送异常信号;
步骤503:主进程被停止;
具体地,由于主进程被子进程调试,子进程在接收到主进程发送的异常信号时,主进程将被停止运行。
步骤504:子进程检测主进程是否被其他调试器调试;
这里,所述其他调试器是指外界调试器。
具体地,若所述主进程被其他调试器调试,则向所述主进程发送终止信号,由所述主进程依据所述终止信号终止运行;若所述主进程未被其他调试器调试,执行步骤505。
步骤505:子进程获取主进程的当前寄存器列表;
具体地,子进程在接收到主进程发送的异常信号后,先判断所述程序是否被其他调试器调试,当确定所述程序被其他调试器调试时,向主进程发送终止信号,使所述程序终止运行;当确定所述程序未被其他调试器调试时,则判断导致所述程序停止运行的原因,若所述原因是因主进程的异常指令产生时,执行步骤506;若所述原因是因程序的源代码而产生时,直接向主进程发送恢复信号,使主进程恢复运行。
步骤506:子进程将所述寄存器列表中程序计数器寄存器值由所述错误函数指针修复为通过反调试初始化函数中获取的空函数指针;
步骤507:子进程设置主进程寄存器值;
具体地,子进程将修复后的寄存器列表通过系统调用再设置回主进程。
步骤508:子进程向主进程发送恢复信号;
步骤509:主进程从所述空函数开始执行。
如此,带有反调试功能的程序运行到异常指令时,所述程序将被停止运行;检测到所述程序开始运行时,由子进程使用预设系统函数调试所述程序的主进程,当确定所述程序未被其他调试器调试时,并在确定所述程序被停止运行是因所述异常指令而产生时,向所述主进程发送恢复信号,使所述程序恢复运行;这样,能够保证带有反调试功能的程序在未被其他调试器所调试的情况下,正常运行。
本实施例所述技术方案中,数据保护装置在源代码的关键函数中添加异常指令;基于添加有所述异常指令的源代码生成带有反调试功能的程序;其中,当所述程序运行到所述异常指令时,所述程序将被停止运行;检测到所述程序开始运行时,由子进程使用预设系统函数调试所述程序的主进程,并在确定所述程序被停止运行是因所述异常指令而产生时,向所述主进程发送恢复信号,使所述程序恢复运行。这样,由于在开发者开发出的源代码的关键函数中添加了异常指令,而该异常指令能够使得带有反调试功能的程序运行到该异常指令时,使得程序停止运行,而且由于程序每运行到关键函数时,均会遇到异常指令,提高了对关键函数的保护程度,也保证了外界调试器分析主程序时无法绕过异常指令,进而能提高破解反调试的难度。而且,由于只就关键函数进行了反调试保护,另外只在运行到异常指令才进行外部调试器检测,相比于采用轮询方式的反调试方案来说,不会因程序增加反调试功能而使程序性能明显下降。同时,由所述程序的子进程使用预设系统函数调试所述程序的主进程,便于对主进程的状态进行检测,当子进程在确定所述程序被停止运行是因所述异常指令而产生时,恢复异常指令为正常指令,并向所述主进程发送恢复信号,使所述程序恢复运行,即,恢复指令由所述程序的子进程来控制,保证在所述程序的子进程对程序进行调试时,程序能正常运行;由于只有所述程序的子进程能够恢复程序运行,提高了外界调节器破解反调试的难度。
本发明实施例还记载了一种生成带有反调试功能的程序的方法,所述方法包括:
获取函数列表;
基于函数列表确定源代码的关键函数;
在所述源代码的关键函数中添加异常指令;
在所述源代码中添加反调试代码;
通过编译所述带有反调试代码、以及所述异常指令的源代码,生成带有反调试功能的程序。
其中,所述异常指令负责对预设错误函数指针的调用,使由添加有所述异常指令的源代码编译而成的程序在运行时,运行到所述异常指令将导致该程序出错。
在一可选实施方式中,所述在所述源代码的关键函数中添加异常指令,包括:
在所述源代码的关键函数中添加预设错误函数指针以及对所述预设错误函数指针的调用。
在一可选实施方式中,所述在所述源代码中添加反调试代码,包括:
将反调试静态库文件对应的反调试代码以及反调试头文件对应的反调试代码引入源代码;
在源代码中添加对反调试初始化函数的调用;
在源代码中添加空函数。
在一具体实施方式中,所述将反调试静态库文件对应的反调试代码以及反调试头文件对应的反调试代码引入源代码,包括:
将反调试静态库文件以及反调试头文件放入源代码中;
通过修改源代码的第一源文件的方式将反调试静态库文件对应的反调试代码以及反调试头文件对应的反调试代码引入到源代码中;其中,所述第一源文件中记录有所述源代码中各类文件的编译顺序以及需要编译的文件
如此,由于在开发者开发出的源代码的关键函数中添加了异常指令,而该异常指令能够使得带有反调试功能的程序运行到该异常指令时,使得程序停止运行,而且由于程序每运行到关键函数时,均会遇到异常指令,提高了对关键函数的保护程度,也保证了外界调试器分析主程序时无法绕过异常指令,进而能提高破解反调试的难度。
本发明实施例还记载了一种使用子进程修复主进程的方法,所述方法包括:
子进程接收操作系统发送的异常信号;
基于所述异常信号获取错误函数指针地址;
根据所述错误函数指针地址判断所述主进程出现异常的原因;
检测到所述主进程出现异常是因主进程的异常指令而产生时,将所述错误函数指针修复为空函数指针,并向主进程发送恢复信号,使所述主进程恢复运行。
这里,所述子进程可以理解为调试进程,或是程序自身调试器。
进一步地,所述方法还包括:
检测到所述主进程出现异常是因所述主进程的源代码而产生时,向主进程发送恢复信号,使所述主进程恢复运行。
进一步地,所述子进程接收主进程发送的异常信号之前,所述方法还包括:
检测到程序开始运行时,控制所述程序的主进程先进入反调试初始化函数;
由所述反调试初始化函数查找编译前添加的空函数对应的空函数指针,并创建子进程。
在一可选实施方式中,所述将所述错误函数指针修复为空函数指针,包括:
获取主进程的当前寄存器列表;
将所述寄存器列表中程序计数器寄存器值由所述错误函数指针修复为通过反调试初始化函数中获取的空函数指针;
将修复后的寄存器列表通过系统调用再设置回主进程,使所述主进程从所述空函数开始执行。
如此,通过在源代码中添加异常指令,在运行时使用子进程修复的方式,保证程序在运行时必须有子进程的参与才能正常运行,使得外界调试器调试变得非常困难,保证了动态库代码逻辑的安全。
图6为本发明实施例提供的数据保护装置的组成结构示意图,如图6所示,该装置包括:
生成模块10,用于在源代码的关键函数中添加异常指令;基于添加有所述异常指令的源代码生成带有反调试功能的程序;
初始化模块20,用于所述程序开始运行时,所述程序的主进程创建子进程并由所述子进程调试所述主进程,当所述主进程运行到所述异常指令后停止运行;
接收模块30,用于接收异常信号;
控制模块40,用于判断主进程是否被其他调试器调试;若所述主进程未被其他调试器调试,检测所述主进程停止运行的原因;检测到所述主进程停止运行的原因是因主进程的异常指令而产生时,将主进程异常指令恢复为正常指令并恢复所述主进程运行;其中,所述异常指令是预先在源代码的关键函数中添加的使所述主进程停止运行的指令。
在一实施例中,所述控制模块40,还用于:
检测到所述主进程停止运行的原因是因所述主进程的源代码而产生时,向所述主进程发送恢复信号,恢复所述主进程继续运行。
在一实施例中,所述控制模块40,还用于:
若确定所述主进程被其他调试器调试,向所述主进程发送终止信号,由所述主进程依据所述终止信号终止运行。
在一可选实施方式中,所述控制模块40,还用于:
基于所述异常信号获取错误函数指针地址;
根据所述错误函数指针地址判断所述主进程停止运行的原因。
在一可选实施方式中,所述控制模块40,还用于:
将所述错误函数指针修复为空函数指针,并向主进程发送恢复信号,恢复所述主进程运行。
在一具体实施方式中,所述控制模块40将所述错误函数指针修复为空函数指针,包括:
获取主进程的当前寄存器列表;
将所述寄存器列表中程序计数器寄存器值由所述错误函数指针修复为通过反调试初始化函数中获取的空函数指针;
将修复后的寄存器列表通过系统调用再设置回主进程,所述主进程基于所述修复后的寄存器列表从所述空函数开始执行。
在一可选实施方式中,所述生成模块10,具体用于:
在所述源代码的关键函数中添加预设错误函数指针以及对所述预设错误函数指针的调用。
在一可选实施方式中,所述生成模块10,具体用于:
将反调试静态库文件对应的反调试代码以及反调试头文件对应的反调试代码引入源代码;
在源代码中添加对反调试初始化函数的调用;
在源代码中添加空函数。
在一具体实施方式中,所述生成模块10,具体用于:
将反调试静态库文件以及反调试头文件放入源代码中;
通过修改源代码的第一源文件的方式将反调试静态库文件对应的反调试代码以及反调试头文件对应的反调试代码引入到源代码中;其中,所述第一源文件中记录有所述源代码中各类文件的编译顺序以及需要编译的文件。
这里,所述第一源文件可以是Makefile。
本领域技术人员应当理解,本实施例的数据保护装置中各模块的功能,可参照前述数据保护方法的相关描述而理解。
实际应用中,上述生成模块10、初始化模块20、接收模块30、控制模块40的具体结构均可对应于处理器。所述处理器具体的结构可以为中央处理器(CPU,CentralProcessing Unit)、微处理器(MCU,Micro Controller Unit)、数字信号处理器(DSP,Digital Signal Processing)或可编程逻辑器件(PLC,Programmable Logic Controller)等具有处理功能的电子元器件或电子元器件的集合。其中,所述处理器包括可执行代码,所述可执行代码存储在存储介质中,所述处理器可以通过总线等通信接口与所述存储介质中相连,在执行具体的各单元的对应功能时,从所述存储介质中读取并运行所述可执行代码。所述存储介质用于存储所述可执行代码的部分优选为非瞬间存储介质。
本实施例所述数据保护装置的表现形式可以是反调试代码集成工具包。
图7示例性示出了用于实现数据保护装置的一个可选的硬件结构示意图,包括处理器21、输入/输出接口23(例如显示屏、触摸屏、扬声器),存储介质24以及网络接口22,组件可以经系统总线25连接通信。相应地,数据保护装置的存储介质24中存储有用于执行本发明实施例提供的数据保护方法的可执行指令。
其中,所述存储介质24可以是移动存储装置、随机存取存储器(RAM,RandomAccess Memory)、只读存储器(ROM,Read-Only Memory)、磁碟或者光盘等各种可以存储程序代码的介质。优选地,所述存储介质24可为非易失性存储介质。
其中,处理器21可以是CPU、MCU、DSP、PLC,还可以是处理电路,例如,专用集成电路(ASIC,Application Specific Integrated Circuits)。
具体地,所述处理器21通过所述系统总线25从所述存储介质24中读取并执行数据保护方法的可执行指令,可执行如下步骤:
在源代码的关键函数中添加异常指令;
基于添加有所述异常指令的源代码生成带有反调试功能的程序;
所述程序开始运行时,所述程序的主进程创建子进程并由所述子进程调试所述主进程,当所述主进程运行到所述异常指令后停止运行;
所述子进程接收到异常信号时,判断主进程是否被其他调试器调试;若所述主进程未被其他调试器调试,检测所述主进程停止运行的原因;检测到所述主进程停止运行的原因是因主进程的异常指令而产生时,将主进程异常指令恢复为正常指令并恢复所述主进程运行;其中,所述异常指令是预先在源代码的关键函数中添加的使所述主进程停止运行的指令。
本实施例所述数据保护装置,由于在开发者开发出的源代码的关键函数中添加了异常指令,而该异常指令能够使得带有反调试功能的程序运行到该异常指令时,使得程序停止运行,而且由于程序每运行到关键函数时,均会遇到异常指令,提高了对关键函数的保护程度,也保证了外界调试器分析主程序时无法绕过异常指令,进而能提高破解反调试的难度。而且,由于只就关键函数进行了反调试保护,另外只在运行到异常指令才进行外部调试器检测,相比于采用轮询方式的反调试方案来说,不会因程序增加反调试功能而使程序性能明显下降。同时,由所述程序的子进程使用预设系统函数调试所述程序的主进程,便于对主进程的状态进行检测,当子进程在确定所述程序被停止运行是因所述异常指令而产生时,恢复异常指令为正常指令,并向所述主进程发送恢复信号,使所述程序恢复运行,即,恢复指令由所述程序的子进程来控制,保证在所述程序的子进程对程序进行调试时,程序能正常运行;由于只有所述程序的子进程能够恢复程序运行,提高了外界调节器破解反调试的难度。
本发明实施例还记载了一种生成带有反调试功能的程序的装置,所述装置包括:
生成模块10,用于在源代码的关键函数中添加异常指令;基于添加有所述异常指令的源代码生成带有反调试功能的程序。
在一实施例中,所述生成模块10包括:
添加单元,用于获取函数列表;基于函数列表确定源代码的关键函数;在所述源代码的关键函数中添加异常指令;在所述源代码中添加反调试代码;
生成单元,用于通过编译所述带有反调试代码、以及所述异常指令的源代码,生成带有反调试功能的程序。
其中,所述函数列表中存储有需保护的关键函数的函数标识。
在一可选实施方式中,所述添加单元,具体用于:
在源代码中添加预设错误函数指针以及对所述预设错误函数指针的调用。
在一可选实施方式中,所述添加单元,还具体用于:
将反调试静态库文件对应的反调试代码以及反调试头文件对应的反调试代码引入源代码;
在源代码中添加对反调试初始化函数的调用;
在源代码中添加空函数。
在一可选实施方式中,所述添加单元,还具体用于:
将反调试静态库文件以及反调试头文件放入源代码中;
通过修改源代码的第一源文件的方式将反调试静态库文件对应的反调试代码以及反调试头文件对应的反调试代码引入到源代码中;其中,所述第一源文件中记录有源代码中各类文件的编译顺序以及需要编译的文件。
这里,所述第一源文件为Makefile。
本领域技术人员应当理解,本实施例的生成带有反调试功能的程序的装置中各模块的功能,可参照前述生成带有反调试功能的程序的方法的相关描述而理解。
图8为本发明实施例提供的数据保护系统的一种交互示意图,如图8所示,带有反调试功能的程序安装于终端中,该程序运行时,劫持者预通过外界调试器劫持该程序,如预改变该程序的函数执行逻辑;由于该程序的关键函数中都添加有异常指令,那么,外界调试器分析该程序时无法绕过异常指令,由于程序每运行到关键函数时,均会遇到异常指令,使得程序停止运行。程序由子进程即自身调试器调试主进程,在运行时使用子进程修复的方式,保证程序在运行时必须有子进程的参与才能正常运行,使得外界调试器调试变得非常困难,保证了动态库代码逻辑的安全。另外,在程序运行时,子进程使用预设系统函数调试所述程序的主进程,便于对主进程的状态进行检测,若子进程确定主进程未被其他调试器调试,在确定所述程序被停止运行是因所述异常指令而产生时,恢复异常指令为正常指令,并向所述主进程发送恢复信号,使所述程序恢复运行,即,恢复指令由所述程序的子进程来控制,保证在所述程序的子进程对程序进行调试时,程序能正常运行;由于只有所述程序的子进程能够恢复程序运行,提高了外界调节器破解反调试的难度。
在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元;既可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。
另外,在本发明各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
或者,本发明上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本发明各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
Claims (15)
1.一种数据保护方法,其特征在于,所述方法包括:
在源代码的关键函数中添加异常指令;
在添加有所述异常指令的源代码中添加反调试代码,生成带有反调试功能的代码;
通过编译带有所述反调试代码、以及所述异常指令的所述源代码,生成带有反调试功能的程序;
所述程序开始运行时,所述程序的主进程创建子进程并由所述子进程调试所述主进程,当所述主进程运行到所述异常指令后停止运行;
所述子进程接收到异常信号时,判断所述主进程是否被其他调试器调试;
若所述主进程被其他调试器调试,向所述主进程发送终止信号,由所述主进程依据所述终止信号终止运行;
若所述主进程未被其他调试器调试,检测所述主进程停止运行的原因;
当检测到所述主进程停止运行的原因是因所述主进程的源代码而产生时,向所述主进程发送恢复信号,恢复所述主进程继续运行;
当检测到所述主进程停止运行的原因是因所述主进程的异常指令而产生时,将所述主进程的异常指令恢复为正常指令并恢复所述主进程运行。
2.根据权利要求1所述的方法,其特征在于,所述程序的主进程创建子进程,包括:
所述程序的主进程先进入反调试初始化函数;
所述主进程基于所述反调试初始化函数查找编译前添加的空函数对应的空函数指针,并创建子进程,以由所述子进程使用预设系统函数调试所述主进程。
3.根据权利要求1所述的方法,其特征在于,所述检测所述主进程停止运行的原因,包括:
基于所述异常信号获取错误函数指针地址;
根据所述错误函数指针地址判断所述主进程停止运行的原因。
4.根据权利要求3所述的方法,其特征在于,所述将主进程的异常指令恢复为正常指令并恢复所述主进程运行,包括:
将所述错误函数指针修复为空函数指针,并向主进程发送恢复信号,恢复所述主进程运行。
5.根据权利要求4所述的方法,其特征在于,所述将所述错误函数指针修复为空函数指针,包括:
获取主进程的当前寄存器列表;
将所述寄存器列表中程序计数器寄存器值由所述错误函数指针修复为通过反调试初始化函数中获取的空函数指针;
将修复后的寄存器列表通过系统调用再设置回主进程,所述主进程基于所述修复后的寄存器列表从所述空函数开始执行。
6.根据权利要求1所述的方法,其特征在于,所述在源代码的关键函数中添加异常指令,包括:
获取函数列表;其中,所述函数列表中存储有需保护的关键函数的函数标识;
基于函数列表确定源代码的关键函数;
在所述源代码的关键函数中添加预设错误函数指针以及对所述预设错误函数指针的调用。
7.根据权利要求1所述的方法,其特征在于,所述在添加有所述异常指令的源代码中添加反调试代码,包括:
将反调试静态库文件对应的反调试代码以及反调试头文件对应的反调试代码引入源代码;
在所述源代码中添加对反调试初始化函数的调用;
在所述源代码中添加空函数。
8.根据权利要求7所述的方法,其特征在于,所述将反调试静态库文件对应的反调试代码以及反调试头文件对应的反调试代码引入源代码,包括:
将反调试静态库文件以及反调试头文件放入源代码中;
通过修改源代码的第一源文件的方式将所述反调试静态库文件对应的反调试代码以及所述反调试头文件对应的反调试代码引入到源代码中;其中,所述第一源文件中记录有所述源代码中各类文件的编译顺序以及需要编译的文件。
9.一种数据保护装置,其特征在于,所述装置包括:
生成模块,用于在源代码的关键函数中添加异常指令;在添加有所述异常指令的源代码中添加反调试代码,生成带有反调试功能的代码;通过编译带有所述反调试代码、以及所述异常指令的所述源代码,生成带有反调试功能的程序;
初始化模块,用于所述程序开始运行时,所述程序的主进程创建子进程并由所述子进程调试所述主进程,当所述主进程运行到所述异常指令后停止运行;
接收模块,用于接收异常信号;
控制模块,用于判断所述主进程是否被其他调试器调试;若所述主进程被其他调试器调试,向所述主进程发送终止信号,由所述主进程依据所述终止信号终止运行;若所述主进程未被其他调试器调试,检测所述主进程停止运行的原因;当检测到所述主进程停止运行的原因是因所述主进程的源代码而产生时,向所述主进程发送恢复信号,恢复所述主进程继续运行;当检测到所述主进程停止运行的原因是因主进程的异常指令而产生时,将所述主进程的异常指令恢复为正常指令并恢复所述主进程运行。
10.根据权利要求9所述的装置,其特征在于,所述初始化模块,还用于:
所述程序的主进程先进入反调试初始化函数;
所述主进程基于所述反调试初始化函数查找编译前添加的空函数对应的空函数指针,并创建子进程,以由所述子进程使用预设系统函数调试所述主进程。
11.根据权利要求9所述的装置,其特征在于,所述控制模块,还用于:
基于所述异常信号获取错误函数指针地址;
根据所述错误函数指针地址判断所述主进程停止运行的原因。
12.根据权利要求11所述的装置,其特征在于,所述控制模块,还用于:
将所述错误函数指针修复为空函数指针,并向主进程发送恢复信号,恢复所述主进程运行。
13.根据权利要求12所述的装置,其特征在于,所述控制模块,还用于:
获取主进程的当前寄存器列表;
将所述寄存器列表中程序计数器寄存器值由所述错误函数指针修复为通过反调试初始化函数中获取的空函数指针;
将修复后的寄存器列表通过系统调用再设置回主进程,所述主进程基于所述修复后的寄存器列表从所述空函数开始执行。
14.一种数据保护装置,其特征在于,所述装置包括:
存储器,用于存储可执行程序;
处理器,用于执行所述存储器中存储的可执行程序时,实现如权利要求1至8任一项所述的数据保护方法。
15.一种计算机可读存储介质,其特征在于,存储有可执行程序,所述可执行程序被处理器执行时,实现如权利要求1至8任一项所述的数据保护方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610929145.9A CN108021791B (zh) | 2016-10-31 | 2016-10-31 | 数据保护方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610929145.9A CN108021791B (zh) | 2016-10-31 | 2016-10-31 | 数据保护方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108021791A CN108021791A (zh) | 2018-05-11 |
CN108021791B true CN108021791B (zh) | 2021-08-10 |
Family
ID=62070490
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610929145.9A Active CN108021791B (zh) | 2016-10-31 | 2016-10-31 | 数据保护方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108021791B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110046479B (zh) * | 2019-03-21 | 2023-02-28 | 腾讯科技(深圳)有限公司 | 一种基于安卓操作系统的链接库文件反调试方法及装置 |
CN111427623B (zh) * | 2020-03-20 | 2023-06-30 | 北京奇艺世纪科技有限公司 | 程序退出方法、装置、计算机设备和存储介质 |
CN111814119B (zh) * | 2020-05-27 | 2021-03-19 | 广州锦行网络科技有限公司 | 一种反调试的方法 |
CN112527677B (zh) * | 2020-12-23 | 2021-09-24 | 北京深思数盾科技股份有限公司 | 应用程序的保护方法及电子设备 |
CN112948241B (zh) * | 2021-02-09 | 2024-02-06 | 北京奇艺世纪科技有限公司 | 应用程序的反调试方法、装置、电子设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103116715A (zh) * | 2013-03-01 | 2013-05-22 | 中标软件有限公司 | Windows平台可执行文件API延迟导入保护方法 |
CN103164643A (zh) * | 2011-12-08 | 2013-06-19 | 北京深思洛克软件技术股份有限公司 | 一种通过硬件进行反调试的方法和装置 |
WO2014164652A1 (en) * | 2013-03-11 | 2014-10-09 | Blubox Security Inc. | Mobile devices with inhibited application debugging and methods of operation |
CN105718374A (zh) * | 2016-01-26 | 2016-06-29 | 国家信息技术安全研究中心 | 一种热点模块指令跟踪的方法及系统 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7415699B2 (en) * | 2003-06-27 | 2008-08-19 | Hewlett-Packard Development Company, L.P. | Method and apparatus for controlling execution of a child process generated by a modified parent process |
CN102063366B (zh) * | 2009-11-18 | 2014-12-31 | 中兴通讯股份有限公司 | 调试进程的方法和系统 |
KR101519845B1 (ko) * | 2013-11-14 | 2015-05-13 | (주)잉카엔트웍스 | 안티디버깅 방법 |
CN104932972B (zh) * | 2014-03-19 | 2018-10-09 | 北京娜迦信息科技发展有限公司 | 一种反动态调试应用程序的方法及装置 |
CN105787305B (zh) * | 2016-02-26 | 2018-08-10 | 西北大学 | 一种抵抗符号执行和污点分析的软件保护方法 |
-
2016
- 2016-10-31 CN CN201610929145.9A patent/CN108021791B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103164643A (zh) * | 2011-12-08 | 2013-06-19 | 北京深思洛克软件技术股份有限公司 | 一种通过硬件进行反调试的方法和装置 |
CN103116715A (zh) * | 2013-03-01 | 2013-05-22 | 中标软件有限公司 | Windows平台可执行文件API延迟导入保护方法 |
WO2014164652A1 (en) * | 2013-03-11 | 2014-10-09 | Blubox Security Inc. | Mobile devices with inhibited application debugging and methods of operation |
CN105718374A (zh) * | 2016-01-26 | 2016-06-29 | 国家信息技术安全研究中心 | 一种热点模块指令跟踪的方法及系统 |
Non-Patent Citations (1)
Title |
---|
《基于硬件虚拟化反调试的软件保护设计》;伊腾飞;《中国优秀硕士学位论文全文数据库(信息科技辑)》;20101115;第2010年卷(第11期);第I138-91页 * |
Also Published As
Publication number | Publication date |
---|---|
CN108021791A (zh) | 2018-05-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108021791B (zh) | 数据保护方法及装置 | |
CN109783342B (zh) | 脚本调试方法、设备及计算机存储介质 | |
CN105843741B (zh) | 应用程序的信息处理方法和装置 | |
CN107515808B (zh) | 日志记录方法、装置、计算机设备和计算机可读存储介质 | |
CN110046479B (zh) | 一种基于安卓操作系统的链接库文件反调试方法及装置 | |
KR100868762B1 (ko) | 임베디드용 소프트웨어의 오류 검출 방법 | |
US8370816B2 (en) | Device, method and computer program product for evaluating a debugger script | |
US7882495B2 (en) | Bounded program failure analysis and correction | |
CN105550585B (zh) | 一种应用程序安全性测试方法、装置和系统 | |
US9009678B2 (en) | Software debugging with execution match determinations | |
CN104932972B (zh) | 一种反动态调试应用程序的方法及装置 | |
US10078510B1 (en) | Late-stage software feature reduction tool for security and performance | |
CN110580226A (zh) | 操作系统级程序的目标码覆盖率测试方法、系统及介质 | |
CN109684795B (zh) | 应用程序反调试的方法、装置及电子设备 | |
US11055416B2 (en) | Detecting vulnerabilities in applications during execution | |
KR20180018722A (ko) | 실패한 테스트 스크립트들에 대한 디버그 정보를 생성, 캡처, 저장 및 로딩하기 위한 방법 및 장치 | |
US20120110383A1 (en) | Method and apparatus for off-line analyzing crashed programs | |
CN113467981A (zh) | 异常处理的方法和装置 | |
CN114510429B (zh) | 一种基于动态符号执行的调试方法、系统和介质 | |
CN112199642A (zh) | 一种安卓系统反调试的检测方法、移动终端及存储介质 | |
CN113127329A (zh) | 脚本调试方法、装置及计算机存储介质 | |
CN110647467B (zh) | 基于单步异常的目标码覆盖率测试方法、系统及介质 | |
CN112052165B (zh) | 一种检测目标函数被调试的方法、系统及存储介质 | |
CN112527571B (zh) | 一种cpu指令集覆盖率计算方法及装置 | |
CN111382416B (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 |