客户端如何实现一个较完善的插件系统?

插件系统是个复杂的系统,实现一个完整的插件系统需要一些功能,下面是我总结的的一些要素:
1.插件独立性
2.插件交互(通讯)
3.生命期控制
4.容错
5.安全
6.更新机制
希望大家提供意见和建议,最好提供有参考价值的插件系统

评论 (0)链接2011-11-29 

插件系统确实是个较复杂的系统,之前做过一个特征工具的插件管理系统,分享下经验:
插件系统可分为两个模块:插件管理、插件。插件管理模块负责检测、更新、删除、加载插件。
一.检测
1.为了防止加载到骇客提供的插件,执行恶意代码。可在插件中导出特定接口,若插件管理模块检测到无此接口,不加载。代码如下:

  
 #define PLUGINAPI EXTERN_C __declspec(dllexport)
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
PLUGINAPI LPSTR GetName(void)
{
return "Test Plugin";
}

PLUGINAPI DWORD GetVer(void)
{
return 0x01000001;
}
PLUGINAPI BOOL Start(T_SendData pfnSendData)
{
}
PLUGINAPI void Stop(void)
{
}

插件管理模块使用

  
**LoadLibraryEx**(lpszPath, NULL, **DONT_RESOLVE_DLL_REFERENCES**);检测是否存在GetName、GetVer模块,不用真正加载到内存。这样也可用来做版本控制。

每个插件需要提供GetName、GetVer、Start、Stop接口,供插件管理模块调用。
当然,骇客也可以伪造GetName、GetVer这两个接口的,更好的办法是使用自己的算法对插件加密,然后解密,然后验证是否有这两个接口。

二、版本控制:
上面提供的GetName、GetVer两个接口可用来做版本控制。低于等于当前版本号的不加载,大于的卸载掉插件再加载新的。

三、插件配置文件:
为了让程序启动时默认加载插件,需要写配置文件。但保存配置文件的地方要隐蔽,且最好做加密。否则会被骇客利用,写入配置文件加载恶意程序。例如,可以写入某位置的.lnk(快捷方式文件),不过需要解析快捷方式格式。若你说不能抵御逆向分析,可以对其加入一些反调试、加个加密壳的方式防御。

刘锡涛
刘锡涛
281
编辑于 2012-03-02
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2011-11-30

刚看到一个类似的东东:
@如何实现一个管理多个类的管理类

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-03-03

不是您所需,查看更多相关问题与答案

德问是一个专业的编程问答社区,请 登录注册 后再提交答案