内容简介:我们的小ABI项目(让我们回顾一下:我们弄明白了我们用于有我们希望运行捕捉的函数的LSDA具有下面的调用表(即,下面着陆垫【即,下面的catch块】):
作者: nicolasbrailo
我们的小ABI项目( 链接 )能够抛出异常了,现在我们致力于捕捉它们;上次我们实现了一个能够检测及处理异常的personality函数,但它仍然有点不完整:即使在应该停止时它能正确地通知栈回滚器,但我们版本的__gxx_personality_v0不能执行catch块里的代码。上次我们学会了如何读LSDA,因此现在仅有的问题是,把各部分拼起来,在我们的personality函数里读.gcc_except_table。
让我们回顾一下:我们弄明白了我们用于有我们希望运行捕捉的函数的LSDA具有下面的调用表(即,下面着陆垫【即,下面的catch块】):
|
|
在我们函数的汇编代码里,所有这些表可以被映射到不同的位置,但对一篇博文这有点太混乱了(我建议你自己反汇编函数并尝试匹配每个标记,这样做可以学到很多东西)。同样,归功于某些网页,我们学到了这个表的格式。
让我们这样做来看我们是否在正轨上(小心读对齐问题,记住像这样定义CFI仅能对uint8工作,并可能不可移植):
|
|
备注:你可以从我的 github repo 下载完整的源代码。
正如你看到的,如果你运行这个代码,调用表里所有的项是相关的。与什么相关?函数的开头。这意味着如果我们希望得到特定着陆垫的EIP,我们要做的是_Unwind_GetRegionStart + LSDA_Call_Site.cs_lp!
现在我们应该能解决我们的异常问题:让我们尝试修改我们的personality函数来运行正确的着陆垫。现在我们需要恢复执行:_Unwind_SetIP。让我们再次修改personality函数来运行第一个可用的着陆垫,这通过查看汇编我们已经知道我们想要的那个:
|
|
尝试运行它,看到一个漂亮的无限循环。你能猜到哪里错了?答案在下一篇。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Go语言反射之反射调用
- Go语言反射之类型反射
- Go语言反射之值反射
- 模块讲解----反射 (基于web路由的反射)
- 装饰器与元数据反射(4)元数据反射
- .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。