管理语言中的多态引擎?

时间:2010-07-06 02:56:02

标签: c#

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

以下是我的一些资源:

3 个答案:

答案 0 :(得分:5)

正如我在评论中提到的,这可以在.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>显示字节。还有一个视图>显示令牌值也有助于调试。按ctrl-m查看>元数据>节目!解决代币和其他神奇生物。

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

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

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

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

答案 1 :(得分:0)

好吧,据我所知,多态引擎只是你想要加密的代码,然后将它与解密模块配对。所以你需要做的就是将你的代码加密成一个字符串。然后你写了一个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(带密钥)

希望有所帮助, 最大

答案 2 :(得分:0)

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

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

希望有所帮助。


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