2 回答
TA贡献1848条经验 获得超10个赞
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的方案。 对于高手,不存在完全的反破解的方法。
TA贡献1798条经验 获得超3个赞
方法1:用ILMerge/SmartAssembly之类的工具把dll加包到exe里; 然后再混淆. 这样破解者比较难以找到具体的调用点. 方法2:dll里不声明public类/方法,而把exe需要使用的声明为internal;然后给assebmly加一个InternalsVisibleTo属性. 这样破解者需要把它的exe文件名称做成和你的exe一样才能调用.
- 2 回答
- 0 关注
- 1434 浏览
添加回答
举报