c# - 反射是可能的混淆

标签 c# security reflection assemblies obfuscation

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

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

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

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

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

Assembly.LoadFrom("myapplication.exe")

如果 myapplication.exe 中的代码可以识别哪个应用程序正在尝试加载我,那么如果它不是预期的应用程序,我们可以限制它们加载。不知道怎么解决。

非常感谢任何帮助。

谢谢。

最佳答案

混淆不会改变 .net 或您的应用程序的基础 - 最后,它所做的只是让它更难阅读,并尝试添加反编译工具无法处理的情况......但无论哪种方式 IL还在那里。如果您向他们提供加密文本(xml)和 key (通过网络发送或隐藏在您的代码中),他们就可以对其进行解密。你所做的只是让它变得更难,而不是不可能。

可以做的一件事是strong name您的程序集,并验证您的类型的调用者是否来自具有 StrongNameIdentityPermission 的特定强名称程序集属性。请注意,KeeperOfTheSoul 是正确的 - 完全信任程序集可以在 4.0 之前的 .net 版本中绕过它(据我了解,在 4.0 中,此属性不再使用身份许可,并且只有在存在正确证据时才会成功)。

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

编辑 See here有关使用 StrongNameIdentityPermission 的演练。这是一篇关于 inspecting the stack trace 的文章.再次注意,这些都不是 Elixir ,但如果您认为值得花时间的话,可以给攻击者增加一个障碍。 (请记住,在互联网时代,任何数量的人都可以用谷歌搜索结果,只需要一个成功的攻击者)

关于c# - 反射是可能的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3769226/

相关文章:

c# - 反射说接口(interface)方法在实现类型中是虚拟的,而实际上它们不是?

java - MyClass.class 和 Class.forName ("className"之间的区别)

java - 如何更改父类中的私有(private)字段

c# 在 .NET 2 上使用 DataTable AsEnumerable()

security - 如何仅查看当前分支的 dependentabot 警报?

c# - 如何使用 C# 和并行扩展并行化顺序任务?

apache-flex - Flex 和 crossdomain.xml

c - 这是测试缓冲区溢出的好方法吗?

c# - 如何检查空的 Gridview

c# - 在 asp mvc 4 中将 Json 文本解析为 C# 对象