多态引擎,用托管语言?

2024-02-06

我的编程技能已经发展到可以很好、轻松地完成大多数日常工作的程度,我想有一天,制作一个多态引擎将真正考验我的技能,我想知道是否有人对制作一个多态引擎有任何指导。程序的多态引擎,从哪里开始,也许一些代码示例?在这一点上真的任何事情都会有帮助:)

这是我的一些资源:

  • http://en.wikipedia.org/wiki/Polymorphic_code http://en.wikipedia.org/wiki/Polymorphic_code
  • http://en.wikipedia.org/wiki/Polymorphic_engine http://en.wikipedia.org/wiki/Polymorphic_engine

正如我在评论中提到的,在 .NET 中使用神奇的系统.反射.发射 http://msdn.microsoft.com/en-us/library/system.reflection.emit.aspx命名空间。您只需创建一个新的 DynamicMethod 并向其中发出任何[有效]操作码,然后调用 Invoke。

在过去的几个小时里,我试图为一个“干净”的程序构建一个简单的展示,该程序将使用加密的 il 代码创建自身的新副本。我采用的方法是使用 Exec 方法,获取 il 字节(使用MethodBase.GetMethodBody http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getmethodbody.aspx),对它们进行加密并发出一个具有 iv+key 和加密字节的新程序集。然后主方法将解密,创建一个新的 DynamicMethod,调用动态ILInfo.SetCode http://msdn.microsoft.com/en-us/library/system.reflection.emit.dynamicilinfo.setcode.aspx并希望能发挥作用。事实并非如此。

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

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

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

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

这些不同的标记值由编译器按顺序生成。这意味着不可能保证使用原始字节一切都能正常工作。想想常见的情况,编译器仅为解密字节数组所需的每个方法调用创建令牌,并且您在加密代码中调用 Console.WriteLine。没有写入这样的标记,并且在调用动态方法时最终会出现“BadImageFormatException:错误的二进制签名”。

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

如果您想摆脱发出操作码的所有麻烦,请从存储为字符串的代码(当然可以加密)进行一些动态编译。然而,这失去了聪明、冷静和其他一切可以用来衡量开发人员(你!)的纯粹魅力的东西。查看本教程 http://www.west-wind.com/presentations/dynamicCode/DynamicCode.htm用于快速显示字符串中 C# 的动态编译和执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多态引擎,用托管语言? 的相关文章

随机推荐