Answers
插件系统确实是个较复杂的系统,之前做过一个特征工具的插件管理系统,分享下经验:
插件系统可分为两个模块:插件管理、插件。插件管理模块负责
检测、更新、删除、加载
插件。
一.
检测
:
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, 8 months ago