2013-04-10 11 views
9

Hei. Anlaşılır olmayan bir kod elde edene kadar Digi Traffic Accelerator'un kaynak kodlarını okudum (öğrenmenin en iyi yolu olduğunu düşünüyorum)! Bir göz atın: Gördüğünüz gibiDotPeek decompiled kodunda derleyici tarafından oluşturulan türün anlaşılması

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; } 
    } 
    } 

, bu CheckProxy yöntemde görünüyor, derleyici yeni bir tür üretilen! Bu yöntemde gerçekten neler olduğu hakkında bir fikrin var mı? Kodu nasıl anlayabilirim?

+0

Bu bir decompiler eksikliğidir, bildirin. – usr

cevap

8

\u003C ve \u003E sırasıyla < ve > Unicode temsilleridir.

Bu karakterler IL'de geçerlidir. Bu nedenle derleyici, çarpışmaları önlemek için bu gibi adlarla değişkenler üretecektir.

Dönüştürücünüz, <> ürününe nasıl dönüştürüleceğini bilmiyordu ve geçici değişkenleri kaldırmadı.

+0

Cevabı sayesinde. Anlıyorum. Yani 'CheckProxy' yöntemini yeniden yazmak isterseniz, nasıl yapacaksınız? Demek istediğim, derleyici neden <> __ DisplayClass5' sınıfını oluşturur? Bu koşullar için hangi koşullar derleyiciyi yapar? –

+1

Derleyici, Kapanışlar, Anonim Tipler veya "try..finally" ifadesiyle bir nesne kullandığınızda bunu gerçekleştirir. Tam anlamıyla bilmediğim semantikler .. ancak bu gerçekten bir sorun değil. –

3

dnSpy'da açın ve (ish) ile eşleşen bir yönteme bakın. Onlar farklı bir düzende olacaklar ama dnSpy lambdaları derlemek için iyi bir iş yapıyor.

+0

Bunun için teşekkürler, sadece bu daha sonra daha iyi sonuçlar vardı dotpeek – liammcdee

+2

Ben bu yanıtı izledim ve gitti ve gitti dnSpy, ama sonra hata ayıklama (bu yayınlamayı denemeyin!) sonuçların hiçbiri dotPeek'ten daha net değildi –

İlgili konular