Декомпиляция-компиляция проекта .NET

Discussion in 'Реверсинг' started by Buran, 18 Sep 2014.

  1. Buran

    Buran Elder - Старейшина

    Joined:
    25 Feb 2011
    Messages:
    1,239
    Likes Received:
    7,397
    Reputations:
    112
    Давненько я не занимался реверсингом, нужен совет специалиста по новой (для меня) технологии .NET Framework 4.0-4.5. Расшифровал тут одну понравившуюся мне прогу с dll-ками, Reflector-ом сохранил исходники, всё видно, С#. Загружаю их в Visual Studio 2013 и при запуске тестов получаю кучу ошибок - 1736 штук. Типа:
    Code:
    Ошибка	14	Пространство имен не может непосредственно содержать такие члены, как поля или методы	D:\Test\dummy\{ffe53d4c-2a9e-4d38-a994-adaf92889f28}.cs	6	5
    Ошибка	10	Недопустимая лексема "-" в объявлении класса, структуры или интерфейса	D:\Test\dummy\{ffe53d4c-2a9e-4d38-a994-adaf92889f28}.cs	5	29
    Ошибка	2	Недопустимая лексема "02077513" в объявлении класса, структуры или интерфейса	D:\Test\dummy\{02077513-8bce-4a86-b2b9-3605e2025eae}.cs	5	21
    
    Code:
    namespace dummy
    {
        using System;
    
        internal class {02077513-8bce-4a86-b2b9-3605e2025eae}
        {
        }
    }
    Code:
    namespace dummy_ptr
    {
        using System;
    
        internal abstract class {7f27317a-bf0d-41a5-a124-2fd56e9737b9}
        {
            public static byte f000001;
            public static byte f000002;
        }
    }
    Это нормально? Ведь, в принципе, через ILDASM всё, что было нужно, подправилось и собралось ILASM-ом в рабочий файл. Или я сильно губу раскатал, намереваясь всё переписАть по-своему? Что посоветуете?
     
  2. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Смотришь код через рефлектор, потом правишь через ildasm/ilasm.
     
  3. Buran

    Buran Elder - Старейшина

    Joined:
    25 Feb 2011
    Messages:
    1,239
    Likes Received:
    7,397
    Reputations:
    112
    Тяжко править в MSIL. На С# или в Reflector-е было бы удобнее...
     
  4. becensed

    becensed Member

    Joined:
    2 Dec 2009
    Messages:
    84
    Likes Received:
    24
    Reputations:
    1
    Это по началу тяжко. А потом привыкаешь:) Кстати в том же рефлекторе есть плагин, для правки кода.
     
    2 people like this.
  5. Buran

    Buran Elder - Старейшина

    Joined:
    25 Feb 2011
    Messages:
    1,239
    Likes Received:
    7,397
    Reputations:
    112
    А вот за эту умную мысль - спасибо! Поищу. А то уже 6 часов правлю 6 строк кода в IL... Начал уставать... :)
     
  6. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Выложи сюда. Интересно посмотреть, что это за сверхсложный код.
     
  7. Buran

    Buran Elder - Старейшина

    Joined:
    25 Feb 2011
    Messages:
    1,239
    Likes Received:
    7,397
    Reputations:
    112
    Это не код сложный, это я тупой! :) Говорю же, что первый раз в MSIL-е колупаюсь. Понимаю, что править в MSIL-е - лучший вариант, но пока он мне недоступен. Повторю вопрос: это нормально, когда исходник, сохранённый из Reflector-а не компилится в VS? Реально как-то поправить?
     
  8. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Это нормально для любого декомпилятора.
    Реально. Но проще MSIL с нуля выучить, чем это сделать.
     
  9. Buran

    Buran Elder - Старейшина

    Joined:
    25 Feb 2011
    Messages:
    1,239
    Likes Received:
    7,397
    Reputations:
    112
    Разбираюсь с MSIL. Код подправил, осталась одна, последняя проблема - как распределить адресацию?

    P.S. Отвечу сам: полной заменой кода метода, кодом этого же метода, полученного после компиляции. Это проще, чем вручную 500 строк с опкодами адреса пересчитывать-выравнивать. Комп железный - пусть сам работает.
     
    #9 Buran, 19 Sep 2014
    Last edited: 21 Sep 2014
  10. Buran

    Buran Elder - Старейшина

    Joined:
    25 Feb 2011
    Messages:
    1,239
    Likes Received:
    7,397
    Reputations:
    112
    Result := true;

    Всё получилось, всем спасибо!
    Если интересно: теперь проект открывается в VS 2013, все ошибки компиляции устранены. Собирается рабочий(!) exe-шник. Остались только косяки с ресурсами - иконки там, картинки... это я потом поправлю. Зато в самой проге нашел пару багов от разработчиков, надо самому теперь исправлять.
    Может кому пригодится алгоритм распаковки (для .NET Confuser v1.9):
    1. NoFuser v1.1
    2. de4dot v.3.1.41592
    3. (UniversalFixer v1.0.4257.32113 - мне не понадобился)
    4. ILSpy v2.2.0.1706 - в режиме C# - Save Code
    5. исходники получены!

      Дальше можно поизвращаться интереснее (для гурманов):
    6. IL DASM v4.0.30319.33440 - экспорт exe-шника, полученного после 3-го пункта, в .IL (в Израиль :D ) - или через ILSpy - в режиме IL - Save Code (этот файл нам пригодится в дальнейшем как file1.il )
    7. правка ошибок компиляции в Visual Studio.
    8. Правка чего угодно в коде.
    9. компиляция в exe
    10. IL DASM v4.0.30319.33440 - экспорт в .IL -> file2.il
    11. открываем Akelpad-ом (что было под руками) или ILSpy в режиме IL, оба файла. Копируем полностью (от начала - до конца!) методы, в которых мы что-то меняли в коде(file2.il), вставляем их на СВОЁ место в file1.il, полученный в пункте 6, затем сохраняем этот file1.il
    12. ILASM.exe /RESOURCE=file1.res file1.il /OPTIMIZE
    В итоге файл file.exe стал меньше, оптимизирован (убраны nop-ы куда попало понатыканные(!) для выравнивания M$ VS - must die!), и даже все ресурсы как и были, расставлены по местам! Ляпота! :)

    P.S. Все операции c IL-файлами производим в отдельном от C#-файлов каталоге (папке), чтобы не было наложений и непоняток. Моск включать обязательно!
    Что любопытно, новый .NET Reflector v8.3.3.115 с исходниками (в том числе в IL) косячит больше, чем ILSpy. Вот так-то...
     
    #10 Buran, 21 Sep 2014
    Last edited: 21 Sep 2014
    marynli, becensed and M_script like this.