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?
Questa è una carenza di decompilatore, segnalarla. – usr