我已经将我的编程技能发展到能够很好地完成大多数日常工作的程度,而且我想有一天,制作多态引擎会真正测试我的技能,我想知道是否有人有任何关于制作一个程序的多态引擎,从哪里开始,也许是一些代码示例?真的什么都有帮助在这一点:)
这是我的一些资源:
正如我在评论中提到的,这可以在.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#的动态编译和执行.