托管语言中的多态引擎?

我已经将我的编程技能发展到能够很好地完成大多数日常工作的程度,而且我想有一天,制作多态引擎会真正测试我的技能,我想知道是否有人有任何关于制作一个程序的多态引擎,从哪里开始,也许是一些代码示例? 真的,在这一点上任何事都会有所帮助:)

这是我的一些资源:

  • http://en.wikipedia.org/wiki/Polymorphic_code < – 这是我特别感兴趣的…
  • http://en.wikipedia.org/wiki/Polymorphic_engine

正如我在评论中提到的,这可以在.NET中使用神奇的System.Reflection.Emit命名空间。 您只需创建一个新的DynamicMethod并向其中发出任何[有效]操作码,然后调用Invoke。

我花了最后几个小时试图为一个“干净”的程序构建一个简单的展示,该程序将使用加密的il代码创建自己的新副本。 我采用的方法是使用Exec方法,获取il字节(使用MethodBase.GetMethodBody ),加密它们并发出具有iv +密钥和加密字节的新程序集。 然后主方法将解密,创建一个新的DynamicMethod,调用DynamicILInfo.SetCode并希望能够正常工作。 它没有。

加密/解密的东西工作,我发出的代码是正确的。 但是,您似乎无法从一个程序集中获取原始字节,而只是在另一个程序集中执行它们。

来自运行A的数据(来自BitConverter.ToString)并运行B.
答:28-01-00-00-0A ……
B:28-11-00-00-0A ……

除非您知道每个操作码的字节值,否则请打开ILDAsm,选择“视图”>“显示字节”。 还有一个View> Show令牌值,这也有助于调试。 按ctrl-m进入视图>元数据>显示! 解决令牌和其他神奇的生物。

“28 01 00 00 0A” – > CALL 0A000001 – > [根据ctrl-m] MethodBase.GetCurrentMethod

这些不同的标记值由编译器顺序生成。 这意味着不可能保证一切都可以使用原始字节。 试想一下编译器只为每个方法调用创建令牌需要解密字节数组的常见情况,并在加密代码中调用Console.WriteLine。 没有编写这样的标记,并且在调用动态方法时最终会出现“BadImageFormatException:Bad binary signature”。

我把它作为读取的任务(或者直到我再次无聊)将字节数组在发射过程中转换为解密器可以读取并发射到实际il字节的格式。 发射过程将创建所有必要的令牌,因此它应该工作。

如果你想从发出操作码的所有特性中挑选出来,可以从存储为字符串的代码中进行一些动态编译(当然可以加密)。 然而,这在聪明,冷静和其他一切都可以用来衡量开发者的纯粹真实性(你!)。 查看本教程 ,快速显示字符串中C#的动态编译和执行。

好吧,据我所知,多态引擎只是你想要加密的代码,然后将它与解密模块配对。 所以你需要做的就是将你的代码加密成一个字符串。 然后你写了一个decypter。 我会使用基本的对称加密类,如hxxp://www.obviex.com/samples/Code.aspx?Source = EncryptionCS&Title = Symmetric%20Key%20Encryption&Lang = C%23之后,在内存中运行代码,如hxxp ://support.microsoft.com/kb/304655

编辑:如果你想得到更多的深度,你可以随时编写自己的加密/解密,使其类似于base_64(无密钥),而不是AES(带密钥)

希望有所帮助,Max

在C#或托管语言中无法使用多态代码。 它要求您为特定平台(.NET不是特定于平台)生成汇编代码到缓冲区或数据区域,然后跳转到该缓冲区或数据区域。 有许多软件和硬件层可以阻止这种情况发生 – 例如,请参阅维基百科上的NX位。

您无法在托管代码中执行此操作。 你必须用非托管代码编写它并调用它。

希望有所帮助。


请参阅此答案的有用评论,因为您可以从托管代码动态创建托管代码; 我正在考虑非托管代码,就像整体上使用的一样。