[发明专利]函数调用栈解析和回溯方法与装置有效
| 申请号: | 202211187959.1 | 申请日: | 2022-09-28 |
| 公开(公告)号: | CN115292201B | 公开(公告)日: | 2022-12-20 |
| 发明(设计)人: | 张鹏;方建滨;黄春;彭林;唐滔;崔英博 | 申请(专利权)人: | 中国人民解放军国防科技大学 |
| 主分类号: | G06F11/36 | 分类号: | G06F11/36;G06F8/53;G06F8/70 |
| 代理公司: | 长沙国科天河知识产权代理有限公司 43225 | 代理人: | 李杨 |
| 地址: | 410073 湖*** | 国省代码: | 湖南;43 |
| 权利要求书: | 查看更多 | 说明书: | 查看更多 |
| 摘要: | |||
| 搜索关键词: | 函数 调用 解析 回溯 方法 装置 | ||
1.函数调用栈解析和回溯方法,其特征在于,所述方法包括:
转储异常中断或者手动中断应用程序的执行现场,所述应用程序的执行现场包括:栈空间以及多个处理器寄存器,其中,所述处理器寄存器包括分别有程序计数寄存器和栈顶寄存器,所述程序计数寄存器中保存有当前中断应用程序中终止函数正在执行的代码地址,所述栈顶寄存器保存的是当前中断应用程序中终止函数的栈顶地址;
根据所述终止函数正在执行的代码地址在所述应用程序的可执行文件中找到所述终止函数的函数代码,并对其进行静态代码分析后重构所述终止函数的栈桢结构,包括:根据程序可执行文件进行反汇编,得到所述函数的汇编指令,从函数入口开始,对所述函数的汇编指令进行扫描,识别其中所有修改栈顶寄存器的指令,并通过跟踪栈顶位置的变化以得到开栈大小,根据所有修改栈顶寄存器的指令,识别其中所述函数输入参数以及返回地址的进出栈操作,并得到所述函数输入参数以及返回地址分别在栈中相对于栈顶或栈底的偏移量,并根据对应的偏移量得到所述函数输入参数在栈空间中的存储位置以及返回地址在的存储位置;
根据所述终止函数的栈桢结构对转储的所述栈空间进行解析,得到所述终止函数的返回地址以及父函数栈顶地址;
所述返回地址为调用所述终止函数的函数地址,根据所述返回地址得到对应函数的函数代码,采用同样方式重构栈桢结构并对转储的栈空间进行解析;重复此操作,直到无法得到有效返回地址或栈顶地址,即完成调用栈回溯。
2.根据权利要求1所述的函数调用栈解析和回溯方法,其特征在于,所述栈桢结构包括:开栈大小、函数输入参数的相对栈顶或栈底位置的偏移量、以及返回地址的相对栈顶或栈底位置的偏移量。
3.根据权利要求2所述的函数调用栈解析和回溯方法,其特征在于,所述所有修改栈顶寄存器的指令包括:专用进出栈指令,以栈顶寄存器为目的寄存器的MOV指令以及运算指令,以栈顶寄存器为基址寄存器的自增或自减访存指令。
4.根据权利要求3所述的函数调用栈解析和回溯方法,其特征在于,跟踪栈顶位置的变化以得到所述开栈大小包括:
将所述函数开始时的栈顶寄存器的值,作为函数栈底位置;
识别所有修改栈顶寄存器的指令,记录栈顶位置与栈底位置的最大差值,并将所述最大差值作为所述开栈大小。
5.根据权利要求3所述的函数调用栈解析和回溯方法,其特征在于,得到所述函数输入参数以及返回地址分别相对于所述函数栈顶或栈底的偏移量包括:
根据调用约定中规定的函数输入参数以及返回地址传递方式得到对应的偏移量;
若调用约定中规定使用栈传递,则所述偏移量为所述函数输入参数以及返回地址在栈中相对于栈顶或栈底的偏移量;
若调用约定中规定使用寄存器方式传递,则识别出以该寄存器为源寄存器的首次进栈操作,此时进栈操作中的偏移量为所述函数输入参数以及返回地址相对栈顶或栈底的偏移量;
若没有对应的进栈操作,则所述函数输入参数或返回地址的值保存在寄存器中。
6.根据权利要求3所述的函数调用栈解析和回溯方法,其特征在于,在获取所述函数的输入参数以及返回地址分别在栈中相对于栈顶或栈底的偏移量之后还根据该偏移量得到所述输入参数的存储位置以及返回地址的存储位置包括:
分别将所述函数输入参数以及返回地址在栈中相对于栈顶或栈底的偏移量与所述函数的栈顶或栈底地址进行相加得到对应的存储位置。
7.根据权利要求6所述的函数调用栈解析和回溯方法,其特征在于,根据所述终止函数的栈桢结构对转储的所述栈空间进行解析,得到所述终止函数的返回地址以及父函数栈地址包括:
在所述转储的栈顶寄存器中获取所述终止函数的栈顶地址;
根据所述终止函数的栈顶地址以及开栈大小得到所述终止函数的栈底地址,并根据所述终止函数的栈底地址确定所述父函数的栈顶地址;
根据所述终止函数的栈底地址,以及所述终止函数输入参数的存储位置以及返回地址的存储位置从转储的所述栈空间提取所述终止函数的输入参数以及返回地址。
8.一种函数调用栈解析和回溯装置,其特征在于,所述装置包括:
执行现场转储模块,用于转储异常中断或者手动中断应用程序的执行现场,所述应用程序的执行现场包括:栈空间以及多个处理器寄存器,其中,所述处理器寄存器包括分别有程序计数寄存器和栈顶寄存器,所述程序计数寄存器中保存有当前中断应用程序中终止函数正在执行的代码地址,所述栈顶寄存器保存的是当前中断应用程序中终止函数的栈顶地址;
栈桢结构重构模块,用于根据所述终止函数正在执行的代码地址在所述应用程序的可执行文件中找到所述终止函数的函数代码,并对其进行静态代码分析后重构所述终止函数的栈桢结构,包括:根据程序可执行文件进行反汇编,得到所述函数的汇编指令,从函数入口开始,对所述函数的汇编指令进行扫描,识别其中所有修改栈顶寄存器的指令,并通过跟踪栈顶位置的变化以得到开栈大小,根据所有修改栈顶寄存器的指令,识别其中所述函数输入参数以及返回地址的进出栈操作,并得到所述函数输入参数以及返回地址分别在栈中相对于栈顶或栈底的偏移量,并根据对应的偏移量得到所述函数输入参数在栈空间中的存储位置以及返回地址在的存储位置;
栈空间解析模块,用于根据所述终止函数的栈桢结构对转储的所述栈空间进行解析,得到所述终止函数的返回地址以及父函数栈顶地址;
调用栈构造模块,用于所述返回地址为调用所述终止函数的函数地址,根据所述返回地址得到对应函数的函数代码,采用同样方式重构栈桢结构并对转储的栈空间进行解析,重复此操作,直到无法得到有效返回地址或栈顶地址,即完成调用栈回溯。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国人民解放军国防科技大学,未经中国人民解放军国防科技大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202211187959.1/1.html,转载请声明来源钻瓜专利网。
- 上一篇:船舶五金配件用防锈装置
- 下一篇:精细化种植用滴灌阀





