IOS平台隐藏dylib文件的方法、存储介质、电子设备及系统与流程

文档序号:13387398阅读:902来源:国知局
IOS平台隐藏dylib文件的方法、存储介质、电子设备及系统与流程

本发明涉及信息处理领域,具体涉及一种ios平台隐藏dylib文件的方法、存储介质、电子设备及系统。



背景技术:

当前,随着移动设备的日益普及,移动应用产业尤其是ios应用随之得到飞速发展,且ios应用的开发模式和代码框架也随之发生了巨大变化。对于ios平台,其应用程序的构成分为主程序和模块文件,模块文件即为dylib文件,dylib文件是ios平台上的动态链接库文件。在ios应用开发的过程中,若需要编写某些功能模块注入到对应的进程中运行,则均是编写一个dylib文件,然后将该dylib文件注入到对应的进程中运行。

在ios应用开发完成并进行运行后,通常会编写一个dylib文件注入到运行的ios应用中,进行ios应用的运行状态等相关数据的获取,以便于后期开发人员对ios应用的调试和维护,由于ios系统资源机制的原因,ios应用的进程经常会关闭一些dylib文件的运行,以节省系统资源,保证系统资源的合理利用,故注入到ios应用中用于获取ios应用运行状态的dylib文件会被误禁止,进行影响开发人员对ios应用后期调试工作的正常进行。



技术实现要素:

针对现有技术中存在的缺陷,本发明的目的在于提供一种ios平台隐藏dylib文件的方法,能够有效保证应用后期调试工作的正常进行。

为达到以上目的,本发明采取的技术方案是,包括:

s1:获取ios应用内的所有mach-o文件及每个mach-o文件内的dylib文件名称获取函数;

s2:编写一hook函数,所述hook函数用于获取dylib文件名称获取函数获取的dylib文件的名称;

s3:当ios应用调用dylib文件名称获取函数进行ios应用内所有dylib文件名称的获取时,通过hook函数获取dylib文件名称获取函数获取的dylib文件名称,根据dylib文件名称判断是否含有待隐藏dylib文件,若是,转到s4,若否,转到s5;

s4:隐藏待隐藏dylib文件名称,并将隐藏了待隐藏dylib文件名称后的dylib文件名称数据返回给ios应用;

s5:将dylib文件名称获取函数取的dylib文件名称返回给ios应用。

在上述技术方案的基础上,对于mach-o文件内dylib文件名称获取函数的获取,具体为:

s101:获取ios应用内的所有mach-o文件及每个mach-o文件所对应的内存起始地址,并根据内存起始地址获取mach-o文件在内存中的虚拟内存地址;

s102:根据mach-o文件在内存中的虚拟内存地址,解析mach-o文件,得到每个mach-o文件内每个函数的名称和指针;

s103:遍历得到的每个mach-o文件内每个函数的名称,找到每个mach-o文件内的dylib文件名称获取函数。

在上述技术方案的基础上,

所述hook函数用于将目标函数的内存地址进行替换成设定地址;

当目标函数执行时,跳转至设定地址以进行dylib文件名称获取函数获取的dylib文件名称的获取;

所述目标函数为dylib文件名称获取函数。

在上述技术方案的基础上,

所述ios应用还用于调用mach-o文件内的dylib文件个数获取函数获取ios应用内的dylib文件个数;

当dylib文件名称获取函数获取的dylib文件名称中含有待隐藏dylib文件名称,则返回给ios应用的dylib文件个数为获取的dylib文件总个数减去待隐藏dylib文件的个数;

当dylib文件名称获取函数获取的dylib文件名称中不含有待隐藏dylib文件名称,则返回给ios应用的dylib文件个数即为获取的dylib文件总个数。

在上述技术方案的基础上,通过hook方式对返回给ios应用的dylib文件的个数进行修改。

本发明还提供一种存储介质,该存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述所述的方法。

本发明还提供一种电子设备,包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述所述的方法。

本发明还提供一种ios平台隐藏dylib文件的系统,包括:

获取模块,其用于获取ios应用内的所有mach-o文件及每个mach-o文件内的dylib文件名称获取函数;

编写模块,其用于编写一hook函数,所述hook函数用于获取dylib文件名称获取函数获取的dylib文件的名称;

判断与执行模块,其用于当ios应用调用dylib文件名称获取函数进行ios应用内dylib文件名称的获取时,通过hook函数获取dylib文件名称获取函数获取的dylib文件名称,根据名称判断是否含有待隐藏dylib文件,若是,则隐藏待隐藏dylib文件的名称,并将隐藏了待隐藏dylib文件名称后的dylib文件名称数据返回给ios应用,若否,则将dylib文件名称获取函数取的dylib文件名称返回给ios应用。

在上述技术方案的基础上,所述获取模块对于mach-o文件内dylib文件名称获取函数的获取,具体为:

获取ios应用内的所有mach-o文件及每个mach-o文件所对应的内存起始地址,并根据内存起始地址获取mach-o文件在内存中的虚拟内存地址;

根据mach-o文件在内存中的虚拟内存地址,解析mach-o文件,得到每个mach-o文件内每个函数的名称和指针;

遍历得到的每个mach-o文件内每个函数的名称,找到每个mach-o文件内的dylib文件名称获取函数。

在上述技术方案的基础上,所述hook函数用于将目标函数的内存地址进行替换成设定地址;当目标函数执行时,跳转至设定地址以进行dylib文件名称获取函数获取的dylib文件名称的获取;所述目标函数为dylib文件名称获取函数。

与现有技术相比,本发明的优点在于:通过hook的方式,当ios应用调用dylib文件名称获取函数进行dylib文件名称的获取时,通过hook函数获取dylib文件名称获取函数获取的dylib文件名称,隐藏待隐藏的dylib文件,即相当于隐藏了应用内的用于获取ios应用运行状态的dylib文件,避免ios应用对该类dylib文件的禁止运行操作,保证开发人员能够正常获取到ios应用运行状态的数据,保证ios应用调试工作的正常进行。

附图说明

图1为本发明实施例中ios平台隐藏dylib文件的方法的流程图;

图2为本发明实施例一种电子设备的结构示意图。

具体实施方式

以下结合附图及实施例对本发明作进一步详细说明。

参见图1所示,本发明实施例提供一种ios平台隐藏dylib文件的方法,用于当ios应用对应用内的dylib文件获取时,隐藏应用内的用于获取ios应用运行状态的dylib文件,避免ios应用对该类dylib文件获取而禁止运行,保证开发人员对ios应用调试工作的正常进行。

本发明实施例中,dylib文件名称获取函数为ios的系统函数_dyld_get_image_name,通过该函数可以获取ios应用中加载的每个dylib文件的名称,该函数的原型为:

constchar*_dyld_get_image_name(uint32_timage_index);

该函数中,参数uint32_timage_index用来标示获取的dylib文件的索引,该函数的返回值constchar*用来标示获取到的dylib文件的名称。

本发明实施例的ios平台隐藏dylib文件的方法具体包括:

s1:获取ios应用内的所有mach-o文件及每个mach-o文件内的dylib文件名称获取函数。对于mach-o文件内dylib文件名称获取函数的获取,具体为:

s101:获取ios应用内的所有mach-o文件及每个mach-o文件所对应的内存起始地址,并根据内存起始地址获取mach-o文件在内存中的虚拟内存地址;

dylib文件名称获取函数位于mach-o文件中,mach-o是ios系统中可执行文件的格式,对于mach-o文件的结构,具体包括headerstructure(头部)、loadcommand(加载命令)和segment(段),一个mach-o文件可以拥有多个段,每个段可以拥有零个或多个区域(section),每一个段都拥有一段虚拟地址映射到进程的地址空间,同时,一个完整的mach-o文件的末端是链接信息,其中包含了动态加载器用来链接可执行文件或者依赖库所需使用的符号表、字符串等等。dylib文件名称获取函数位于mach-o文件,且一个ios应用在运行时会加载多个mach-o文件,且每一个mach-o文件都有可能调用到dylib文件名称获取函数进行应用内dylib文件名称的获取操作,因此为保证判断的准确性,我们需要获取ios系统中所有的mach-o文件,以便于进行后续的操作。

对于系统中mach-o文件的获取,首先可以通过系统函数获取到系统中mach-o文件的个数以及mach-o文件的内存起始地址,具体实现为:

执行uint32_tc=_dyld_image_count();即通过_dyld_image_count来获取ios系统中所加载的mach-o文件的个数,然后

执行for(uint32_ti=0;i<c;i++),即通过for循环来遍历mach-o文件,接着

执行onststructmach_header*header=_dyld_get_image_header(i),即通过函数_dyld_get_image_header来获取mach-o文件的内存起始地址,接着

执行intptr_tslide=_dyld_get_image_vmaddr_slide(i);即通过函数_dyld_get_image_vmaddr_slide来获取mach-o文件在内存中的虚拟内存地址。

s102:根据mach-o文件在内存中的虚拟内存地址,解析mach-o文件,得到每个mach-o文件内每个函数的名称和指针;

s103:遍历得到的每个mach-o文件内每个函数的名称,找到每个mach-o文件内的dylib文件名称获取函数。

即为了找出mach-o文件中的目标函数,目标函数即为dylib文件名称获取函数。具体的:

对mach-o文件进行解析,在loadcommand(加载命令)内找到linkedit_segment、symtab_cmd、dysymtab_cmd,通过linkedit_segment则可以找到symtab_cmd中的symtab和strtab,其中,strtab内存储着mach-o文件内每个函数的名称,strtab内存储着mach-o文件内每个函数的索引,而mach-o文件内每个函数的函数指针存储在section中,因此需要进一步地从mach-o文件中解析出section,其过程为:在mach-o文件中获取到对应的cmd,因为mach-o文件的解析是开源的,故可以按照开源的代码来解析需要查找的inkedit_segment、symtab_cmd、dysymtab_cmd等cmd地址,故遍历mach-o文件的loadcommand来查找,最终可以查找到section、symtab、strtab、indirect_symtab。得到每个mach-o文件内每个函数的名称和指针后,便可遍历每个函数的名称,找到每个mach-o文件内的dylib文件名称获取函数。

s2:编写一hook(钩子)函数,所述hook函数用于获取dylib文件名称获取函数获取的dylib文件的名称;即hook函数用于将目标函数的内存地址进行替换成设定地址;当目标函数执行时,跳转至设定地址以进行dylib文件名称获取函数获取的dylib文件名称的获取;目标函数为dylib文件名称获取函数。其中,设定地址即为人为编写的函数地址,用于当dylib文件名称获取函数执行时跳转,从而先进行预先编写的功能函数的执行,进而获取到获取dylib文件名称获取函数获取的dylib文件的名称。

本发明实施例中,hook函数的原型如下:

hook_function(char*pfuncname,void*pnew,void**psaveorg);

该函数中,hook_function为hook函数的名称;

参数char*pfuncname标示需要hook的函数名称,这里需要hook的函数名称为dylib文件名称获取函数;

参数void*pnew标示替换的函数的内存地址;

参数void**psaveorg标示存储系统原本的函数的内存地址。

s3:当ios应用调用dylib文件名称获取函数进行ios应用内所有dylib文件名称的获取时,通过hook函数获取dylib文件名称获取函数获取的dylib文件名称,根据dylib文件名称判断是否含有待隐藏dylib文件,若是,转到s4,若否,转到s5。本发明实施例中待隐藏dylib文件即为用于获取ios应用运行状态的dylib文件。通过hook函数获取dylib文件名称获取函数获取的dylib文件名称的具体过程为:

1、定义一个函数指针:staticconstchar*(*orig_dyld_get_image_name)(uint32_timage_index);使其用来存储dylib文件名称获取函数_dyld_get_image_name的内存地址:

2、编写一功能函数my_dyld_get_image_name,当_dyld_get_image_name执行时,通过hook函数将目标函数的内存地址进行替换成设定地址,进而执行编写的功能函数my_dyld_get_image_name,进而获取dylib文件名称获取函数获取的dylib文件名称。具体的:

调用hook函数对_dyld_get_image_name进行hook,

具体实现代码为:hook_function("_dyld_get_image_name",my_dyld_get_image_name,(void*)&orig_dyld_get_image_name)

此时,上述的char*pfuncname即标示需要hook的函数为_dyld_get_image_name,void*pnew标示替换的函数为my_dyld_get_image_name,oid**psaveorg标示将原本的函数_dyld_get_image_name地址存储到orig_dyld_get_image_name函数指针处。

在my_dyld_get_image_name中依次判断当前获取的dylib文件名称是否是待隐藏的dylib文件的名称,相应代码为:

如果是需要隐藏的,则调用系统的orig_dyld_get_image_name函数得到下一个dylib文件名称,并进行判断,通过此方法来对dylib文件名称获取函数获取的所有dylib文件名称进行判断。

s4:隐藏待隐藏dylib文件名称,并将隐藏了待隐藏dylib文件名称后的dylib文件名称数据返回给ios应用,即返回给ios应用的所有dylib文件名称中是不含有待隐藏dylib文件的名称;

s5:将dylib文件名称获取函数取的dylib文件名称返回给ios应用。

通过编写的hook函数,获取dylib文件名称获取函数获取的dylib文件的名称,并根据名称判断是否含有待隐藏dylib文件,如果含有,则隐藏,即待隐藏dylib文件的名称是不会返回给ios应用的。

在一种实施方式中,为进一步提高待隐藏dylib文件隐藏的准确性,避免被ios应用所获取,ios应用还用于调用mach-o文件内的dylib文件个数获取函数获取ios应用内的dylib文件个数;当dylib文件名称获取函数获取的dylib文件名称中含有待隐藏dylib文件名称,则返回给ios应用的dylib文件个数为获取的dylib文件总个数减去待隐藏dylib文件的个数;当dylib文件名称获取函数获取的dylib文件名称中不含有待隐藏dylib文件名称,则返回给ios应用的dylib文件个数即为获取的dylib文件总个数。具体通过hook方式对返回给ios应用的dylib文件的个数进行修改。

dylib文件个数获取函数为_dyld_image_count,该函数为ios的系统函数,通过该函数可以获取ios应用中加载的dylib文件的个数,该函数的原型为:

uint32_t_dyld_image_count(void);该函数不需要参数,调用时直接返回ios应用中的dylib文件个数,dylib文件个数获取函数也位于mach-o文件中,其获取方式与dylib文件名称获取函数相同。

对于dylib文件个数获取函数获取的mach-o文件个数的修改过程,具体为:

定义一个函数指针:staticuint32_t(*orig_dyld_image_count)();用来存储_dyld_image_count函数的地址;同样的编写一功能函数my_dyld_image_count(),当_dyld_image_count执行时,通过hook方式将目标函数的内存地址进行替换成设定地址,进而执行编写的功能函数my_dyld_image_count(),进而获取dylib文件个数获取函数获取的dylib文件个数,当dylib文件名称获取函数获取的dylib文件名称中含有待隐藏dylib文件名称,则在my_dyld_image_count()中修改dylib文件的个数,该过程相应的代码为:

若待隐藏dylib文件的个数为1,则返回给ios应用的dylib文件个数即为获取的dylib文件总个数减1。

对于hook的方式,与dylib文件名称获取函数被hook的方式类似,此时相应hook函数为

hook_function("_dyld_image_count",my_dyld_image_count,(void*)&orig_dyld_image_count);

此处该hook函数中,char*pfuncname即标示需要hook的函数为_dyld_image_count,void*pnew标示替换的函数为my_dyld_image_count,oid**psaveorg标示将原本的函数_dyld_image_count地址存储到orig_dyld_image_count函数指针处。

本发明的ios平台隐藏dylib文件的方法的原理在于:针对ios应用中当进行应用内dylib文件名称获取时必须调用dylib文件名称获取函数的特性,通过hook的方式,当ios应用调用dylib文件名称获取函数进行ios应用内dylib文件名称的获取时,通过hook函数获取dylib文件名称获取函数获取的dylib文件名称,并根据名称判断是否含有待隐藏的dylib文件,若含有,则隐藏待隐藏dylib文件的名称,使最终返回给应用的dylib文件的名称中不含有待隐藏dylib文件的名称,即相当于隐藏了应用内的用于获取ios应用运行状态的dylib文件,避免ios应用对该类dylib文件的禁止运行操作,保证开发人员能够正常获取到ios应用运行状态的数据,保证ios应用调试工作的正常进行。

另外,对应上述ios平台隐藏dylib文件的方法,本发明还提供一种存储介质,存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述各实施例所述的ios平台隐藏dylib文件的方法的步骤。需要说明的是,所述存储介质包括u盘、移动硬盘、rom(read-onlymemory,只读存储器)、ram(randomaccessmemory,随机存取存储器)、磁碟或者光盘等各种可以存储程序代码的介质。

参见图2所示,对应上述ios平台隐藏dylib文件的方法,本发明还提供一种电子设备,包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序,处理器执行计算机程序时实现上述各实施例的ios平台隐藏dylib文件的方法。

本发明实施例还提供一种基于上述ios平台隐藏dylib文件的方法的ios平台隐藏dylib文件的系统,包括获取模块、编写模块和判断与执行模块。

获取模块用于获取ios应用内的所有mach-o文件及每个mach-o文件内的dylib文件名称获取函数;编写模块用于编写一hook函数,所述hook函数用于获取dylib文件名称获取函数获取的dylib文件的名称;判断与执行模块用于当ios应用调用dylib文件名称获取函数进行ios应用内dylib文件名称的获取时,通过hook函数获取dylib文件名称获取函数获取的dylib文件名称,根据dylib文件名称判断是否含有待隐藏dylib文件,若是,则隐藏待隐藏dylib文件名称,并将隐藏了待隐藏dylib文件名称后的dylib文件名称数据返回给ios应用,若否,则将dylib文件名称获取函数取的dylib文件名称返回给ios应用。

本发明实施例的ios平台隐藏dylib文件的系统的原理在于:针对ios应用中当进行应用内dylib文件名称获取时必须调用dylib文件名称获取函数的特性,通过编写模块,编写一hook函数,当ios应用调用dylib文件名称获取函数进行ios应用内dylib文件名称的获取时,通过hook函数获取dylib文件名称获取函数获取的dylib文件名称,通过判断与执行模块,根据名称判断是否含有待隐藏的dylib文件,若含有,则隐藏待隐藏dylib文件的名称,使最终返回给应用的dylib文件的名称中不含有待隐藏dylib文件的名称,即相当于隐藏了应用内的用于获取ios应用运行状态的dylib文件,避免ios应用对该类dylib文件的禁止运行操作,保证开发人员能够正常获取到ios应用运行状态的数据,保证ios应用调试工作的正常进行。

本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1