反思是可能的混淆
自上一周以来,我一直在努力解决这个问题。 我混淆了我的应用程序的exe文件。 我们的应用程序是在线Web应用程序的离线工具 客户端将安装此应用程序并连接到互联网一次,应用程序将下载相关信息并存储在客户机上的xml文件中以供进一步显示。 出于安全目的,我们正在加密这些XML文件。 不幸的是,我们有一个GetCryptXML里面的exe方法,它将在客户机上读取加密的settings.xml并在解密后返回。 这个setting.xml也包含其他xml的加密密钥。
我在这里面临的问题是,即使在混淆之后,人员也可以通过传递混淆名称来调用GetCryptXML方法。
有什么办法可以解决这个问题吗?
这是我的想法来解决问题,但我不知道如何实施。
我的想法:调用我的函数的唯一方法是通过使用InvokeMember()函数进行反射。 在可以调用这个功能之前,他/她需要使用它来加载程序集。
Assembly.LoadFrom("myapplication.exe")
如果myapplication.exe中的代码可以识别哪个应用程序试图加载我,那么如果它不是应用程序,我们可以限制它们加载。 我不知道我该如何解决。
任何帮助是极大的赞赏。
谢谢。
如果你想限制对一个特定程序集的访问方法,你可以这样做:
private void RestrictedMethod() {
Assembly calling = Assembly.GetCallingAssembly();
if(calling.FullName != "myapplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") {
throw new InvalidOperationException();
}
// Do method work...
return;
}
这种方法的优点之一是,如果有人使用来自未经授权程序集的反射,则通话将失败。
混淆不会改变.net或应用程序的基础 - 最终,它所做的只是让阅读变得更加困难,并尝试添加反编译工具无法处理的情况......但是无论哪种方式,IL仍然存在。 如果你给他们加密文本(xml)和密钥(通过电报发送或隐藏在你的代码中),他们可以解密它。 你所做的只是让它变得更难,而不是不可能。
你可以做的一件事是强大的命名你的程序集,并且验证你的类型的调用者来自具有StrongNameIdentityPermission属性的特定强命名程序集。 请注意,KeeperOfTheSoul是正确的 - 完全信任程序集可以在4.0以前版本的.NET中绕过此版本(这是我的理解,在4.0中,此属性不再使用身份权限,只有在有正确证据的情况下才会成功)。
您也可以通过System.Diagnostics.StackTrace
编写代码来获取调用堆栈,并检查调用方法以验证它是预期的调用者之一。 这意味着执行速度稍慢,代码更多,但是您可以控制它。
编辑请参阅此处了解使用StrongNameIdentityPermission的演练。 这里是一篇关于检查堆栈跟踪的文章。 再一次请注意,这些都不是银色的子弹,但如果你觉得值得你花时间,那么可以给攻击者增加一个障碍。 (请记住,在互联网的这一天,只有一个成功的攻击者让任何人都能够搜索到结果)
如果可以通过反射调用某些东西,则必须通过常规代码进行调用(以某种方式)。
我建议不要这样做(因为没有办法完全阻止那些坚持执行它们不应该执行的代码的人)。
如果你真的有兴趣做这样的事情,你可以打破C#的OO负责人,并使你的所有方法都是私有的。 这样,只有在你的课堂上执行的代码才能定期调用它们。 每个人都必须通过反射来调用它们(并且通过反射调用私人成员经常被认为是不好的做法)。
奇怪的是,我越想到它,该方法可能应该被标记为私人,因为你不希望每个人都能称之为私人。 呼叫者必须通过公共门面呼叫,以确定是否允许您拨打该方法......并且只允许授权呼叫。
链接地址: http://www.djcxy.com/p/57483.html