异常机制不起作用
Exception mechanism not working
我有一个简单的 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 有什么条件呢?
Also I should say that problem in my loader I'm using own pe-mapper
which loading dll without LoadLibrary
这正是任何异常处理程序无法在您的代码中工作的原因。您只需要使用 LoadLibrary
或 LdrLoadDll
进行异常处理。然而,即使 LoadLibrary
存在仅从内存加载文件的方式 - 而不是从磁盘加载文件,但这是另一个故事
为什么?你可以问。因为 RtlDispatchException - api 执行异常调度 - 不是无条件地调用异常处理程序,而是在此之前进行许多检查。它检查的是某些 DLL 中处理程序的地址。如果是并且这个 DLL 有 safe SEH - are handler address registered. if not in any DLL - are memory in where handler is in section (file mapping on win32 language) and are this section mapped as image (with SEC_IMAGE
attribute) - otherwise this handler will be ignored. in case x64 - handlers at all not registred in TEB but in DLL section only (look RUNTIME_FUNCTION
). so system walk by list of DLL loaded for found handler address - look for RtlLookupFunctionEntry
- 所以如果你的代码不在 DLL 列表系统中根本找不到你的处理程序。
再次异常处理不起作用,因为且仅因为您没有使用 LoadLibrary
加载代码
我有一个简单的 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 有什么条件呢?
Also I should say that problem in my loader I'm using own pe-mapper which loading dll without LoadLibrary
这正是任何异常处理程序无法在您的代码中工作的原因。您只需要使用 LoadLibrary
或 LdrLoadDll
进行异常处理。然而,即使 LoadLibrary
存在仅从内存加载文件的方式 - 而不是从磁盘加载文件,但这是另一个故事
为什么?你可以问。因为 RtlDispatchException - api 执行异常调度 - 不是无条件地调用异常处理程序,而是在此之前进行许多检查。它检查的是某些 DLL 中处理程序的地址。如果是并且这个 DLL 有 safe SEH - are handler address registered. if not in any DLL - are memory in where handler is in section (file mapping on win32 language) and are this section mapped as image (with SEC_IMAGE
attribute) - otherwise this handler will be ignored. in case x64 - handlers at all not registred in TEB but in DLL section only (look RUNTIME_FUNCTION
). so system walk by list of DLL loaded for found handler address - look for RtlLookupFunctionEntry
- 所以如果你的代码不在 DLL 列表系统中根本找不到你的处理程序。
再次异常处理不起作用,因为且仅因为您没有使用 LoadLibrary