2013-04-10 11 views
9

Hei. Czytałem dekompilowane źródło Digi Traffic Accelerator (uważam, że jest to najlepszy sposób na naukę), dopóki nie otrzymałem niezrozumiałego kodu! Proszę spojrzeć:Zrozumienie typu generowanego przez kompilator w kodzie dekompilowanym dotPeek

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

Jak widać, wydaje się w CheckProxy metody, kompilator wygenerowany nowy typ! Czy masz pojęcie, co tak naprawdę dzieje się w tej metodzie? Jak mogę zrozumieć kod?

+0

To jest defekt dekompilatora, zgłoś to. – usr

Odpowiedz

8

i \u003E są reprezentacjami w formacie Unicode odpowiednio < i >.

Te znaki są poprawne w IL .. więc kompilator wygeneruje zmienne o takich nazwach, aby uniknąć kolizji.

Twój dekompiler nie wiedział, jak przekonwertować go na <> i nie usunął zmiennych tymczasowych.

+0

Dzięki odpowiedzi. Rozumiem. Więc jeśli chcesz przepisać metodę 'CheckProxy', jak to zrobisz? Chodzi mi o to, dlaczego kompilator generuje klasę '<> __ DisplayClass5'? Jakie warunki sprawiają, że kompilator robi te rzeczy? –

+1

Kompilator zrobi to dla rzeczy takich jak zamknięcia, typy anonimowe lub gdy używasz obiektu za pomocą klauzuli "try..finally". Dokładna semantyka, której nie znam ... nie jest to jednak problem. –

3

Otwórz w dnSpy i rozejrzyj się za metodą, która pasuje (ish). Będą w innej kolejności, ale dnSpy wykonuje przyzwoitą pracę polegającą na dekompilowaniu lambd.

+0

Dziękuję za to, po prostu miałem o wiele lepsze wyniki w porównaniu do dotpeek – liammcdee

+2

Poszedłem za tą odpowiedzią i poszedłem i dostałem dnSpy, ale po wielu muckach próbowałem go zbudować, a następnie debugować (nie próbuj publikować!) wyniki końcowe nie były wyraźniejsze niż dotPeek –

Powiązane problemy