CN108804937B - 系统函数调用方法及相关装置 - Google Patents
系统函数调用方法及相关装置 Download PDFInfo
- Publication number
- CN108804937B CN108804937B CN201810601633.6A CN201810601633A CN108804937B CN 108804937 B CN108804937 B CN 108804937B CN 201810601633 A CN201810601633 A CN 201810601633A CN 108804937 B CN108804937 B CN 108804937B
- Authority
- CN
- China
- Prior art keywords
- address
- system function
- module
- function
- memory space
- 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 51
- 230000006870 function Effects 0.000 claims abstract description 297
- 230000008569 process Effects 0.000 claims description 12
- 238000004590 computer program Methods 0.000 claims description 5
- 238000010276 construction Methods 0.000 claims description 3
- 230000008676 import Effects 0.000 description 8
- 230000009471 action Effects 0.000 description 3
- 125000004122 cyclic group Chemical group 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 230000001419 dependent effect Effects 0.000 description 1
- 230000002708 enhancing effect Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000004806 packaging method and process Methods 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 230000003068 static effect 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/60—Protecting data
- G06F21/602—Providing cryptographic facilities or services
-
- 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/60—Protecting data
- G06F21/604—Tools and structures for managing or administering access control systems
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Health & Medical Sciences (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Health & Medical Sciences (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Bioethics (AREA)
- Automation & Control Theory (AREA)
- Storage Device Security (AREA)
Abstract
本申请提供了一种系统函数调用方法,该方法可以构建地址存储单元,其中存储有自加载的系统函数的接口地址,该系统函数加载在动态随机分配的内存空间中,因此其接口地址也是动态的随机的非公知的,应用程序需要调用系统函数时,并非调用系统自身加载的具有公知地址的系统函数,而是从地址存储单元中查找加密后的自加载系统函数的接口地址,并基于该接口地址进行系统函数调用。地址存储单元并非是公知的,系统函数的接口地址在其中的位置并不能容易被恶意程序获得,且接口地址也是经过加密的,从而在很大程度上提高了系统函数的调用安全性。另外,本申请还提供了系统函数调用的相关装置,用以保证所述方法在实际中的应用及实现。
Description
技术领域
本申请涉及计算机软件技术领域,更具体地,是系统函数调用方法及相关装置。
背景技术
软件程序运行的系统中通常设置有各种系统模块,如kernel32.dll模块,应用程序在运行过程中,为了实现某项功能可以调用提供该功能实现的系统函数。例如,某个应用程序需要打开一个文件,其可以调用系统提供的打开文件的函数。
目前的系统函数调用过程,容易被外挂程序等恶意程序监听,调用相关的数据信息存在泄露的风险。
发明内容
有鉴于此,本申请提供了一种系统函数调用方法,该方法可以提高系统函数调用的安全性。
为实现所述目的,本申请提供的技术方案如下:
第一方面,本申请提供了一种系统函数调用方法,包括:
确定应用程序需要调用的目标系统函数;
在预先构建的地址存储单元中,查找所述目标系统函数的加密接口地址;其中所述加密接口地址为在动态分配的内存空间中加载的目标系统函数的接口地址;
获得所述目标系统函数对应的地址解密参数;
使用所述地址解密参数对所述加密接口地址进行解密,得到原文的接口地址;
使用所述原文的接口地址,调用所述目标系统函数。
第二方面,本申请提供了一种系统函数调用装置,包括:
目标系统函数确定模块,用于确定应用程序需要调用的目标系统函数;
加密接口地址获得模块,用于在预先构建的地址存储单元中,查找所述目标系统函数的加密接口地址;其中所述加密接口地址为在动态分配的内存空间中加载的目标系统函数的接口地址;
地址解密参数获得模块,用于获得所述目标系统函数对应的地址解密参数;
原文接口地址获得模块,用于使用所述地址解密参数对所述加密接口地址进行解密,得到原文的接口地址;
目标系统函数调用模块,用于使用所述原文的接口地址,调用所述目标系统函数。
第三方面,本申请提供了一种可读性存储介质,其上存储有计算机程序,所述计算机程序可以被处理器执行,以实现系统函数调用方法。
由以上方案可知,本申请提供了一种系统函数调用方法,该方法可以构建地址存储单元,其中存储有自加载的系统函数的接口地址,该系统函数加载在动态随机分配的内存空间中,因此其接口地址也是动态的随机的非公知的,应用程序需要调用系统函数时,并非调用系统自身加载的具有公知地址的系统函数,而是从地址存储单元中查找加密后的自加载系统函数的接口地址,并基于该接口地址进行系统函数调用。地址存储单元并非是公知的,系统函数的接口地址在其中的位置并不能容易被恶意程序获得,且接口地址也是经过加密的,从而在很大程度上提高了系统函数的调用安全性。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请提供的系统函数调用方法的一种流程示意图;
图2为本申请提供的构建地址存储单元的一种流程示意图;
图3为本申请提供的系统函数调用装置的一种结构示意图;
图4为本申请提供的系统函数调用装置的另一种结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
目前,应用程序所调用的系统函数地址是公知的,恶意程序可以容易地获得该公知地址,从而利用该公知地址进行数据窃取。
具体地,系统函数在内存空间中的接口地址是公知的,外挂程序等恶意程序可以根据公知的地址,在系统函数的接口地址处设置断点或钩子等恶意程序。这样,外挂程序注入到应用程序后,便可以监听应用程序对系统函数的调用,从调用请求中获取到想要监听的信息。
例如,应用程序想要打开一个文件,需要调用系统中的打开文件函数。这个函数由于是系统函数,其接口地址是公知的,外挂程序若想要盗取文件信息,便可以在该函数的接口地址处设置恶意程序,这样在应用程序调用该函数打开某个文件时,外挂程序便可以拦截该调用请求,并从调用请求中获取与被打开文件的相关信息。需要说明的是,外挂程序可以并非监听打开文件函数,还可能根据自身想要盗取的信息的类型,来监听相应的系统函数。
为了解决上述技术问题,本申请在动态内存空间中自加载系统函数,并控制应用程序调用自加载的系统函数,而非系统自身加载的具有公知地址的系统函数,以保证系统函数调用过程的安全性。
见图1,其示出了本申请提供的系统函数调用方法的一种流程,具体包括如下步骤S101~S105。
S101:确定应用程序需要调用的目标系统函数。
其中,不同的应用程序,需要调用的系统函数不同,本步骤的应用程序可以是任意的一个应用程序,为了便于描述,可以将本步骤中的应用程序称为目标应用程序。应用程序需要调用哪些系统函数可以预先配置,并保存在配置信息中,从而本申请根据配置信息便可以确定目标应用程序需要调用的系统函数,为了便于描述,可以将查找的系统函数称为目标系统函数。
需要说明的是,本申请可以自定义与系统函数对应的调用函数,自定义调用函数的名称与系统函数的名称可以不同,但传入参数、返回值等相关信息是相同的。可以理解的是,自定义调用函数是一种外层封装函数。根据本步骤所确定出的目标系统函数,确定与该目标系统函数对应的自定义调用函数,由自定义调用函数内部执行以下步骤S102至S105。例如,应用程序需要调用的系统函数为打开文件函数OpenFile,可以自定义调用函数Self_OpenFile,该自定义的调用函数可以实现步骤S102-S105的流程,以在自定义函数内部调用自加载的OpenFile接口地址。
或者,可以并不调用自定义调用函数,而是直接执行以下步骤S102~S105。
S102:在预先构建的地址存储单元中,查找目标系统函数的加密接口地址;其中加密接口地址为在动态分配的内存空间中加载的目标系统函数的接口地址。
其中,本申请预先构建有地址存储单元,该单元中记录的是多个系统函数经过加密后的接口地址。该多个系统函数可以是同一个系统模块所包含的系统函数,也可以是多个不同系统模块包含的系统函数。
地址存储单元中包含有多个存储元素,不同的加密接口地址可以存储在不同的存储元素中。例如,地址存储单元可以为但不局限于数组。
需要说明的是,本申请会自加载系统模块中的系统函数,自加载的具体方式是,在应用程序的内存空间中动态为系统模块分配内存空间,并模拟操作系统如windows系统的加载器方式,将系统模块加载到内存空间中,从而实现了将系统模块的系统函数自加载了一份至该动态分配的内存空间中。由于内存空间是动态分配的,这样加载在其中的系统函数的接口地址也是动态的随机的,并非是固定的。另外,自加载的系统函数的接口地址并不会记录在系统公知的地址文件中,恶意程序不能简单地通过遍历该地址文件得到系统函数的接口地址,从而保证了系统函数的接口地址的私密性,不容易被恶意程序所获取到。
S103:获得目标系统函数对应的地址解密参数。
其中,地址存储单元中的接口地址是经过加密的,进一步保证了接口地址的安全性。加密的参数可以称为地址解密参数,为了完成系统函数的调用,需要获得该地址解密参数对加密的接口地址进行解密。
需要说明的是,在构建地址存储单元时,可以为各个系统函数生成对应的地址解密参数,并可以记录各个系统函数与地址解密参数的对应关系,从而本步骤可以根据该对应关系,查找目标系统函数对应的地址解密参数。地址存储单元的构建方式可以参见下文,此处并不赘述。
为了进一步增强数据安全性,该对应关系中的系统函数是加密后的系统函数名称。系统函数名称的加密方式可以参见下文,此处并不赘述。
需要说明的是,本步骤并不局限于在步骤S102之后执行,也可以是在其之前执行,或者与其同时执行。
S104:使用地址解密参数对加密接口地址进行解密,得到原文的接口地址。
可以理解的是,解密的方式与加密方式相反,经过解密后便可以得到系统函数在内存空间中的明文接口地址,明文接口地址也可以称为原文接口地址。
S105:使用原文的接口地址,调用目标系统函数。
其中,按照明文的接口地址对目标系统函数进行调用,以在应用程序中实现目标系统函数的功能。
由以上技术方案可知,本申请可以构建地址存储单元,其中存储有自加载的系统函数的接口地址,该系统函数加载在动态随机分配的内存空间中,因此其接口地址也是动态的随机的非公知的,应用程序需要调用系统函数时,并非调用系统自身加载的具有公知地址的系统函数,而是从地址存储单元中查找加密后的自加载系统函数的接口地址,并基于该接口地址进行系统函数调用。地址存储单元并非是公知的,系统函数的接口地址在其中的位置并不能容易被恶意程序获得,且接口地址也是经过加密的,从而在很大程度上提高了系统函数的调用安全性。
如下具体说明如何构建地址存储单元。
见图2,其示出了本申请提供的构建地址存储单元的一种流程,具体包括步骤S201~S206。
S201:确定包含目标系统函数的系统模块。
其中,不同的应用程序,需要调用的系统函数不同,系统函数存储在系统模块中。根据应用程序需要调用的系统函数,来确定应用程序需要调用的系统模块,如系统模块kernel32.dll、系统模块ntdll.dll。例如,某个应用程序需要调用打开文件这个系统函数,该系统函数保存在kernel32.dll这个系统模块中,因此可以确定应用程序需要调用的系统模块为系统模块kernel32.dll。
为了便于描述,应用程序所需要调用的系统模块可以称为目标系统模块。目标系统模块可以包括多个系统函数,目标系统函数为包含的多个系统函数中的一个。
S202:判断系统模块是否加载至为系统模块动态分配的内存空间中;若是,执行步骤S203;若否,执行步骤S206。
其中,一种判断方式是,在自加载成功后可以设置加载成功的标志位,判断是否存在该标志位来判断系统模块是否已经成功加载至内存空间中。
另一种判断方式可以是,获得系统模块的存储路径;遍历加载模块记录单元,以查找加载模块记录单元中是否包含获得的存储路径。其中,加载模块记录单元中记录有所有成功子记载的系统模块,具体记录的是系统模块的存储路径。存储路径可以是经过加密如哈希加密的存储路径。另外,系统模块的存储路径可以是全路径,如如系统模块的名称为kernel32.dll,系统模块的存储路径为C:\WINDOWS\system32\kernel32.dll。有关加载模块记录单元的记录方式可以参见步骤S205中的说明。
S203:获得系统模块包含的各个系统函数在内存空间中的接口地址。
其中,首先,确定系统模块中包含的各个系统函数。
具体地,可以使用逆向分析工具遍历系统模块,以得到系统模块中所有系统函数原型,将系统函数原型包含在函数原型列表中导出。系统函数原型可以包含但不局限于系统函数的名称、传入参数等相关信息。一个系统模块中可能包含有几十个甚至上百个系统函数。
然后,获得各个系统函数在内存空间中的接口地址。
具体地,在动态分配的内存空间中加载系统模块后,会生成该系统模块的导入表,导入表中记录的是系统函数的名称与系统函数接口地址之间的对应关系,简单来讲,记录的是函数名称与接口地址之间的对应关系,从而通过系统函数的名称进行遍历便可以得到系统函数的接口地址。
遍历的具体步骤是,获得系统模块所对应的所有系统函数的名称,然后在导入表中进行名称匹配,即匹配与所获得的系统函数名称相同的系统函数名称,进而在导入表中,获得匹配到的系统函数名称对应的接口地址。简单来讲,就是使用系统函数的名称在导入表中查找接口地址。
为了增加安全性,使用的系统函数名称是经过加密的名称,这样在名称匹配时,需要将导入表中的系统函数名称进行加密,然后比对加密后的系统函数名称是否相同。或者,导入表中系统函数的名称本身是加密后的名称,从而名称匹配时,可以使用加密的系统函数名称直接与导入表中的名称进行比对。这样做的目的是,即使被外挂程序拦截,系统函数名称也是加密后的,保证了系统函数调用的安全性。
需要说明的是,得到的该接口地址是系统函数在目标内存空间中的地址,该地址为随机分配的地址,非公知的地址。
S204:加密各个系统函数的接口地址。
其中,加密处理算法可以是现有的任意一种方式。例如,可以使用随机数进行加密。具体地:
为各个系统函数生成随机的地址解密参数,并记录系统函数与地址解密参数的对应关系;将各个系统函数的接口地址与各个系统函数的地址解密参数进行异或运算,以加密各个系统函数的接口地址。当然,加密运算还可以是其他运算方式,并不局限于上述异或运算。
需要说明的是,记录的系统函数与地址解密参数之间的对应关系,还可以用于图1中步骤S103如何获得地址解密参数,即根据该对应关系进行查找,具体地,在记录的系统函数与地址解密参数的对应关系中,查找目标系统函数对应的地址解密参数。另外,对应关系中的系统函数具体为系统函数的加密名称,这样不能容易地得到每个系统函数,从而可以进一步增强系统函数的地址解密参数的安全性。
S205:将各个系统函数的加密接口地址存储至地址存储单元中。
其中,地址存储单元可以是数组,也可以是链表等其他形式的存储结构。需要说明的是,该地址存储单元在应用程序内具有全局唯一性,可以被各个应用程序内部的各个模块访问。本步骤的目的是,在调用系统函数时,可以从地址存储单元中获得系统函数的接口地址,从而根据该地址调用在内存空间中的该系统函数。
需要说明的是,加密接口地址在地址存储单元中的存储位置可以是预先设置的,存储位置也可以称为地址索引。具体地:为各个系统函数生成随机的地址索引,并记录系统函数与地址索引的对应关系。
记录的对应关系以便步骤S102等步骤在该存储位置中查找到加密接口地址。具体地,可以在记录的系统函数与地址索引的对应关系中,查找目标系统函数对应的目标地址索引,在地址存储单元中,定位目标地址索引对应的存储元素,从而在该存储元素中获得加密接口地址。
这样加密接口地址在地址存储单元中可能并不是连续的,例如系统函数A存储在第5个位置,系统函数B存储在第7个位置,从而使得外挂程序在静态分析时,并不能通过简单遍历地址存储单元获得系统函数的接口地址,进一步保证了系统函数调用的安全性。
获得地址索引后,进而在地址存储单元中,确定各个系统函数的地址索引对应的存储元素,并将系统函数的加密接口地址存储至对应的存储元素中。
S206:将系统模块加载至内存空间中,并返回执行步骤S203。
其中,自加载步骤可以包括:
获得系统模块的可执行文件;将可执行文件的相关信息拷贝至为系统模块动态分配的内存空间中;以及获得系统模块的存储路径并进行加密,将加密后的存储路径存储至加载模块记录单元中。
具体地,应用程序每次启动后,都会创建自身的内存空间。然后,在该内存空间中动态分配一部分内存空间,用于存储所拷贝的系统模块。内存空间是动态随机分配的,这样系统模块中系统函数的内存地址也是动态的、随机的。相对于系统模块的公知地址而言,该内存空间的地址是匿名的,外挂等程序无法直接获取到。需要说明的是,分配的内存空间的大小是按照系统模块的大小设定的。
从可执行文件中获得系统模块的相关信息,按照系统的加载方式,将系统模块的相关信息加载至内存空间中,从而实现将系统模块拷贝至内存空间中。加载过程包括多个步骤,如修复重定位表、导入表等信息,将内存空间的属性设置为可读写、可执行,获得该内存空间中所有依赖的句柄列表并保存。这些内容是加载过程需要实现的现有内容,对此并不赘述。
需要说明的是,应用程序所在的系统会自己加载系统模块,本申请在将系统模块自记载至内存空间之前,还可以判断系统加载的系统模块与本申请自加载的系统模块是否一致。
导致两者不一致的原因可能是,应用程序所在的系统在启动阶段,会加载系统模块,启动完成后系统可能进行自身更新,从其他设备中下载系统模块的更新内容,将下载的更新内容保存在可执行文件中,这样可执行文件中的系统模块就与系统在启动时所加载的系统模块就不一致,而本申请是从可执行文件中拷贝系统模块的内容,从而导致了本申请所加载的系统模块与系统本身加载的系统模块不一致。
具体地判断方式为,在将可执行文件的相关信息拷贝至为系统模块动态分配的内存空间中之前,还包括:获得由系统加载的系统模块的原生地址,并使用原生地址,获得由系统加载的系统模块的版本信息;从可执行文件中,获得加载至动态分配的内存空间中的系统模块的版本信息;在两个版本信息一致的情况下,执行将可执行文件的相关信息拷贝至为系统模块动态分配的内存空间中的步骤。
获取系统所加载的系统模块的基地址,根据基地址确定系统模块的版本信息,如时间戳和/或循环冗余校验(Cyclic Redundancy Check,简称CRC)值。从可执行文件中查找系统模块的内容,从内容中提取系统模块的版本信息,如时间戳和/或循环冗余校验值。将系统所加载系统模块的版本信息与从可执行文件中所提取到的系统模块的版本信息进行比对,以确定两个系统模块是否一致。
如果两个系统模块不一致,则说明系统刚刚下载了补丁等更新内容,从而提示用户退出并重新启动系统。如果两个系统模块一致,则拷贝可执行文件中的系统模块的内容,依据系统模块的内容将系统模块加载至应用程序动态分配的内存空间中。
需要说明的是,在将系统模块加载至内存空间中之后,还可以包括:获得系统模块在动态分配内存空间的基地址,以及获得系统模块的加密模块名称;生成加载成功标识;建立加密模块名称与基地址之间的映射关系,并建立加密模块名称与加载成功标识之间的映射关系。这样,可以在后续查找过程中,可以通过系统模块的加密模块名称得到动态分配内存空间的基地址及加载成功标识。
有关本申请提供的系统函数调用方法,补充以下几点说明。
第一,在本申请中系统模块名称被加密,作用是防止明文的系统模块名称被直接获取到,增强安全性。系统模块中系统函数的名称也是经过加密的,在调用过程中并不能被直接获取到。具体的加密方式包括如下步骤。
1、获得系统模块的名称,对系统模块的名称进行加密。
其中,系统模块名称可以是模块名称自身,也可以是包含模块名称的存储路径,如某个盘符下的该模块名称。加密方式可以是但不局限于哈希加密,如果使用哈希加密方法,则得到的是系统模块名称的哈希值,该哈希值可以称为模块名称哈希。
2、确定系统模块中包含的系统函数,并对系统函数的名称进行加密。
加密方法可以是但不局限于哈希算法。如果系统函数为多个,为了进一步增强安全性,可以使用不同的加密算法对不同的系统函数进行加密。例如,函数原型列表中包含有多个系统函数,可以使用一种加密算法加密列表中的前半部分系统函数,使用另一种加密算法加密列表中的后半部分系统函数。加密后的系统函数名称可以包含在列表中。
3、建立加密后的系统模块名称与加密后的系统函数名称之间的对应关系。
这样,模块名称哈希与函数名称哈希之间具有绑定关系,通过模块名称哈希可以得到对应的函数名称哈希。
第二,在申请中可以自定义调用函数,该调用函数用于调用系统函数,相当于是对系统函数的外层封装。这样调用函数的相关信息如返回值、传入参数等并不能直接被获取到,增强了系统函数调用的安全性。
见图3,其示出了本申请提供的一种系统函数调用装置的结构,具体包括:
目标系统函数确定模块301,用于确定应用程序需要调用的目标系统函数;
加密接口地址获得模块302,用于在预先构建的地址存储单元中,查找所述目标系统函数的加密接口地址;其中所述加密接口地址为在动态分配的内存空间中加载的目标系统函数的接口地址;
地址解密参数获得模块303,用于获得所述目标系统函数对应的地址解密参数;
原文接口地址获得模块304,用于使用所述地址解密参数对所述加密接口地址进行解密,得到原文的接口地址;
目标系统函数调用模块305,用于使用所述原文的接口地址,调用所述目标系统函数。
见图4,其示出了本申请提供的一种系统函数调用装置的另一个结构,在图3所示的结构基础上,还可以包括:地址存储单元的构建模块306。
存储单元的构建模块306具体用于确定包含所述目标系统函数的系统模块;其中所述目标系统函数为所述系统模块包含的多个系统函数中的一个;判断所述系统模块是否加载至为所述系统模块动态分配的所述内存空间中;若是,获得所述系统模块包含的各个系统函数在所述内存空间中的接口地址;以及加密各个系统函数的接口地址,并将各个系统函数的加密接口地址存储至地址存储单元中。
存储单元的构建模块306还可以用于若所述系统模块未加载至为所述系统模块动态分配的所述内存空间中,则将所述系统模块加载至所述内存空间中;其中所述将所述系统模块加载至所述内存空间中具体包括以下步骤:获得所述系统模块的可执行文件;将所述可执行文件的相关信息拷贝至为所述系统模块动态分配的所述内存空间中;以及获得所述系统模块的存储路径并进行加密,将加密后的存储路径存储至加载模块记录单元中。
存储单元的构建模块306在执行判断所述系统模块是否加载至为所述系统模块动态分配的所述内存空间中方面时,具体用于:获得所述系统模块的存储路径;以及遍历所述加载模块记录单元,以查找所述加载模块记录单元中是否包含获得的所述存储路径。
存储单元的构建模块306在所述将所述可执行文件的相关信息拷贝至为所述系统模块动态分配的所述内存空间中之前,还用于:获得由系统加载的所述系统模块的原生地址,并使用所述原生地址,获得由系统加载的所述系统模块的版本信息;从所述可执行文件中,获得加载至动态分配的所述内存空间中的所述系统模块的版本信息;以及在两个版本信息一致的情况下,执行将所述可执行文件的相关信息拷贝至为所述系统模块动态分配的所述内存空间中的步骤。
存储单元的构建模块306在执行加密所述各个系统函数的接口地址方面时,具体用于:为各个系统函数生成随机的地址解密参数,并记录系统函数与地址解密参数的对应关系;以及将各个系统函数的接口地址与各个系统函数的地址解密参数进行异或运算,以加密各个系统函数的接口地址。
地址解密参数获得模块303在执行获得所述目标系统函数对应的地址解密参数的方面时,具体用于:在记录的系统函数与地址解密参数的对应关系中,查找所述目标系统函数对应的地址解密参数。
存储单元的构建模块306在执行将各个系统函数的加密接口地址存储至地址存储单元中方面时,具体用于:为各个系统函数生成随机的地址索引,并记录系统函数与地址索引的对应关系;以及在地址存储单元中,确定各个系统函数的地址索引对应的存储元素,将系统函数的加密接口地址存储至对应的存储元素中。
存储单元的构建模块306在在预先构建的地址存储单元中,查找所述目标系统函数的加密接口地址方面时,具体用于:在记录的系统函数与地址索引的对应关系中,查找所述目标系统函数对应的目标地址索引;在所述地址存储单元中,定位所述目标地址索引对应的存储元素;以及从定位的存储元素中获得所述目标系统函数的加密接口地址。
另外,本申请还提供了一种可读存储介质,其上存储有计算机程序,所述计算机程序可以被处理器执行,以实现上述系统函数调用方法的各个步骤。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括上述要素的过程、方法、物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (10)
1.一种系统函数调用方法,其特征在于,包括:
确定应用程序需要调用的目标系统函数;
根据所述目标系统函数确定对应的自定义调用函数,并通过所述自定义调用函数调用位于所述应用程序的内存空间中的系统函数,完成所述目标系统函数的调用;
所述通过自定义调用函数调用位于应用程序的内存空间中的系统函数,包括:
在预先构建的地址存储单元中,查找所述目标系统函数的加密接口地址;所述加密接口地址不会记录在系统的地址文件中;
获得所述目标系统函数对应的地址解密参数;
使用所述地址解密参数对所述加密接口地址进行解密,得到原文的接口地址;
使用所述原文的接口地址,调用所述目标系统函数;
其中,存储在所述地址存储单元中的所述加密接口地址的获取过程包括:
在应用程序每次启动成功后,应用程序创建自身的内存空间,并在所述内存空间中为系统模块动态分配一个动态内存空间;
将所述系统模块加载到所述动态内存空间中,以使所述系统模块中的系统函数备份到所述动态内存空间中;
获取各个系统函数加载到所述动态内存空间中后得到的随机地址;
对所述随机地址进行加密,得到所述加密接口地址;
其中,所述地址存储单元的构建方式包括:
确定包含所述目标系统函数的系统模块;其中所述目标系统函数为所述系统模块包含的多个系统函数中的一个;
判断所述系统模块是否加载至为所述系统模块动态分配的所述动态内存空间中;
若是,则获得所述系统模块包含的各个系统函数在所述动态内存空间中的接口地址;加密各个系统函数的接口地址,并将各个系统函数的加密接口地址存储至地址存储单元中;
若否,则将所述系统模块加载到所述动态内存空间中,并执行获得所述系统模块包含的各个系统函数在所述动态内存空间中的接口地址这一步骤。
2.根据权利要求1所述的系统函数调用方法,其特征在于,所述将所述系统模块加载至所述动态内存空间中具体包括以下步骤:
获得所述系统模块的可执行文件;
将所述可执行文件的相关信息拷贝至为所述系统模块动态分配的所述内存空间中;
获得所述系统模块的存储路径并进行加密,将加密后的存储路径存储至加载模块记录单元中。
3.根据权利要求2所述的系统函数调用方法,其特征在于,所述判断所述系统模块是否加载至为所述系统模块动态分配的所述内存空间中,包括:
获得所述系统模块的存储路径;
遍历所述加载模块记录单元,以查找所述加载模块记录单元中是否包含获得的所述存储路径。
4.根据权利要求3所述的系统函数调用方法,其特征在于,在所述将所述可执行文件的相关信息拷贝至为所述系统模块动态分配的所述内存空间中之前,还包括:
获得由系统加载的所述系统模块的原生地址,并使用所述原生地址,获得由系统加载的所述系统模块的版本信息;
从所述可执行文件中,获得加载至动态分配的所述内存空间中的所述系统模块的版本信息;
在两个版本信息一致的情况下,执行将所述可执行文件的相关信息拷贝至为所述系统模块动态分配的所述内存空间中的步骤。
5.根据权利要求1所述的系统函数调用方法,其特征在于,所述加密所述各个系统函数的接口地址,包括:
为各个系统函数生成随机的地址解密参数,并记录系统函数与地址解密参数的对应关系;
将各个系统函数的接口地址与各个系统函数的地址解密参数进行异或运算,以加密各个系统函数的接口地址。
6.根据权利要求5所述的系统函数调用方法,其特征在于,所述获得所述目标系统函数对应的地址解密参数,包括:
在记录的系统函数与地址解密参数的对应关系中,查找所述目标系统函数对应的地址解密参数。
7.根据权利要求1所述的系统函数调用方法,其特征在于,所述将各个系统函数的加密接口地址存储至地址存储单元中,包括:
为各个系统函数生成随机的地址索引,并记录系统函数与地址索引的对应关系;
在地址存储单元中,确定各个系统函数的地址索引对应的存储元素,将系统函数的加密接口地址存储至对应的存储元素中。
8.根据权利要求7所述的系统函数调用方法,其特征在于,所述在预先构建的地址存储单元中,查找所述目标系统函数的加密接口地址,包括:
在记录的系统函数与地址索引的对应关系中,查找所述目标系统函数对应的目标地址索引;
在所述地址存储单元中,定位所述目标地址索引对应的存储元素;
从定位的存储元素中获得所述目标系统函数的加密接口地址。
9.一种系统函数调用装置,其特征在于,包括:
目标系统函数确定模块,用于确定应用程序需要调用的目标系统函数;根据所述目标系统函数确定对应的自定义调用函数,并通过所述自定义调用函数调用位于所述应用程序的内存空间中的系统函数,完成所述目标系统函数的调用;其中,所述自定义调用函数通过加密接口地址获得模块、地址解密参数获得模块、原文接口地址获得模块、目标系统函数调用模块完成位于应用程序的内存空间中的系统函数的调用;
所述加密接口地址获得模块,用于在预先构建的地址存储单元中,查找所述目标系统函数的加密接口地址;所述加密接口地址不会记录在系统的地址文件中;
所述地址解密参数获得模块,用于获得所述目标系统函数对应的地址解密参数;
所述原文接口地址获得模块,用于使用所述地址解密参数对所述加密接口地址进行解密,得到原文的接口地址;
所述目标系统函数调用模块,用于使用所述原文的接口地址,调用所述目标系统函数;
存储单元的构建模块,用于确定包含所述目标系统函数的系统模块;其中所述目标系统函数为所述系统模块包含的多个系统函数中的一个;判断所述系统模块是否加载至为所述系统模块动态分配的动态内存空间中;若是,则获得所述系统模块包含的各个系统函数在所述动态内存空间中的接口地址;以及加密各个系统函数的接口地址,并将各个系统函数的加密接口地址存储至地址存储单元中;若否,则将所述系统模块加载到所述动态内存空间中,并执行获得所述系统模块包含的各个系统函数在所述动态内存空间中的接口地址这一步骤;
其中,存储在所述地址存储单元中的所述加密接口地址的获取过程包括:
在应用程序每次启动成功后,应用程序创建自身的内存空间,并在所述内存空间中为系统模块动态分配一个所述动态内存空间;
将所述系统模块加载到所述动态内存空间中,以使所述系统模块中的系统函数备份到所述动态内存空间中;
获取各个系统函数加载到所述动态内存空间中后得到的随机地址;
对所述随机地址进行加密,得到所述加密接口地址。
10.一种可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序可以被处理器执行,以实现上述权利要求1~8任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810601633.6A CN108804937B (zh) | 2018-06-12 | 2018-06-12 | 系统函数调用方法及相关装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810601633.6A CN108804937B (zh) | 2018-06-12 | 2018-06-12 | 系统函数调用方法及相关装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108804937A CN108804937A (zh) | 2018-11-13 |
CN108804937B true CN108804937B (zh) | 2021-03-02 |
Family
ID=64085197
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810601633.6A Active CN108804937B (zh) | 2018-06-12 | 2018-06-12 | 系统函数调用方法及相关装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108804937B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109684795B (zh) * | 2018-12-25 | 2023-01-24 | 成都卫士通信息产业股份有限公司 | 应用程序反调试的方法、装置及电子设备 |
CN113127223B (zh) * | 2019-12-31 | 2022-10-11 | 武汉斗鱼鱼乐网络科技有限公司 | 一种Windows客户端程序模块间的加密数据传输的方法和装置 |
CN111723016B (zh) * | 2020-06-24 | 2024-06-04 | 湖南国科微电子股份有限公司 | 文件关闭方法、装置、电子设备和存储介质 |
CN112583794B (zh) * | 2020-11-23 | 2022-12-09 | 深圳市有方科技股份有限公司 | 接口调用方法、装置、计算机设备和存储介质 |
CN112559094B (zh) * | 2020-12-15 | 2024-04-02 | 浙江中控技术股份有限公司 | 一种c++模块接口的调用方法及装置 |
CN112559097B (zh) * | 2020-12-28 | 2021-12-28 | 上海纬百科技有限公司 | 函数调用方法、装置及计算机可读存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102890758A (zh) * | 2012-10-11 | 2013-01-23 | 北京深思洛克软件技术股份有限公司 | 一种保护可执行文件的方法及系统 |
CN103745138A (zh) * | 2013-11-28 | 2014-04-23 | 福建天晴数码有限公司 | 一种隐藏dll模块导出函数的方法 |
CN106126981A (zh) * | 2016-08-30 | 2016-11-16 | 电子科技大学 | 基于虚拟函数表替换的软件安全防护方法 |
CN106372465A (zh) * | 2016-08-30 | 2017-02-01 | 北京深思数盾科技股份有限公司 | 一种动态链接库安全管理方法、系统和电子设备 |
CN107977552A (zh) * | 2017-12-04 | 2018-05-01 | 北京奇虎科技有限公司 | 一种安卓应用的加固方法和装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101304320A (zh) * | 2008-06-16 | 2008-11-12 | 华为技术有限公司 | 一种地址处理方法和装置 |
CN103324481B (zh) * | 2013-06-26 | 2016-08-31 | 网宿科技股份有限公司 | 通过汇编实现代码混淆的编译方法和系统 |
-
2018
- 2018-06-12 CN CN201810601633.6A patent/CN108804937B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102890758A (zh) * | 2012-10-11 | 2013-01-23 | 北京深思洛克软件技术股份有限公司 | 一种保护可执行文件的方法及系统 |
CN103745138A (zh) * | 2013-11-28 | 2014-04-23 | 福建天晴数码有限公司 | 一种隐藏dll模块导出函数的方法 |
CN106126981A (zh) * | 2016-08-30 | 2016-11-16 | 电子科技大学 | 基于虚拟函数表替换的软件安全防护方法 |
CN106372465A (zh) * | 2016-08-30 | 2017-02-01 | 北京深思数盾科技股份有限公司 | 一种动态链接库安全管理方法、系统和电子设备 |
CN107977552A (zh) * | 2017-12-04 | 2018-05-01 | 北京奇虎科技有限公司 | 一种安卓应用的加固方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN108804937A (zh) | 2018-11-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108804937B (zh) | 系统函数调用方法及相关装置 | |
CN109684790B (zh) | 软件启动方法、软件授权验证方法、设备和存储介质 | |
US10725756B2 (en) | Method and system for facilitating replacement of function calls | |
CN108229112B (zh) | 一种保护应用程序、应用程序的运行方法以及装置 | |
CN109634619B (zh) | 可信执行环境实现方法及装置、终端设备、可读存储介质 | |
WO2021114614A1 (zh) | 应用程序安全启动方法、装置、计算机设备和存储介质 | |
WO2016058487A1 (zh) | 一种信息处理方法及装置 | |
KR102433011B1 (ko) | Apk 파일 보호 방법, 이를 수행하는 apk 파일 보호 시스템, 및 이를 저장하는 기록매체 | |
EP3103048B1 (en) | Content item encryption on mobile devices | |
CN109784007B (zh) | 一种字节码加密的方法、字节码解密的方法及终端 | |
CN106295407B (zh) | 一种检测文件是否被篡改的方法及装置 | |
US11601281B2 (en) | Managing user profiles securely in a user environment | |
JP2004502233A (ja) | 共有名を用いてコンポーネントにセキュリティを提供するシステムおよび方法 | |
Joshi et al. | Android smartphone vulnerabilities: A survey | |
CN110704863A (zh) | 配置信息处理方法、装置、计算机设备和存储介质 | |
CN105468543B (zh) | 一种保护敏感信息的方法及装置 | |
KR101910826B1 (ko) | 사물인터넷 디바이스의 보안 방법 및 장치 | |
CN111737718A (zh) | 一种jar包的加解密方法、装置、终端设备和存储介质 | |
Zhang et al. | A code protection scheme by process memory relocation for android devices | |
CN115248919A (zh) | 一种函数接口的调用方法、装置、电子设备及存储介质 | |
CN107122663B (zh) | 一种注入攻击检测方法及装置 | |
CN108985096B (zh) | 一种Android SQLite数据库安全增强、安全操作方法以及装置 | |
CN112966229A (zh) | 安全运行sdk的方法及装置 | |
JP6318305B2 (ja) | プロビジョニングサーバでサブスクリプションを管理する方法 | |
CN114896621B (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 |