Отражатель: Означает ли комментарий в этом коде, что все это запутано?

Поэтому в приведенном ниже коде вы заметите комментарий "// Этот элемент запутан и не может быть переведен".

Мне интересно, означает ли это, что вместо некоторого запутанного кода есть комментарий, а то, что следует, на самом деле не запутывается, или это означает, что "следующий код запутан"?

Из того, что я могу найти в Интернете, это звучит как первое, но я не уверен. Код явно выглядит запутанным, но он не непередаваемый, просто смешной.

public static NameValueCollection ParseStringIntoNameValueCollection(string responseString, bool undoCallbackEscapes)
{
    // This item is obfuscated and can not be translated.
    NameValueCollection values;
    string[] strArray;
    int num;
    string str2;
    string str3;
    int num3;
    goto Label_0027;
Label_0002:
switch (num3)
{
    case 0:
        if (!undoCallbackEscapes)
        {
            goto Label_0057;
        }
        num3 = 4;
        goto Label_0002;

    case 1:
        goto Label_00E5;

    case 2:
        if (num < strArray.Length)
        {
            string str = strArray[num];
            int index = str.IndexOf('=');
            str2 = str.Substring(0, index);
            str3 = str.Substring(index + 1);
            num3 = 0;
        }
        else
        {
            num3 = 6;
        }
        goto Label_0002;

    case 3:
        if (7 < (7 - 5))
        {
            goto Label_0071;
        }
        goto Label_00E5;

    case 4:
        str2 = unEscapeCallbacks(str2);
        str3 = unEscapeCallbacks(str3);
        num3 = 5;
        goto Label_0002;

    case 5:
        goto Label_0057;

    case 6:
        return values;
}
Label_0027:
    values = new NameValueCollection();
    strArray = responseString.Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries);
    num = 0;
    num3 = 1;
    goto Label_0002;
Label_0057:
    values.Add(str2, str3);
    num++;
    num3 = 3;
    goto Label_0002;
Label_00E5:
    num3 = 2;
    goto Label_0002;
}

Обновление: я нашел это... "Иногда, не слишком часто, когда Reflector разбирает исходный код для вас, он будет показывать" Этот элемент запутан и не может быть переведен "вместо кода".

Что для меня означает, что это скрывает замаскированный код комментарием. Кто-нибудь может это проверить? Я посмотрел на IL, и кажется, что он показывает все, поэтому, возможно, это утверждение не является точным.

Для меня этот код выглядит так, как будто он был запутан 5-летним со знанием BASIC, а не каким-то программным обеспечением для запутывания.

2 ответа

Решение

Независимо от того, насколько он запутан, вы всегда должны иметь возможность декомпилировать в IL, так что вы можете посмотреть на это и посмотреть, действительно ли рефлектор показывает вам все.

Кажется, это выглядит запутанным в том смысле, что это строковая функция, которая разбивает строку на основе амперсанда и проходит через switch/case определить, как справиться с этим. Использование goto это чисто (на первый взгляд) запутанным читателям кода в несколько плохой манере...

Конечно, вы можете загрузить любой.NET EXE/DLL с помощью рефлектора Redgate (ранее Reflector Rutz Loeder) для анализа и выгрузки кода, поэтому независимо от того, насколько он "запутан", обфускация на самом деле не служит цели, так как код может быть декомпилирован довольно без труда.

Нет реального способа защиты.NET EXE/DLL, если он не зашифрован и не использует неуправляемый код C/C++ для загрузки среды выполнения.NET, расшифровки.NET EXE и загрузки в новый домен приложения...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

Другие вопросы по тегам