一种定位动态运行库加载异常的方法技术

技术编号:35451284 阅读:37 留言:0更新日期:2022-11-03 12:06
本发明专利技术公布了一种定位动态运行库加载异常的方法,通过在程序中初始化开始监控加载库过程,并设置监控搜索动态运行库DLL过程以及设置监控正在加载动态运行库DLL库的过程,在监控加载过程中,根据不同用户环境情况,实时反馈记录出搜索动态库的过程以及动态库实时加载过程情况,因为是动态监控,所以完全兼容不同用户环境下的复杂情况,不需要遍历所有环境变量路径,而且兼容动态变化的环境变量,不会受程序或者系统环境变化影响,能够分析出无限层次的调用关系,兼容性更强,稳定性高,同时不需要单独分析用户环境。不需要远程,更利于开发者分析用户环境下的异常问题。开发者分析用户环境下的异常问题。开发者分析用户环境下的异常问题。

【技术实现步骤摘要】
一种定位动态运行库加载异常的方法


[0001]本专利技术涉及数据处理领域,尤其涉及一种定位动态运行库加载异常的方法。

技术介绍

[0002]目前软件行业的方式,普遍使用微软提供的dumpbin、depdenys工具,来补充dll到程序目录中,这种方案的原理是分析每个DLL导入表,根据导入表信息分析出,dll依赖的其他库。dumpbin、Depends能够查看依赖的dll文件依赖关系,将依赖的dll文件全部放在程序同目录下,但当我们处于多人开发,或者使用了不同的第三方库时,是无法控制每个dll加载时机,就无法分析出复杂环境下加载失败的原因。
[0003]另外动态库加载过程,受到用户电脑环境变量目录和系统目录下文件影响,这种静态的分析是无法确定真实场景下的加载失败的问题。这种情况一般是在加载A.dll时,A.dll依赖了B.dll,B.dll又依赖了C.dll,C.dll依赖D.dll存在这种多层依赖关系,但由于windows加载dll方式依赖到其他dll时,会到环境变量Path的多个目录寻找,当多个目录中存在了同样的文件名DLL文件时,会先加载到搜索路径靠前的目录,当这个目录dll版本和预期版本不一致就会导致加载失败。而对于开发者来说,只收到的错误只有来源于加载首个A.dll返回的错误,提示未能加载有A.dll导入的整个过程。这样的错误信息,无法确定具体问题,以及环境路径的情况,以及库冲突的问题。
[0004]另外搜索目录还会受到开发者当前环境变量目录影响,而当前工作目录和环境变量目录不是固定的,是可以跟随程序改变的,这样在真实用户的环境下,会变得更为复杂,错误日志无法准确定位问题。
[0005]因此,如何帮助开发者分析用户环境下的异常问题成为了一个亟待解决的技术问题。
[0006]上述内容仅用于辅助理解本专利技术的技术方案,并不代表承认上述内容是现有技术。

技术实现思路

[0007]本专利技术的主要目的在于提供一种定位动态运行库加载异常的方法,旨在解决帮助开发者分析用户环境下的异常问题。
[0008]为实现上述目的,本专利技术提供一种定位动态运行库加载异常的方法,所述方法包括以下步骤:
[0009]执行在程序中初始化监控加载库的操作;
[0010]创建监控搜索动态运行库DLL路径的过程函数和监控正在加载动态运行库DLL路径的过程函数;
[0011]获取监控搜索动态运行库DLL路径的过程函数和监控正在加载动态运行库DLL路径的过程函数中压入全局运行库文件绝对路径的信息栈数据;
[0012]遍历上述全局运行库文件绝对路径的信息栈中数据,按照顺序读取DLL绝对路径;
[0013]获取动态运行库DLL文件版本信息,根据文件版本信息函数读取动态运行库DLL文件版本信息对应的版本号;
[0014]比较预设的加载库版本和路径,确定运行库加载异常状况。
[0015]优选的,所述执行在程序中初始化监控加载库的操作包括:
[0016]获取Ntdll.dll的模块句柄地址,其中,所述Ntdll.dll的模块句柄地址是在初始化监控中使用加载动态库的过程函数得到的;
[0017]通过Ntdll.dll模块句柄,导出指定函数地址的过程函数,其中,导出指定函数地址的过程函数包括查询文件属性的过程函数和打开文件的过程函数;
[0018]读取原有NT内核的过程函数地址,将导出的函数地址的过程函数保存到NT内核的过程函数地址的全局地址变量中;
[0019]通过读取进程内存函数,读取NT内核过程函数地址的全局地址变量所在头部8个字节,将8个字节保存到原有NT内核过程函数的全局字节数组变量。
[0020]优选的,所述创建监控搜索动态运行库DLL路径的过程函数包括:
[0021]创建捕获搜索动态运行库DLL路径的信息函数流程,其中,该信息函数包括对象属性和文件基础信息的结构体;
[0022]将创建的监控搜索动态运行库DLL路径的过程函数替换为进程空间中的查询指定文件对象的属性的过程函数;
[0023]判断是否触发获取到文件对象属性的信号,在获取到所述文件对象属性信号触发的情况下,对搜索的动态运行库DLL文件的完整路径信息进行捕获提取。
[0024]优选的,所述创建监控搜索动态运行库DLL路径的过程函数还包括:
[0025]获取对象属性信息长度,判断是否为空,如果不为空,则进行完整路径提取;
[0026]从对象属性获取句柄对象名称的字符串数据指针;
[0027]从符字符串的缓冲区读取内容,其中,该内容为程序当前正在搜索动态运行库dll的路径;
[0028]拼接当前搜索的动态运行库DLL名称的完整路径;
[0029]将获取内容压栈,写入到全局运行库文件绝对路径的信息栈中。
[0030]优选的,所述创建监控搜索动态运行库DLL路径的过程函数还包括:
[0031]读取在程序中初始化监控加载库的操作中已经保存在NT内核查询文件属性的过程函数地址的全局地址变量中函数地址、和原有NT内核查询文件属性的过程函数的全局字节数组变量的8个字节数组;
[0032]将保存在全局字节数组变量备份的8个字节数组写入到全局地址变量函数地址中进行恢复;
[0033]调用NT内核查询文件属性的过程函数;
[0034]继续执行监控搜索动态运行库DLL路径的信息函数流程。
[0035]优选的,开始执行监控搜索动态运行库dll过程包括:将创建好的监控搜索动态运行库DLL路径的过程函数,赋值替换到原有检NT内核检索查询文件属性的过程函数地址中,其中,赋值替换过程包括:
[0036]设置8个字节的跳转指令缓冲区数组;
[0037]将创建的监控搜索动态运行库DLL路径的过程函数地址,填充到跳转指令缓冲区
第一个字节之后;
[0038]将监控搜索动态运行库DLL路径的过程函数地址赋值给寄存器;
[0039]通过跳转指令跳转到寄存器的监控搜索动态运行库DLL路径的过程函数地址上;
[0040]执行监控遍历搜索动态运行库DLL路径的信息记录流程。
[0041]优选的,所述创建监控正在加载动态运行库DLL的过程函数包括:
[0042]创建捕获监控正在加载动态运行库DLL完整路径的信息函数流程,其中,该信息函数包括文件操作句柄、文件访问类型、对象属性、文件操作和完成状态的信息的结构体指针、文件的共享访问类型以及打开文件时操作选项;
[0043]将创建的监控正在加载动态运行库DLL路径的过程函数替换为进程空间中的原有NT内核打开文件的过程函数地址;
[0044]判断是否触发打开动态运行库DLL文件对象句柄操作时的信号,在打开动态运行库DLL文件对象句柄操作信号触发的情况下,对正在加载的动态运行库DLL完整路径信息进行捕获提取。
[0045]优选的,所述创建监控正在加载动态运行库DLL的过程函数还包括:
...

【技术保护点】

【技术特征摘要】
1.一种定位动态运行库加载异常的方法,其特征在于,所述动态检测、快速定位运行库加载异常包括:执行在程序中初始化监控加载库的操作;创建监控搜索动态运行库DLL路径的过程函数和监控正在加载动态运行库DLL路径的过程函数;获取监控搜索动态运行库DLL路径的过程函数和监控正在加载动态运行库DLL路径的过程函数中压入全局运行库文件绝对路径的信息栈数据;遍历上述全局运行库文件绝对路径的信息栈中数据,按照顺序读取DLL绝对路径;获取动态运行库DLL文件版本信息,根据文件版本信息函数读取动态运行库DLL文件版本信息对应的版本号;比较预设的加载库版本和路径,确定运行库加载异常状况。2.根据权利要求1所述的定位动态运行库加载异常的方法,其特征在于,所述执行在程序中初始化监控加载库的操作包括:获取Ntdll.dll的模块句柄地址,其中,所述Ntdll.dll的模块句柄地址是在初始化监控中使用加载动态库的过程函数得到的;通过Ntdll.dll模块句柄,导出指定函数地址的过程函数,其中,导出指定函数地址的过程函数包括查询文件属性的过程函数和打开文件的过程函数;读取原有NT内核的过程函数地址,将导出的函数地址的过程函数保存到NT内核的过程函数地址的全局地址变量中;通过读取进程内存函数,读取NT内核过程函数地址的全局地址变量所在头部8个字节,将8个字节保存到原有NT内核过程函数的全局字节数组变量。3.根据权利要求2所述的一种定位动态运行库加载异常的方法,其特征在于,所述创建监控搜索动态运行库DLL路径的过程函数包括:创建捕获搜索动态运行库DLL路径的信息函数流程,其中,该信息函数包括对象属性和文件基础信息的结构体;将创建的监控搜索动态运行库DLL路径的过程函数替换为进程空间中的查询指定文件对象的属性的过程函数;判断是否触发获取到文件对象属性的信号,在获取到所述文件对象属性信号触发的情况下,对搜索的动态运行库DLL文件的完整路径信息进行捕获提取。4.根据权利要求3所述的定位动态运行库加载异常的方法,其特征在于,所述创建监控搜索动态运行库DLL路径的过程函数还包括:获取对象属性信息长度,判断是否为空,如果不为空,则进行完整路径提取;从对象属性获取句柄对象名称的字符串数据指针;从符字符串的缓冲区读取内容,其中,该内容为程序当前正在搜索动态运行库dll的路径;拼接当前搜索的动态运行库DLL名称的完整路径;将获取内容压栈,写入到全局运行库文件绝对路径的信息栈中。5.根据权利要求3所述的定位动态运行库加载异常的方法,其特征在于,所述创建监控搜索动态运行库DLL路径的过程函数还包括:
读取在程序中初始化监控加载库的操作中已经保存在NT内核查询文件属性的过程函数地址的全局地址变量中函数地址、和原有NT内核查询文件属性的过程函数的全局字节数组变量的8个字节数组;将保存在全局字节数组变量备份的8个字节数组写入到全局地址变量函数地址中进行恢复;调用NT内核查询文件属性的过程函数;继续执行监控搜索动态运...

【专利技术属性】
技术研发人员:朱志强江泽龙
申请(专利权)人:深圳软牛科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1