问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

阻止调用dll

发布网友 发布时间:2022-05-07 06:53

我来回答

3个回答

热心网友 时间:2023-10-19 22:59

几种方法供参考:
1、存储注册码的加密版本到注册表,而后在DLL成员函数的一开始读取加密的注册码,解密后验证,不正确就退出,错误超过一定次数直接卸载DLL并删除。
2、在DLL的内部定义一个标志变量,没有鉴权时为0;而后添加一个鉴权的函数,每次使用DLL的方法前调用这个函数,验证成功注册码后把变量执1,在所有其他函数中检查这个变量的值,为1继续,0退出。

上面这两个方法都必须导出所有的函数,下面这个方法可以隐藏关键功能的函数,实现复杂度稍大,但是也不难,就是实现一个简单的工厂:

3、DLL对外只保留一个“工厂”接口,比如

//全局变量,用来存储每个接口的鉴权密码
std::string g_strPassword[16];

//不需要导出的功能函数1
int func1(...)
{
//第一句
if (false==fbCheckPassword(g_bPasswordOK[0].c_str()))
return ;
//做一些工作
...
// 清除鉴权,防止其他程序偷偷使用
g_bPasswordOK[0] = "";
return 1;
}
//不需要导出的功能函数2
void func2(...)
{
//第一句
if (false==fbCheckPassword(g_bPasswordOK[1].c_str()))
return ;

//做一些工作
...
// 清除鉴权,防止其他程序偷偷使用
g_bPasswordOK[1] = "";
return ;
}
...

extern "C" void * QueryFuncByName(int nFuncID,const char * pstrPwd) ;
//工厂
void * QueryFuncByName(int nFuncID,const char * pstrPwd)
{
if (false==fbCheckPassword(pstrPwd))
return 0;
g_bPasswordOK[nFuncID]=std::string(pstrPwd);
switch (nFuncID)
{
case 0:
return (void *)func1;
break;
case 1:
...
};
}

在主程序里调用
extern "C" void * QueryFuncByName(int nFuncID,const char * pstrPwd) ;

typedef int (*ftFunc1)(...);

void * pvfunc = QueryFuncByName(0,"password");
if (pvfunc )
{
ftFunc1 pfunc1 = (ftFunc1)pvfunc ;
pfunc1 (12);// 真正调用
}

这种方法好处是DLL中的关键函数都无法轻易被别人使用,即使使用结构查看工具确定了内部函数的入口,每次鉴权也都够呛。而且每次调用后状态重置,使得其它进程想在鉴权后偷偷使用加密的函数变得很难。

希望对LZ有所帮助!

热心网友 时间:2023-10-19 22:59

楼上这位仁兄,说的很好。不过,他的有些方法,是比较容易被破解的。
因为用户完全可以监视注册表,使用同样的方法往注册表写数据就可以破解。
我也提供2中方法:

1、自己写一个加壳程序,对目标DLL进行加壳。要想使用DLL,首先要在调用进程中进行脱壳,脱壳的方法只有你自己知道,因此,这中方法是最安全的,也很难破解。但是编写难度也相对较高。另外,这种方法,使得目标DLL看上去不像一个DLL,用DLL查看工具也无法查看其导出函数的名字等。。。

2、使用内核对象,比如一个内存映射对象,其内容为注册码。然后在DLL的 DLLMAIN函数中,首先试图打开该内核对象,如果失败,或者验证错误,就返回 0,这样,调用进程就会崩溃,从而无法使用DLL。内存映射对象的名字,还有注册码只有你自己知道,而且其注册码的验证算法只有在DLL被破解的情况下才能破解,而没有注册码的前提下很难破解,这是一个死锁。。安全系数也很高。

热心网友 时间:2023-10-19 22:59

几种方法供参考:
1、存储注册码的加密版本到注册表,而后在DLL成员函数的一开始读取加密的注册码,解密后验证,不正确就退出,错误超过一定次数直接卸载DLL并删除。
2、在DLL的内部定义一个标志变量,没有鉴权时为0;而后添加一个鉴权的函数,每次使用DLL的方法前调用这个函数,验证成功注册码后把变量执1,在所有其他函数中检查这个变量的值,为1继续,0退出。

上面这两个方法都必须导出所有的函数,下面这个方法可以隐藏关键功能的函数,实现复杂度稍大,但是也不难,就是实现一个简单的工厂:

3、DLL对外只保留一个“工厂”接口,比如

//全局变量,用来存储每个接口的鉴权密码
std::string g_strPassword[16];

//不需要导出的功能函数1
int func1(...)
{
//第一句
if (false==fbCheckPassword(g_bPasswordOK[0].c_str()))
return ;
//做一些工作
...
// 清除鉴权,防止其他程序偷偷使用
g_bPasswordOK[0] = "";
return 1;
}
//不需要导出的功能函数2
void func2(...)
{
//第一句
if (false==fbCheckPassword(g_bPasswordOK[1].c_str()))
return ;

//做一些工作
...
// 清除鉴权,防止其他程序偷偷使用
g_bPasswordOK[1] = "";
return ;
}
...

extern "C" void * QueryFuncByName(int nFuncID,const char * pstrPwd) ;
//工厂
void * QueryFuncByName(int nFuncID,const char * pstrPwd)
{
if (false==fbCheckPassword(pstrPwd))
return 0;
g_bPasswordOK[nFuncID]=std::string(pstrPwd);
switch (nFuncID)
{
case 0:
return (void *)func1;
break;
case 1:
...
};
}

在主程序里调用
extern "C" void * QueryFuncByName(int nFuncID,const char * pstrPwd) ;

typedef int (*ftFunc1)(...);

void * pvfunc = QueryFuncByName(0,"password");
if (pvfunc )
{
ftFunc1 pfunc1 = (ftFunc1)pvfunc ;
pfunc1 (12);// 真正调用
}

这种方法好处是DLL中的关键函数都无法轻易被别人使用,即使使用结构查看工具确定了内部函数的入口,每次鉴权也都够呛。而且每次调用后状态重置,使得其它进程想在鉴权后偷偷使用加密的函数变得很难。

希望对LZ有所帮助!

热心网友 时间:2023-10-19 22:59

楼上这位仁兄,说的很好。不过,他的有些方法,是比较容易被破解的。
因为用户完全可以监视注册表,使用同样的方法往注册表写数据就可以破解。
我也提供2中方法:

1、自己写一个加壳程序,对目标DLL进行加壳。要想使用DLL,首先要在调用进程中进行脱壳,脱壳的方法只有你自己知道,因此,这中方法是最安全的,也很难破解。但是编写难度也相对较高。另外,这种方法,使得目标DLL看上去不像一个DLL,用DLL查看工具也无法查看其导出函数的名字等。。。

2、使用内核对象,比如一个内存映射对象,其内容为注册码。然后在DLL的 DLLMAIN函数中,首先试图打开该内核对象,如果失败,或者验证错误,就返回 0,这样,调用进程就会崩溃,从而无法使用DLL。内存映射对象的名字,还有注册码只有你自己知道,而且其注册码的验证算法只有在DLL被破解的情况下才能破解,而没有注册码的前提下很难破解,这是一个死锁。。安全系数也很高。

热心网友 时间:2023-10-19 22:59

现在的程序,注册码都比较容易破。除非加个厉害的壳。
一般的壳,学过1段时间破解的就能破。
至于内存映射,ollydbg一调试注册码就出来了。

建议楼主学编程就专心学编程,想把自己的成果安全化,那就再去学加密解密。

热心网友 时间:2023-10-19 23:00

现在的程序,注册码都比较容易破。除非加个厉害的壳。
一般的壳,学过1段时间破解的就能破。
至于内存映射,ollydbg一调试注册码就出来了。

建议楼主学编程就专心学编程,想把自己的成果安全化,那就再去学加密解密。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦幻西游怎样查看自己怎么加的属性点阿? 我好长时间没玩了 .. 怎么... 梦幻西游怎么查看我各项加了多少点 卤肉料的配方 卤肉上色最好的配方前十 三国中曹操有几个儿子 曹植的意思是什么 曹操有多少个儿子?其中姓名叫什么? 简谱中1=c2/4是什么意思?别说几节几拍我不知道节和拍是什么意思 简谱四分之二什么意思 ...是鸡膏吗 放在老汤里行吗 怎么才能容于水 谢谢 怎么使用? 嘴里经常有痰,应该吃什么 嘴里老是有痰,该怎么办 嘴里老有痰 嘴巴里有痰咽不下去怎么办~谢谢大家帮帮我哦~好答案给大家加分~谢谢大家哦 梦见我洗鱼掉了又被我捞着? 女人梦见清澈见底,自己把鱼肉放在水里洗,还看见有两三条鱼头? 梦见白色的鱼我把它洗的很干净 工厂转行 土地使用性质需要改变吗? 简答题公务员年度被确定为基本称职等次的有什么后果 请问:被诫勉谈话一次,当年被评为基本称职,这样考核合理吗?有无违反了公务员考核规定? 公务员年度考核基本称职怎么办 基本称职公务员的处理程序 云南省2014公务员连续三年考核基本称职的怎么处理办法 领导干部被评为基本合格怎么处理 新学期新自我-作文600字左右 滨州NT检查最佳时间是什么时候,怀孕两个月能做NT吗? 新学期,新航程作文,600字 易语言中写内存的数据长度指什么 易语言 读入文件()和读入字节集(打开文件())有什么区别,哪个更好 易语言读入字节集欲读入数据的长度 最讨厌没有网购过得人,只道听途说,就评头论足,尤其是说淘宝没真货全假货,还说京东靠得住,都是正品, if Buser=rs("Buser") and Bpassword=rs("Bpassword") then rs("je2")=rs("je2")+my_je02 rs("je2")=now() 不随地吐痰的话,嘴里有痰怎么办? 嘴里经常有痰。吐也吐不完,吐吐也会反胃。到底怎么了? VB调用API函数时遇到的问题 VC++变量传递 大家卖器材,有被1234vv66评头论足过吗? 为什么我的嘴里有痰,有的时候就有,有的时候就没有。请问怎么回事? VC++变量问题 宝宝嘴里有痰有什么好办法能让他吐出来 VB编程调用API函数时,调试运行没问题,生成的exe程序就不行了 淘宝上的zippo可靠吗? 谁有最新的east nod 32 3.0用户名和密码??发给我啊 懂电脑的来评头论足一下谢谢 ESET N0D32激活码 请问:联想s60t怎么隐藏桌面图标,还有怎么获得root权限?谢谢 《淘宝天下》周刊上的笑话 写不出东西,最好不要对别人的作品评头论足这一观点正确吗? 亲,请不要当着我娃的面对她评头论足,谢谢 如何将联想v360在最下 面的任务栏中的图标收起?我的电脑莫名的出现了桌面库,,lenovo,还有计算机的图标,