混淆是可能的混淆

自从上一周以来,我一直在努力解决这个问题。 我混淆了我的应用程序的exe。 我们的应用程序是在线Web应用程序的离线工具 客户端将安装此应用程序并连接到Internet,应用程序将下载相关信息并存储在客户端计算机上的xml文件中以供进一步显示。 出于安全考虑,我们正在加密这些xml文件。 不幸的是,我们在exe内部有一个方法GetCryptXML,它将读取客户端机器上的加密settings.xml并在解密后返回它。 此setting.xml也包含其他xml的加密密钥。

我面临的问题是,即使在混淆之后,人也可以通过传递混淆的名称来调用GetCryptXML方法。

有什么方法可以解决这个问题吗?

这是我解决问题的想法,但我不确定如何实施。

我的想法:只有通过使用InvokeMember()函数进行reflection才能调用我的函数。 在可以调用此函数之前,他/她需要使用此函数来加载程序集。

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; } 

这种方法的一个优点是,如果有人使用来自未授权组件的reflection,则呼叫将失败。

混淆不会改变.net或你的应用程序的基础 – 最后,它所做的只是让它更难阅读,并尝试添加反编译工具无法处理的案例……但无论哪种方式,IL仍然存在。 如果你给他们加密文本(xml)和密钥(通过网络发送或隐藏在你的代码中),他们可以解密它。 你所做的只是让它变得更难,而不是不可能。

可以做的一件事是对程序集进行强名称 ,并validation您的类型的调用者来自具有StrongNameIdentityPermission属性的特定强名称程序集。 请注意,KeeperOfTheSoul是正确的 – 完全信任程序集可以在4.0之前的.net版本中绕过它(我的理解是,在4.0中,此属性不再使用身份权限,只有在有正确证据的情况下才能成功)。

您还可以编写代码以通过System.Diagnostics.StackTrace获取调用堆栈,并检查调用方法以validation它是否是预期的调用者之一。 这意味着执行速度稍慢,代码更多,但您可以控制它。

编辑 有关使用StrongNameIdentityPermission的演练, 请参阅此处 。 这是一篇关于检查堆栈跟踪的文章。 再次注意,这些都不是银弹,但如果您认为值得花时间,可以为攻击者增加一个障碍。 (请记住,在互联网的那一天,只有一个成功的攻击者可以为任意数量的人搜索结果)

如果可以通过Reflection调用某些内容,则必须通过常规代码调用(以某种方式)。

我建议不要这样做(因为没有办法完全阻止那些坚持执行他们不应该执行的代码的人)。

如果你真的对这样的事情感兴趣,你可以打破C#的OO Principal并使你的所有方法都是私有的。 这样,只有从类中执行的代码才能定期调用它们。 其他人都必须通过Reflection来调用它们(通过Reflection调用私有成员通常被认为是不好的做法)。

奇怪的是,我想的越多,该方法应该被标记为私有,因为你不希望每个人都能够调用它。 呼叫者必须通过公共门面呼叫,这将确定您是否被允许呼叫该方法……并且仅允许授权呼叫。