代码之家  ›  专栏  ›  技术社区  ›  Ashif Nataliya

模糊处理时可以进行反射

  •  2
  • Ashif Nataliya  · 技术社区  · 16 年前

    从上个星期开始我就一直在努力解决这个问题。我已经混淆了我的应用程序的exe。我们的应用程序是在线web应用程序的离线工具。客户端将安装此应用程序并连接到internet,应用程序将下载相关信息并存储在客户端计算机上的xml文件中以供进一步显示。为了安全起见,我们正在加密这些xml文件。不幸的是,我们在exe中有一个方法GetCryptXML,它将读取加密的设置.xml并在解密后返回。这个设置.xml也包含其他xml的加密密钥。

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

    有办法解决这个问题吗?

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

    我的想法是:调用我的函数的唯一方法是使用InvokeMember()函数进行反射。在调用此函数之前,他/她需要使用此函数加载程序集。

    Assembly.LoadFrom("myapplication.exe")
    

    如果代码在里面我的应用程序.exe可以确定哪个应用程序试图加载我,然后我们可以限制他们加载,如果它不是预期的应用程序。我不知道该怎么解决。

    谢谢。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Steve Ellinger    16 年前

    如果要将对方法的访问限制到特定程序集,可以执行以下操作:

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

    这种方法的优点之一是,如果有人使用来自未经授权的程序集的反射,则调用将失败。

        2
  •  9
  •   Philip Rieck    16 年前

    模糊处理不会改变.net或您的应用程序的基础-最终,它所做的只是使其更难阅读,并尝试添加反编译工具无法处理的情况。。。但不管怎样,IL仍然存在。如果你给他们加密的文本(xml)和密钥(通过网络发送或隐藏在代码中),他们就可以解密。你所做的只是让它变得更难,而不是不可能。

    可以 是吗 strong name 并验证类型的调用者是否来自具有 StrongNameIdentityPermission 属性。请注意,KeeperOfTheSoul是正确的-完全信任程序集可以在4.0之前的.net版本中绕过此选项(据我了解,在4.0中,此属性不再使用标识权限,只有在存在正确证据时才成功)。

    System.Diagnostics.StackTrace ,并检查调用方法以验证它是否是预期的调用方之一。这意味着执行速度会慢一点,代码也会多一些,但您可以控制它。

    编辑 See here inspecting the stack trace . 再次,请注意,这两个都不是一个银弹,但可以增加一个障碍的攻击者,如果你认为这是值得你的时间。(请记住,在互联网时代,任何数量的人只需要一个成功的攻击者就可以用谷歌搜索结果)

        3
  •  1
  •   Justin Niessner    16 年前

    如果某个东西可以通过反射来调用,那么它必须(以某种方式)通过常规代码来调用。

    我建议反对这一点(因为没有办法完全挫败那些坚持执行他们不应该执行的代码的人)。

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

    奇怪的是,我想得越多,这个方法应该被标记为private,因为你不希望每个人都能调用它。调用者必须通过一个公共facade调用,这个facade将决定是否允许你调用这个方法,并且只允许授权的调用。