1

伙计们。我正在为我所属的在线社区开发客户端软件。为了让我给它写一个客户端,所有者和网站管理员要求对我的代码进行加密(不仅仅是混淆)。我的大部分项目都是用 VB.NET (F3.5) 编写的,其中一些出于性能原因通过 C++/CLI 使用 SQLite 和 libcrypt(所以我不能使用 /clr:safe)。换句话说,如果要使用 /clr:safe ,编写 C++/CLI 代码将毫无意义(我只需在 VB 中编写所有代码,这要容易得多)。

如果这只是 VB 项目,我只需编写一个 C++ 加载程序,将代码从存储中解密到内存中,然后使用 Assembly.Load() 通过一些公共方法(例如,主窗体)使其运行。但是,一些莫名其妙的策略阻止我使用未经验证的 C++/CLI 代码来执行此操作。我不知所措,因为我可以使用正常的 DLL 加载机制不受限制地使用任何“不安全”的 DLL,但由于某种原因,我不能使用 Assembly.Load() 来做到这一点。我不明白为什么这应该更安全(鉴于其他选项可用)。Caspol.exe 没有帮助,即使有帮助,我也不能要求社区中的每个人都关闭他们机器的访问安全性。直接从内存加载 EXE 或 DLL 似乎不可行(UPX使用常规 DLL 执行此操作,但不使用 .

所以我问以下问题:

  • 你们能想到我可以用来加密 C++/CLI DLL 的 MISL 部分的任何方法吗?(我认为代码与常规 x86 机器代码混合在一起)。

  • 有什么方法可以从字节加载未经验证的 .NET DLL,就像我尝试使用 Assembly.Load 一样?

或者,由于 CreateProcess() 和 LoadLibrary() 只采用路径,我虽然可以编写一个临时 EXE 映像并从存储中运行它。但是我需要用户无法访问该图像,因此将其写入磁盘将是愚蠢的;它应该是易变的东西,例如私有 ramdisk 之类的东西。有什么想到的吗?(Windows 2000 及更高版本)。

非常感谢,

吉尔

4

2 回答 2

1

您可以使用AssemblyResolve方法从流中加载组件。有关详细信息,请参阅此答案

于 2009-12-24T18:42:06.040 回答
0

Assembly.Load(byte[] ...) 明确禁止无法验证的(混合模式)程序集。您可以在Microsoft Connect上查看问题。

于 2010-03-01T10:19:22.733 回答