如何限制某些程序集的反射?

3
在我的.NET应用程序中,我想限制反射到特定的程序集。我的意思是,我希望一个特定的程序集只能被一些预定义的程序集反射,而不是其他任何程序集。我该怎么做?

编辑:

这个工具完全关闭了一个程序集的.NET反汇编和反编译。我想允许一些预定义的程序集反射此程序集,但限制其他程序执行此操作。我希望通过声明某些程序集来实现这一点,例如AssemblyOne给予AssemblyTwo权限反射它,因此只有AssemblyTwo可以完全信任地反射它,没有其他程序集可以这样做。

@SLaks 我希望有某种方法可以做到这一点! - viky
我几乎可以确定没有。 - SLaks
4个回答

9
你提供的工具基本上是将整个应用程序编译成本地代码。这并不真正“关闭”Reflection或其他任何东西,它只是将应用程序变成了完全不同的东西,它不再是字节码,也不再是.NET程序集。
拥有完全信任的调用者始终可以在.NET程序集及其内部使用反射。除了(a)混淆,任何有耐心和决心的人都可以对其进行去混淆;或者(b)编译为本机代码,这将防止任何类型的反射(以及许多其他有用的功能),你无法防止这种情况发生,当然也不能将其限制在特定的程序集中。
与另一个答案所说的相反,ReflectionPermissionAttribute并不能阻止调用者反射 你的代码;相反,它控制从那些代码到反射API的访问。这对此处没有任何帮助。
为什么隐藏你的代码或类结构如此重要呢?除非你为NSA工作,大多数代码并不是那么有价值/保密,大多数应用程序在足够的时间和资源下都能轻松地被反向工程。实际上,攻击者或抄袭者很少从Reflector中复制代码或使用反射来发现你的API。
我想我只能代表自己,但如果有一天的免费时间,要么实现一个酷炫的功能,要么投资于试图保护内部代码,我总是会开发实际增加价值的新功能。

我从客户那里收到了类似的要求,他们想要阻止某些程序集被反射。因此,我需要将正在应用程序中反射的代码从这些程序集移动到单独的一个程序集中,但如果有一种方法可以允许一些特定的程序集进行反射,那么就可以节省很多我的工作。 - viky
3
您的客户需要了解反射的工作方式。没有选择加入或退出的系统。将代码移动到单独的程序集中也无法保护代码。 - Aaronaught

5

4

反射是不可抗拒的!:-)

我认为除了编写本地代码,您无法阻止反射。即使如此,它也可以被反汇编。如果您需要将某些代码保密,请将其放在您控制的服务器上,并允许远程访问。


2

我想知道您限制反射的场景是什么。您是否担心暴露在代码库中的某些超级机密数据?或者拥有一些非常聪明的代码块,以至于您可以从中获得优势?

我问这个问题的原因是,我不相信我们在软件开发方面所做的任何事情都是如此独特,以至于需要阻止人们查看它——所以我想知道您是否走了错误的路。由于您没有提到为什么要阻止反射,我不知道您的场景是否(至少从我的角度)有意义限制访问。

我无法想象一个真实的场景,其中限制访问权限会真正帮助您——现在,不是任何特定的代码块使系统变得出色,而是整体包装(用户体验、客户服务、快速演化与使用保持同步等)。如果您的代码足够好,它将随着时间的推移而发生变化,以便任何“破解”它的人都将落后于您当前的迭代(至少如此)。您的价值在于您的头脑,而不是汇编语言。

如果您出于安全原因这样做,那么您真的不应该尝试通过阻止反射来“保护”它。

再次强调,您可能有一个我没有想到的有效原因来阻止反射,但我很怀疑这是否值得努力,而且我倾向于相信您的精力在其他地方会更好地利用……例如,使您想要阻止的代码变得更好。


1
一个小偷肯定可以破解锁,但你仍然要锁门。不是吗? - viky
无论如何,我有一些特定的原因必须这样做,但好像没有其他的选择。 - viky
再次强调,不了解您的情况很难作出判断。但我仍然坚持我的观点:代码本身并没有真正的价值,真正的价值在于整个软件包及其随时间的推进方式。通常,最重要的是开发思路,99.99%的情况下,即使不查看代码,也可以轻松地进行反向工程分析。 - Kevin Won
3
一些开发者想要保护他们的辛勤劳动,以免别人轻而易举地拿走代码,改变其中的公司名称并花费极少的力气重新出售。这已经足够成为理由了。你不必为NSA工作才能让你的代码被认为有价值。仅仅因为保护这些代码很困难,并不意味着它不值得保护。 - user359926

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接