草庐IT

c# - 了解 dotPeek 反编译代码中编译器生成的类型

coder 2024-05-27 原文

嘿嘿。我正在阅读Digi Traffic Accelerator的反编译源码(我认为这是最好的学习方式),直到我得到了一些看不懂的代码!请看一下:

  internal class ProxyFarm
  {
    private static Random rand = new Random();
    private static Regex UserPassAtHostPort = new Regex("\r\n                ^\r\n                (?<user>[^:]+?) : (?<pass>[^@]+?)\r\n                @\r\n                (?<host>[^:]+? (?: : \\d+)? )\r\n                $", RegexOptions.IgnorePatternWhitespace);
    private static Regex HostPortUserPass = new Regex("\r\n                ^\r\n                (?<host>[^:]+? : \\d+) : (?<user>[^:]+?) : (?<pass>.+?)\r\n                $", RegexOptions.IgnorePatternWhitespace);
    public const string NEW = "new";
    public const string ACTIVE = "active";
    public const string BLOCKED_BY_GOOGLE = "blocked by Google";
    public const string INACTIVE = "inactive";
    public const string CHECKING = "Checking...";

    static ProxyFarm()
    {
    }

    public static StorageDataSet.ProxiesRow GetRandomProxy(bool WillUseRecaptcha = true)
    {
      // some normal code
    }

    public static WebProxy MakeWebProxy(StorageDataSet.ProxiesRow row)
    {
      // some normal code
    }

    public static void CheckProxy(StorageDataSet.ProxiesRow proxy)
    {
      // ISSUE: object of a compiler-generated type is created
      // ISSUE: variable of a compiler-generated type
      ProxyFarm.\u003C\u003Ec__DisplayClass5 cDisplayClass5 = new ProxyFarm.\u003C\u003Ec__DisplayClass5();
      // ISSUE: reference to a compiler-generated field
      cDisplayClass5.proxy = proxy;
      // ISSUE: reference to a compiler-generated field
      if (cDisplayClass5.proxy == null)
        return;
      // ISSUE: reference to a compiler-generated field
      cDisplayClass5.logger = LogManager.GetLogger("Program");
      // ISSUE: reference to a compiler-generated field
      // ISSUE: reference to a compiler-generated field
      cDisplayClass5.state = new ProxyFarm.CallbackState()
      {
        Proxy = cDisplayClass5.proxy,
        Google = ProxyFarm.CheckStatus.NotChecked,
        Post = ProxyFarm.CheckStatus.NotChecked
      };
      // ISSUE: reference to a compiler-generated field
      cDisplayClass5.r = (HttpWebRequest) WebRequest.Create("http://www.digitrafficgenerator.com/post_test.php");
      // ISSUE: reference to a compiler-generated field
      cDisplayClass5.r.Method = "POST";
      try
      {
        // ISSUE: reference to a compiler-generated field
        // ISSUE: reference to a compiler-generated field
        cDisplayClass5.r.Proxy = (IWebProxy) ProxyFarm.MakeWebProxy(cDisplayClass5.proxy);
      }
      catch (Exception ex)
      {
        // ISSUE: reference to a compiler-generated field
        // ISSUE: reference to a compiler-generated field
        cDisplayClass5.logger.Warn((object) ("Invalid proxy entered: " + cDisplayClass5.proxy.Address), ex);
        // ISSUE: reference to a compiler-generated field
        ProxyFarm.ChangeStatus(cDisplayClass5.proxy, "inactive");
        return;
      }
      // ISSUE: reference to a compiler-generated field
      cDisplayClass5.r.ConnectionGroupName = Guid.NewGuid().ToString();
      // ISSUE: reference to a compiler-generated field
      cDisplayClass5.byteArray = Encoding.UTF8.GetBytes("q=test");
      // ISSUE: reference to a compiler-generated field
      // ISSUE: reference to a compiler-generated field
      cDisplayClass5.r.ContentLength = (long) cDisplayClass5.byteArray.Length;
      // ISSUE: reference to a compiler-generated field
      cDisplayClass5.r.ContentType = "application/x-www-form-urlencoded";
      // ISSUE: reference to a compiler-generated field
      cDisplayClass5.r.Referer = "http://www.digitrafficgenerator.com/post_test.php";
      // ISSUE: reference to a compiler-generated field
      cDisplayClass5.r.Timeout = 20000;
      // ISSUE: reference to a compiler-generated field
      // ISSUE: reference to a compiler-generated method
      IAsyncResult res = cDisplayClass5.r.BeginGetRequestStream(new AsyncCallback(cDisplayClass5.\u003CCheckProxy\u003Eb__1), (object) null);
      // ISSUE: reference to a compiler-generated field
      WebObject.AbortRequestAfterTimeout(res, cDisplayClass5.r);
      try
      {
        // ISSUE: reference to a compiler-generated field
        // ISSUE: reference to a compiler-generated method
        // ISSUE: reference to a compiler-generated field
        res = cDisplayClass5.r.BeginGetResponse(new AsyncCallback(cDisplayClass5.\u003CCheckProxy\u003Eb__2), (object) cDisplayClass5.r);
      }
      catch (Exception ex)
      {
        // ISSUE: reference to a compiler-generated field
        // ISSUE: reference to a compiler-generated field
        cDisplayClass5.logger.Info((object) ("Got an exception using " + cDisplayClass5.proxy.Address), ex);
      }
      // ISSUE: reference to a compiler-generated field
      WebObject.AbortRequestAfterTimeout(res, cDisplayClass5.r);
      HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://www.google.com/recaptcha/api/js/recaptcha.js");
      request.Method = "GET";
      // ISSUE: reference to a compiler-generated field
      request.Proxy = (IWebProxy) ProxyFarm.MakeWebProxy(cDisplayClass5.proxy);
      request.Timeout = 20000;
      request.ConnectionGroupName = Guid.NewGuid().ToString();
      // ISSUE: reference to a compiler-generated method
      WebObject.AbortRequestAfterTimeout(request.BeginGetResponse(new AsyncCallback(cDisplayClass5.\u003CCheckProxy\u003Eb__3), (object) request), request);
    }

    protected static void ProxyChecked(IAsyncResult result, HttpWebRequest req, ProxyFarm.CallbackState state)
    {
      ILog logger = LogManager.GetLogger("Program");
      ProxyFarm.CheckStatus checkStatus = ProxyFarm.CheckStatus.NotOk;
      try
      {
        HttpWebResponse httpWebResponse = (HttpWebResponse) req.EndGetResponse(result);
        if (req.RequestUri == httpWebResponse.ResponseUri)
        {
          if (httpWebResponse.StatusCode == HttpStatusCode.OK)
            checkStatus = ProxyFarm.CheckStatus.Ok;
        }
      }
      catch (Exception ex)
      {
      }
      lock (state)
      {
        if (req.RequestUri.Authority.Contains("google.com"))
          state.Google = checkStatus;
        else
          state.Post = checkStatus;
        if (state.Post == ProxyFarm.CheckStatus.NotOk)
        {
          ProxyFarm.ChangeStatus(state.Proxy, "inactive");
          logger.Info((object) ("Marking " + state.Proxy.Address + " as inactive as it cannot POST"));
        }
        else if (state.Google == ProxyFarm.CheckStatus.NotOk)
        {
          ProxyFarm.ChangeStatus(state.Proxy, "inactive");
          logger.Info((object) ("Marking " + state.Proxy.Address + " as inactive as it is blocked by google"));
        }
        else
        {
          if (state.Google != ProxyFarm.CheckStatus.Ok || state.Post != ProxyFarm.CheckStatus.Ok)
            return;
          ProxyFarm.ChangeStatus(state.Proxy, "active");
        }
      }
    }

    public static void ReportBrokenProxy(StorageDataSet.ProxiesRow proxy, bool recaptcha_fail = false)
    {
      // some normal code
    }

    private static void ChangeStatus(StorageDataSet.ProxiesRow Proxy, string status)
    {
      // some normal code
    }

    public enum CheckStatus
    {
      NotChecked,
      Ok,
      NotOk,
    }

    protected class CallbackState
    {
      public StorageDataSet.ProxiesRow Proxy { get; set; }

      public ProxyFarm.CheckStatus Post { get; set; }

      public ProxyFarm.CheckStatus Google { get; set; }
    }
  }

如您所见,似乎在CheckProxy 方法中,编译器生成了一个新类型!你知道这个方法到底发生了什么吗?如何理解代码?

最佳答案

\u003C\u003E< 的 unicode 表示和 >分别。

这些字符在 IL 中是有效的..因此编译器将生成具有类似名称的变量以避免冲突。

您的反编译器只是不知道如何将其转换为 <>并且没有删除临时变量。

关于c# - 了解 dotPeek 反编译代码中编译器生成的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15915359/

有关c# - 了解 dotPeek 反编译代码中编译器生成的类型的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  5. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  6. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  7. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  8. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  9. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  10. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

随机推荐