人肉反编译使用yield关键字的方法

我认为这是一个真命题:“没有用.NET Reflector反编译并阅读过代码的程序员不是专业的.NET程序 员”。.NET Reflector强大的地方就在于可以把IL代码反编译成可读性颇高的高级语言代码,并且能够支 持相当多的“模式”,根据这些模式它可以在一定程度上把某些语法糖给还原,甚至可以支持简单的 Lambda表达式和LINQ。只可惜,.NET Reflector还是无法做到极致,某些情况下生成的代码还是无法还原 到易于理解——yield关键字便是这样一个典型的情况。不过还行,对于不复杂的逻辑,我们可以通过人 肉来“整理”个大概。

简单yield方法编译结果分析

yeild的作用是简化枚举器,也就是IEnumerator<T>或IEnumerable<T>的实现。“人肉” 反编译的关键在于发现编译器的规律,因此我们先来观察编译器的处理结果。值得注意的是,我们这里所 谈的“分析”,都采用的是微软目前的C# 3.0编译器。从理论上来说,这些结果或是规律,都有可能无法 运用在Mono和微软之前或今后的C#编译器上。首先我们准备一段使用yield的代码:

static IEnumerator<int> GetSimpleEnumerator()
{
   Console.WriteLine("Creating Enumerator");

   yield return 0;
   yield return 1;
   yield return 2;

   Console.WriteLine("Enumerator Created");
}

为了简化问题,我们在这里采用IEnumerator<T>。自动生成的IEnumerable<T>和 IEnumerator<T>区别不大,您可以自己观察一下,有机会我会单独讨论和分析其中的区别。经过编 译之后再使用.NET Reflector进行反编译,得到的结果是:

private static IEnumerator<int> GetSimpleEnumerator()
{
   return new <GetSimpleEnumerator>d__0(0);
}

[CompilerGenerated]
private sealed class <GetSimpleEnumerator>d__0 : IEnumerator<int>,  ...
{
   // Fields
   private int <>1__state;
   private int <>2__current;

   // Methods
   [DebuggerHidden]
   public <GetSimpleEnumerator>d__0(int <>1__state)
   {
     this.<>1__state = <>1__state;
   }

   private bool MoveNext()
   {
     switch (this.<>1__state)
     {
       case 0:
         this.<>1__state = -1;
         Console.WriteLine("Creating Enumerator");
         this.<>2__current = 0;
         this.<>1__state = 1;
         return true;

       case 1:
         this.<>1__state = -1;
         this.<>2__current = 1;
         this.<>1__state = 2;
         return true;

       case 2:
         this.<>1__state = -1;
         this.<>2__current = 2;
         this.<>1__state = 3;
         return true;

       case 3:
         this.<>1__state = -1;
         Console.WriteLine("Enumerator Created");
         break;
     }

     return false;
   }

   ...
}

时间: 2024-09-15 10:10:20

人肉反编译使用yield关键字的方法的相关文章

如何在前端编码时实现人肉双向编译

如何在前端编码时实现人肉双向编译 React+flux是目前最火的前端解决方案之一,但flux槽点颇多,例如store比较混乱,使用比较繁琐等,于是出现了很多第三方的基于flux优化的架构. 有人统计了目前主流的flux实现方案,感兴趣的可以看这里:Which Flux implementation should I use? 其中redux是目前github上star最多的一个方案,该方案完全独立于react,意味着这套理念可以作为架构层应用于其他的组件化方案.同时官方也提供了react-re

ienumerator-如何查看C#代码的反编译代码

问题描述 如何查看C#代码的反编译代码 在详细了解 IEnumerable IEnumerator yield等相关的,很多文章提到查看反编译代码.请问是一定要通过第三方软件查看导出的.exe文件才能看到吗,我用的VS开发,在VS开发上是否可以直接查看的 解决方案 .net reflector或者ilspy,前者支持vs集成但是收费.新版本的可以反编译出yield return.linq lambda等. 解决方案二: 如果是exe文件是经过编译了的.只能通过相关软件进行反编译,vs只能打开相关

软件-现在的delphi xe7写的程序还能被反编译吗,望指教,谢谢。

问题描述 现在的delphi xe7写的程序还能被反编译吗,望指教,谢谢. 现在的delphi xe7写的程序还能被反编译吗,望指教,谢谢.希望能提供相关的软件和说明,刚刚开始学逆向工程. 解决方案 只要代码能执行,就存在破解的可能性.将你的程序放在服务器上,可以保护你的一些核心算法(如果服务器不被攻击),但是对于保护软件也许是不够的.因为非法用户同样可以伪造成合法用户访问你的服务器.当然,有破解的难易之分,使用加密狗.对程序进行加密等等,对用户身份通过信用卡或者手机号验证,可以加大破解的成本.

Android反编译看看手Q口令红包的实现原理_Android

首篇作为开始,先讲讲简单的反编译.反编译通常有几种目的:互相学习.借来用用.嘿嘿(干你,又分为小干干类似微信红包,和大干干改别人的apk帮他上架). 因为没带kvm回来,mbpr屏幕太小,所以下文环境为windows. 一.反编译 让我们从实战开始,先实践一下怎么去反编译一个apk,看看某些功能的实现.毕竟没有实践的原理都是耍流氓. 这里我们保留互相学习的心态,所以是友善的第一种目的,嘻嘻. 1.准备 工具 Apktool jadx(新一代反编译大杀器) 安装包 手机QQ 6.2.3 (目标就设

反编译-有没有篡改exe dll的方法?

问题描述 有没有篡改exe dll的方法? 我想改编一个exe(C#),我试着反编译了它和他所有的dll, 然后发现程序里有奇怪的引用,让我无法启动项目. 我自己的目的就是改编这个exe不超10行的代码,有没有比反编译更奏效的改编方法? 解决方案 修改 EXE 中资源比较简单,但想改功能代码基本上是不可能的. 除非你全部反成汇编,或者使用 C# 专用反编译工具. 解决方案二: 如果没加壳并混淆的话,改个资源,加上一些简单功能跳转,还是很容易实现的.否则就比较麻烦了.你可以去看雪论坛问问 解决方案

如何保护Java程序 防止Java反编译

Java是一种跨平台的.解释型语言.Java 源代码编译中间"字节码"存储于class文件中.Class文件是一种字节码形式的中间代码,该字节码中包括了很多源代码的信息,例如变量名.方法名等.因此,Java中间代码的反编译就变得非常容易.目前市场上有许多免费的.商用的反编译软件,都能够生成高质量的反编译后的源代码.所以,对开发人员来说,如何保护Java程序就变成了一个非常重要的挑战.本文首先讨论了保护Java程序的基本方法,然后对代码混淆问题进行深入研究,最后结合一个实际的应用程序,分

大家来讨论一下如何防止编译后的dll文件被反编译~~~~~

问题描述 最近在开发网站的时候因为有些加了限制但还不想被反编译,不知道用什么方法好,请大家讨论一下我使用了一下dotfuscator工具,但是老出错误,我的操作如下选择目录bin/*.dll全选生成模糊dll然后再使用ie浏览页面的时候忽然提示找不到App_Web_index.aspx.28963a75.dll比较郁闷 解决方案 解决方案二:请问有没有什么更高效更好用的防止反编译的方法呢解决方案三:.NET时代代码还有什么好保密的呢,大家都是用那个类库解决方案四: 解决方案五:不让别人看懂道可以

Android反编译看看手Q口令红包的实现原理

首篇作为开始,先讲讲简单的反编译.反编译通常有几种目的:互相学习.借来用用.嘿嘿(干你,又分为小干干类似微信红包,和大干干改别人的apk帮他上架). 因为没带kvm回来,mbpr屏幕太小,所以下文环境为windows. 一.反编译 让我们从实战开始,先实践一下怎么去反编译一个apk,看看某些功能的实现.毕竟没有实践的原理都是耍流氓. 这里我们保留互相学习的心态,所以是友善的第一种目的,嘻嘻. 1.准备 工具 Apktool jadx(新一代反编译大杀器) 安装包 手机QQ 6.2.3 (目标就设

RMB找人反编译C#的程序(好象是MaxtoCode加密的)

问题描述 RMB找人反编译C#的程序(好象是MaxtoCode加密的)有会的加QQ:440682410 解决方案 解决方案二:加密的....解决方案三:解密工具都出来了.在百度找一下.解决方案四:有很多解密工具的你可以找找