[已解决问题] 请教如何防止DLL被非法调用
提问时间: 2008-06-14 19:09
悬赏分:100 浏览:569 次
各位大侠,请教如何防止DLL被非法调用啊。
比如C/S的程序有很多DLL(比如:SampleDll.dll),如何才能防止客户自己开发一个程序来调用SampleDll.dll呢。
也就是说如何才能只允许我的EXE文件(比如:SampleExe.exe)才可以调用SampleDll.dll ???
有人说用混淆器,可这根本不能解决问题,只是障眼法而已。
还请各位大哥们指点一下,当然最好是能给点代码啦,小弟在此谢过。
提问者:JieNet - 初学一级
最佳答案
1. 使用Internal接口,然后使用InternalVisibleToAttribute。 InternalVisibleToAttribute可以指定Assembly的PublicKey,因此,即使他的Assembly也修改成你的名字,也无法调用其中的成员。 但是,这样做依然可以使用反射调用 :-( 2. 在你的类型的构造函数上添加校验逻辑 你可以在你的构造函数上添加校验逻辑,检查调用者是不是你的程序,一般可以使用PublicKey进行校验。大多数情况下,用户没有办法模拟你的PublicKey,除非你把它泄露出去了。 这里,你可以通过在构造函数中调用System.Reflection.Assembly.GetCallingAssembly()方法得到调用者的Assembly,通过GetName().PublicKey方法可以得到PublicKey进行校验。 如果你的API是通过静态函数暴露的,在每一个暴露的静态函数上使用同样的方法校验。 但是,这样做无法避免用户反编译你的代码,将这段校验逻辑摘除。 3. 使用混淆 使用IDE自带的Dotfuscator对Assembly进行混淆(注意,将Library和调用Assembly一起进行混淆)。如果你的程序足够复杂,这样已经可以初步确保用户反编译出来的代码没有办法进行修改和编译。基本可以保证你的产品的安全性。 如果还不放心安全性,可以采用deerchao的方案。 对于高手,不存在完全的反破解的方法。
2008/6/15 14:26:38 回答者:Colin Han


提问者对于答案的评价:3q
其它回答(5)
你不知道C#的代码能反编译掉吗?。。代码都能看到,复制过来就行了
4个月前   回答者:clefoo - 初学一级
强签名?
4个月前   回答者:沙加 - 老鸟四级
方法1:用ILMerge/SmartAssembly之类的工具把dll加包到exe里; 然后再混淆. 这样破解者比较难以找到具体的调用点. 方法2:dll里不声明public类/方法,而把exe需要使用的声明为internal;然后给assebmly加一个InternalsVisibleTo属性. 这样破解者需要把它的exe文件名称做成和你的exe一样才能调用.
3个月前   回答者:deerchao - 大侠五级
我个人认为如果楼主希望达到防止他人调用的效果有以下几个方法,可以分开考虑,当然如果你有时间做安全方面的开发,那么这些方法最好是综合在一起。 1、给Dll文件增加数字签名认证,发送有效的数字签名认证后才能调用。 2、选用好的混淆器进行混淆,混淆的目的是防止他人使用Dll查看器来查看Dll文件,并分析代码及组织结构后,从而调用。当然这也是只能相对阻止,不能被绝对阻止。 3、在注册表中注册您的Dll文件,增加一个键名和键值,键值不能是明文文本形式,而是加密的密文二进制流,这样在调用前必须判断DLL文件必须被注册,而且提供正确的注册键值或密钥,不过这样一来你的Exe文件或者其他调用此Dll文件的程序也必须使用其他安全方法被保护起来。 4、在Dll文件中先使用对称加密后再使用不对称加密算法两种方式进行调用用户身份判断,符合身份的用户才能调用其中的算法,在Dll文件的没法方法调用前都先判断用户身份。此方法同样需要将调用着与被调用着一起保护。 5、在Dll文件中判断某Exe文件或者调用此Dll文件的程序是否被保护,如果没有,则不能成功调用Dll文件。 6、将Dll文件打包到Exe文件中,使得Exe文件和Dll文件一同被保护。 7、尽量避免使用Public关键字,如网友deerchao所述。 8、其他一些关于安全方面的技巧,不过所有安全访问通信在内存中传输的信息,都必须是密文,否则某些内存读取器可以读取到信息,而且如果对方是汇编高手,也同样能找到你的安全方面的漏洞。 正如网友datasky所说,所有的安全都只能是相对安全,而没有绝对安全。Windows中的Dll文件都能被破解而找到漏洞所在,更何况是我们开发的Dll文件,怎么说也需要Windows操作系统支持,被破解是在所难免的事情,只是看破解的人是否有耐心、时间和精力像破解Windows的Dll文件一样,去破解你的Dll文件了。 当然对于某一个Dll文件来说组合使用的上述安全方法越多,性能就会越低,如同鱼和熊掌不能兼得,只要你找准平衡点,适当选用上述性能较好的、安全方法相对较优的,组合使用就可以了。
3个月前   回答者:刚刚 - 老鸟四级
真想用的话,可以破解DLL重新编译一下 但是确实有防止别人调用自己的dll 的方法 好像是生成dll时做
3个月前   回答者:林间曦阳 - 小虾三级
评论
4个月前   JieNet :
我是要保护我的代码,不是要偷别的代码。。。。。。
4个月前   clefoo :
我知道啊。。我说你的DLL可以被别人反编译,源代码都可以看到。。还加什么密啊
4个月前   JieNet :
这个我已经混淆了,虽然不是治本的方法,但是可以累死他的眼睛。

我刚刚又发现了一个怪问题:
使用 sn -tp MyPublickKey.snk 显示出来的token
怎么和
使用代码
for (int i = 0; i < pk.Length; i++)
pkString.AppendFormat("{0:x}", pk[i]);
string s = pkString.ToString();

得出来的不一样呢??

命令窗口中是 52b73f80d00d732b
调试窗口中是 52b73f80d0d732b
3个月前   Colin Han :
哈哈,应该是:
pkString.AppendFormat("{0:x2}", pk[i]);
3个月前   林间曦阳 :
真想用的话,可以破解DLL重新编译一下
但是确实有防止别人调用自己的dll 的方法
好像是生成dll时做

3个月前   林间曦阳 :
我发现竟然还可以重复,发帖!!怎么回事,刚才那个帖子是我随便发的....
3个月前   林间曦阳 :
怎么可以重复发呢.....不是不可以重复发吗....怪...
3个月前   刚刚 :
@林间曦阳
评论是可以重复发的,而回答只能有一个!
   您需要登录以后才能回答!
 

我要提问

我的问题


快到期问题

> 问题排行榜

相关内容

相关链接