2010-03-10 52 views
1

我有DLL和应用程序将调用一些功能在此DLL中受到保护,免受错误。例如...如何应用程序可以在DLL模块

DLL功能:

char const* func1() 
{ 
    return reinterpret_cast<char const*>(0x11223344); 
} 

施药代码:

func1 = reinterpret_cast<Func1Callback>(::GetProcAddress(hDll, "func1")); 
blablabla 
char const* ptr = func1(); 
cout << ptr; 

该DLL是不是我的控制(插件)下.. 相同的代码将导致访问冲突在我应用程序,所以......是否有任何机制可以确定这样的错误?

+0

如果DLL是不是“值得信赖的”,那么考虑的扩展机制比运行任意代码那么强大。例如:如果您正在编写媒体播放器并希望提供“蒙皮”,则可以将窗口句柄传递给DLL中的任意函数(可以格式化硬盘驱动器......)或者您可以读取一个文本文件有一个可视PNG组件的列表。后者可以更容易不以可能导致崩溃... – HostileFork 2010-03-10 10:47:51

回答

1

由于DLL可以做任何事情,你的程序可以做的唯一可靠的方法是将其加载到一个单独的工作轻量级进程,一旦什么不好的事情发生刚刚重新启动的过程。您需要一些协议将数据传递到工作进程并接收结果。

1

该dll被加载到进程的地址空间。如果它访问一些无效的内存位置,你的进程将崩溃。除了完全不使用此dll外,我没有看到任何其他方法。

+0

我搜索的方式,允许例如打印一些信息时DLL返回非法指针或做其他奇怪的事情的方式恶意或者有缺陷的限制... – ProgramWriter 2010-03-10 10:50:38

0

如果DLL将返回垃圾内存地址到你的应用程序,我说你不应该使用它来,因为它没有发挥其预期/所需的功能。另外,请不要试图通过使用Win32 IsBad * Ptr类的函数来防范它,如MSDN文档所述(另请参阅Raymond Chen的this post以获取更好的描述)。

0

你可以将函数调用放入try catch块中,它不会在函数调用时破坏整个应用程序权限,但没有人会保证,加载的dll不会改变代码中的内存,在这种情况下,会很难在其他地方调试崩溃。所以你可能会提出一些保护只是访问违规,但无论如何不能完全protext你申请一些副作用。

相关问题