我想根据条件从dll内部是否为真,来确定是否可以阻止或允许python ctypes加载dll。
一些背景:
我的应用程序使用各种计算算法,这些算法是我在Python中创建的原型,然后在C ++中重新实现以提高速度。我仍将Python用于应用程序“胶水”和GUI。我正在使用ctypes包装器访问dll中的功能。
现在,我需要保护软件安全,以便仅在存在安全加密狗的情况下才能运行该软件。Python的开放性使其变得很困难,因此我希望能够停止加载dll的python脚本,除非存在检查加密狗的函数返回True。
示例Python包装器:
from ctypes import cdll, c_int , c_float, c_bool
lib = cdll.LoadLibrary('my.dll')
cpp_sum = lib.sum
cpp_sum.argtypes = [c_int,c_int]
cpp_sum.restype = c_int
def wrapped_sum(value_1,value_2):
return cpp_sum(value_1,value_2)
以及my.dll的代码:
#include "stdafx.h"
#include <cmath>
#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int sum(int a, int b)
{return a + b;}
//pseudo dongle code:
bool is_dongle_present(){
if dongle present return true
else return false
理想情况下,如果dongle_is_present返回false,则dll将无法加载。有人可以帮忙吗?如果这个问题不清楚,请告诉我!
非常感谢
DllMain
向您的库添加功能。
动态链接库(DLL)的可选入口点。当系统启动或终止进程或线程时,它将使用进程的第一个线程为每个加载的DLL调用入口点函数。当使用LoadLibrary和FreeLibrary函数加载或卸载DLL时,系统还会调用DLL的入口点函数。
你可以防止DLL加载通过返回FALSE
的DLL_PROCESS_ATTACH
:
当系统使用DLL_PROCESS_ATTACH值调用DllMain函数时,如果成功,则该函数返回TRUE,如果初始化失败,则返回FALSE。如果由于进程使用LoadLibrary函数而在调用DllMain时返回值为FALSE,则LoadLibrary返回NULL。(系统立即使用DLL_PROCESS_DETACH调用您的入口点函数,并卸载DLL。)如果在进程初始化期间调用DllMain时返回值为FALSE,则该进程终止并出现错误
有关其他信息,请参见DllMain MSDN条目。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句