我有一个简单的dll项目,当加载dll时,它会创建带代码的线程:
try
{
throw std::exception("Not working");
}
catch (std::exception &err)
{
printf("error %s\n", err.what());
}
catch (...)
{
printf("unhandled\n");
}
但是这段代码不起作用,它仍然告诉我未处理的异常 我也应该在装载机中说出问题 我使用自己的pe-mapper加载没有LoadLibrary的dll 所以相同的代码工作在单独的exe或甚至简单的注入 显然,由于某种原因机制被打破,我之前解决了问题,例如用fmath 问题是如何使异常机制起作用? LoadLibrary有什么条件吗?
答案 0 :(得分:1)
另外我应该说我的装载机中的问题我正在使用自己的pe-mapper 哪个加载DLL没有LoadLibrary
这正是导致任何异常处理程序无法在您的代码中运行的原因。您只需使用LoadLibrary
或LdrLoadDll
进行例外工作。但即使只有LoadLibrary
存在的方式只能从内存加载文件 - 而不是从磁盘加载,但这是另一个故事
SEC_IMAGE
属性) - 否则将忽略此处理程序。如果是x64 - 处理程序根本没有在 TEB 中注册,而只在 DLL 部分注册(查看RUNTIME_FUNCTION
)。所以系统按照找到的处理程序地址加载的 DLL 列表 - 查找RtlLookupFunctionEntry
- 所以如果你的代码不在 DLL 列表系统中根本找不到你的经纪人。
再次异常处理无效,因为您没有使用LoadLibrary