2013-04-10 21 views
9

Hei. Stavo leggendo la fonte decompilata di Digi Traffic Accelerator (penso che sia il modo migliore per imparare), finché non ho ottenuto un codice non comprensibile! Si prega di dare un'occhiata:Comprensione del tipo generato dal compilatore in dotPeek del codice decompilato

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

Come si può vedere, sembra in CheckProxy metodo, il compilatore ha generato un nuovo tipo! Hai idea di cosa stia realmente succedendo in questo metodo? Come posso capire il codice?

+0

Questa è una carenza di decompilatore, segnalarla. – usr

risposta

8

\u003C e \u003E sono le rappresentazioni unicode di < e > rispettivamente.

Questi caratteri sono validi in IL .. quindi il compilatore genererà variabili con nomi simili per evitare collisioni.

Il tuo decompilatore non sapeva come convertirlo in <> e non ha rimosso le variabili temporanee.

+0

Grazie per la risposta. Capisco. Quindi, se vuoi riscrivere il metodo 'CheckProxy', come farai? Voglio dire, perché il compilatore genera la classe '<> __ DisplayClass5'? Quali condizioni rendono il compilatore fare questo materiale? –

+1

Il compilatore lo farà per cose come Closures, Anonymous Types, o quando si sta usando un oggetto attraverso una clausola 'try..finally'. La semantica esatta con cui non ho familiarità ... tuttavia non è davvero un problema. –

3

Aprilo in dnSpy e cerca un metodo che corrisponda (ish). Saranno in un ordine diverso ma dnSpy fa un lavoro decente di decompilazione lambda.

+0

Grazie a questo, ho ottenuto risultati molto migliori rispetto a dotpeek – liammcdee

+2

Ho seguito questa risposta e sono andato a prendere dnSpy, ma dopo aver passato molto tempo a cercare di farlo compilare quindi il debug (non provare a pubblicarlo!) i risultati finali non erano più chiari di dotPeek –