推荐工具 或者方法,客户端 使用,。。。。。。。
无不破之文件;安全的方式(如果是il语言的)就是把dll类的东西混淆,增加无用跳转逻辑,多增加dic...总而言之跟写代码的要求相反——越乱越好。楼上的Assembly方法跟加壳是一个道理,脱壳也是比比皆是。
如果你使用加密 —— 那么找到解密也比较容易,因为通常只需要定位byte[]或者string就可以锁定密码,因此你用加密或者加密狗之类的都是能找到的。
所以安全的方式就是大量让人看不懂的逻辑,让逆向工程周期更长。—— 无论il或者非il都是这样。
最后再补充一下,文件多分散,到处放一些(这些也可以通过监视可以得到),弄一些类似的名字,既通过环境加载(自加载,比如同目录下,系统目录,环境变量设置其他目录等等),也可以通过动态加载...
总结:目标就是——乱。
加密没有破不了的
将类似注册码的东西放在dll资源中 每次使用dll的方法之前 先判断注册码跟机器信息是否匹配(自己选择一套算法) 如果不匹配 需要重新获得注册码 这个dll也要加壳
或者 可以将dll嵌入主程序中 作为一种资源 也就是说 exe目录下见不到单独的dll文件
这个缺点很明显 不能更新单独的dll 要更新 除非一整个程序完整更新
开发时,不要将引用到的dll copy到输出目录中 而是将dll文件作为资源嵌入到exe中 dll文件的Build Action 设置为Embedded Resource;
程序一启动就加载资源中的dll:
static class Program { [STAThread] static void Main() { string resource1 = "MyApplication1.mydll1.dll"; //dll文件在项目中的路径 string resource2 = "MyApplication1.mydll2.dll"; //dll文件在项目中的路径 EmbeddedAssembly.Load(resource1, "mydll1.dll"); EmbeddedAssembly.Load(resource2, "mydll2.dll"); AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { return EmbeddedAssembly.Get(args.Name); } }
转自:http://bbs.csdn.net/topics/390666257
dotNET_Reactor