被调用库函数的解析方法、装置、计算机设备及存储介质与流程

文档序号:36248185发布日期:2023-12-02 15:03阅读:16来源:国知局
本发明涉及应用程序调试,具体涉及一种被调用库函数的解析方法、装置、计算机设备及存储介质。
背景技术
::1、ltrace是一个功能非常强大的用户空间程序,利用ltrace可以诊断和调试目标程序的目标进程,通过将目标进程绑定为ltrace的子进程,ltrace就可以跟踪目标进程,控制目标进程的运行停止,解析打印目标进程的被调用库函数的参数和返回值等信息。2、然而,ltrace只可以解析隐式调用的库函数,而无法解析显示调用的库函数。这是因为,通过隐式调用的库函数属于外部符号,外部符号记录在elf(executable andlinkable format,一种可行性的目标文件格式)文件的.rel.plt段中,通过解析elf文件的.rel.plt段可以获取库函数的间接地址,在这个间接地址上就可以打上断点,然后触发该断点并解析打印其参数和返回值等信息。而显示调用的库函数,在运行时直接获取字符串函数地址,在编译期的elf文件中并没有对应的段符号,所有没有办法添加函数断点,导致解析打印其参数和返回值等信息。3、因此,现有技术存在只能解析隐式调用的库函数,无法解析显式调用的库函数的问题。技术实现思路1、有鉴于此,本发明提供了一种被调用库函数的解析方法、装置、计算机设备及存储介质,以解决现有技术中存在只能解析隐式调用的库函数,无法解析显式调用的库函数的问题。2、第一方面,本发明提供了一种被调用库函数的解析方法,该方法包括:3、当目标程序调用库函数并触发入口断点时,判断被调用库函数是否为预设类型函数;4、在被调用库函数是预设类型函数的情况下,对被调用库函数进行第一处理,得到被调用库函数的相关参数;5、在被调用库函数不是预设类型函数或已对调用库函数进行第一处理的情况下,设置出口断点,获取被调用库函数的相关信息;6、当被调用库函数执行完毕并触发出口断点时,获取被调用库函数的返回值,基于相关参数设置注入程序,其中,注入程序用于后续调用预设类型函数时,解析预设类型函数。7、本实施例提供的被调用库函数的解析方法,当目标程序调用库函数并触发入口断点时,判断被调用库函数是否为显示调用的库函数,如果是,则对库函数进行特殊的处理,得到相关参数。之后,设置出口断点,获取被调用库函数的相关信息;当被调用库函数执行完毕并触发出口断点时,获取被调用库函数的返回值,基于相关参数创建或更新注入程序,既解析了显示调用的库函数,又设置了注入程序,便于后续子进程再次调用预设类型函数时,基于注入程序解析预设类型函数。以达到可以同时解析出显式调用和隐式调用的动态库函数,给调试程序带来极大的便利性,提高调试的效率的效果。解决了只能解析隐式调用的库函数,无法解析显式调用的库函数的问题。8、在一种可选的实施方式中,在当目标程序调用库函数并触发入口断点时,判断被调用库函数是否为预设类型函数之前,方法还包括:9、将目标程序绑定到测试程序,其中,测试程序用于控制目标程序;10、将目标程序的进程作为子进程,将测试程序的进程作为父进程,其中,父进程用于控制子进程;11、利用父进程获取子进程的目标文件,并根据目标文件中的段信息,得到子进程的第一目标参数;12、利用父进程获取子进程的运行地址,并根据运行地址计算第二目标参数;13、将第一目标参数和第二目标参数加入中断列表,并根据中断列表设置入口断点。14、在本实施方式中,先用调试程序绑定到目标程序,让目标程序成为调试程序的子进程,方便父子进程信息交互。利用父进程获取子进程对应的第一目标参数和第二目标参数,将第一目标参数和第二目标参数加入中断列表,并根据中断列表设置入口断点,为后续触发入口断点,对被调用库函数进行解析提供基础。15、在一种可选的实施方式中,判断被调用库函数是否为预设类型函数,包括:16、利用父进程获取子进程的控制权;17、在父进程获取子进程的控制权之后,获取子进程的堆栈信息;18、解析堆栈信息,得到调用函数参数信息;19、根据调用函数参数信息判断被调用库函数是否为预设类型函数。20、在本实施方式中,利用父进程获取子进程的堆栈信息,进而得到调用函数参数信息,根据调用函数参数信息判断被调用库函数是否为预设类型函数,为后续对预设类型函数进行第一处理提供基础。21、在一种可选的实施方式中,预设类型函数包括第一预设函数和第二预设函数,在被调用库函数是预设类型函数的情况下,对被调用库函数进行第一处理,得到被调用库函数的相关参数,包括:22、在被调用库函数是第一预设函数的情况下,获取用于确定调用第一预设函数需要打开库的第一参数,并解析库,得到库的导出符号的第一数量;23、在被调用库函数是第二预设函数的情况下,获取用于确定调用第二预设函数需要打开库的第一参数和第二参数,并保存第二预设函数对应的第一参数和第二参数,其中,第二参数用于确定函数名称。24、在本实施方式中,根据被调用库函数的类型,获取被调用库函数的相关参数,如果是第一预设函数,则获取第一参数和第一数量,如果是第二预设函数,则获取第一参数和第二参数,便于后续设置注入程序。25、在一种可选的实施方式中,基于相关参数设置注入程序,包括:26、判断被调用库函数是否为第一预设函数、第二预设函数或第三预设函数;27、在被调用库函数是第一预设函数的情况下,利用父进程创建包含第一数量个第一表格和第二表格的注入程序,其中,注入程序用于解析被调用库函数,第一表格和第二表格用于确定被调用库函数的函数地址,第一表格中每一个表项指向第二表格中对应的表项;28、将注入程序注入子进程的进程空间,并获取注入程序的第一表格和第二表格的地址位置;29、在被调用库函数是第二预设函数的情况下,根据第一参数确定第二预设函数对应的第一表格和第二表格;30、在第二表格中确定未使用表项,并将第二预设函数的返回值写入未使用表项;31、将第一表格的地址位置作为第二预设函数的返回值;32、将第二预设函数的函数符号和函数地址加入中断列表,在函数地址上设置断点,并将断点与第二参数绑定;33、在被调用库函数是第三预设函数的情况下,根据第一参数清空注入程序的第二表格。34、在本实施方式中,根据被调用库函数的类型设置注入程序,在被调用库函数为第一预设函数时,创建注入程序,并将注入程序注入目标程序的子进程的进程空间;在被调用库函数为第二预设函数时,根据第一参数和第二参数更新注入程序;在被调用库函数为第三预设函数时,根据第一参数清空注入程序的第二表格。通过上述过程,使得本发明通过程序动态注入法,将包含固定数目got表和plt表的程序动态注入到目标程序,且后续可以仅通过修改调用函数的地址,让调用函数执行到plt表并通过got表最终跳转到真正的地址,以此完成函数的解析。35、在一种可选的实施方式中,将注入程序动态注入子进程的进程空间,包括:36、利用父进程控制子进程停止运行,并获取子进程的寄存器状态;37、通过预设函数分配进程空间,调用第二预设函数加载注入程序,并恢复所有寄存器状态。38、在本实施方式中,通过程序动态注入法,将包含固定数目got表和plt表的程序动态注入到目标程序,使得后续可以仅通过修改调用函数的地址,让调用函数执行到plt表并通过got表最终跳转到真正的地址,以此完成函数的解析。39、在一种可选的实施方式中,在根据第一参数清空注入程序的第二表格之后,方法包括:40、当子进程再次调用预设类型函数时,触发断点,根据第一表格和第二表格确定预设类型函数的真实地址,其中,真实地址用于调用预设类型函数;41、获取预设类型函数的函数名称,并解析打印预设类型函数的参数;42、当预设类型函数执行完毕时,会再次触发断点,解析打印预设类型函数的返回值。43、在本实施方式中,基于注入程序,对后续调用的预设类型函数进行解析,解析打印预设类型函数的函数名称、参数以及返回值。解决了只能解析隐式调用的库函数,无法解析显式调用的库函数的问题。44、在一种可选的实施方式中,设置出口断点,包括:45、获取处理器中目标寄存器的数值,其中,处理器用于执行子进程;46、根据数值,确定函数返回地址;47、根据函数返回地址,设置出口断点。48、在本实施方式中,获取处理器中目标寄存器的数值,进而确定函数返回地址,根据函数返回地址,设置出口断点,便于解析打印被调用库函数的返回值。49、第二方面,本发明提供了一种被调用库函数的解析装置,该装置包括:50、判断模块,用于当目标程序调用库函数并触发入口断点时,判断被调用库函数是否为预设类型函数;51、处理模块,用于在被调用库函数是预设类型函数的情况下,对被调用库函数进行第一处理,得到被调用库函数的相关参数;52、第一获取模块,用于在被调用库函数不是预设类型函数或已对调用库函数进行第一处理的情况下,设置出口断点,获取被调用库函数的相关信息;53、第二获取模块,用于当被调用库函数执行完毕并触发出口断点时,获取被调用库函数的返回值,基于相关参数设置注入程序,其中,注入程序用于后续调用预设类型函数时,解析预设类型函数。54、第三方面,本发明提供了一种计算机设备,包括:存储器和处理器,存储器和处理器之间互相通信连接,存储器中存储有计算机指令,处理器通过执行计算机指令,从而执行上述第一方面或其对应的任一实施方式的被调用库函数的解析方法。55、第四方面,本发明提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机指令,计算机指令用于使计算机执行上述第一方面或其对应的任一实施方式的被调用库函数的解析方法。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1