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


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

c# VC windows C++ ATL

信春哥的永生 12 years, 9 months ago

插件系统确实是个较复杂的系统,之前做过一个特征工具的插件管理系统,分享下经验:
插件系统可分为两个模块:插件管理、插件。插件管理模块负责 检测、更新、删除、加载 插件。
一. 检测
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(快捷方式文件),不过需要解析快捷方式格式。若你说不能抵御逆向分析,可以对其加入一些反调试、加个加密壳的方式防御。

昔日的小伙伴 answered 12 years, 9 months ago

Your Answer