1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Ответвление dosbox...

Тема в разделе "Мастерская", создана пользователем Tarmik, 13 окт 2014.

  1. Tarmik

    Tarmik

    Регистрация:
    23 авг 2014
    Сообщения:
    38
    Не знал, надо будет посмотреть.
    Но я хочу перекомпилировать всю игру на новые ос:ки.
    Без vm или эмуляции.
     
  2. Grue13 вице-дегенералиссимус

    Grue13

    Регистрация:
    26 апр 2006
    Сообщения:
    10.111
    Там уже VM. В оригинальной игре.
     
  3. Tarmik

    Tarmik

    Регистрация:
    23 авг 2014
    Сообщения:
    38
    Скриптовый язык ?
     
  4. Grue13 вице-дегенералиссимус

    Grue13

    Регистрация:
    26 апр 2006
    Сообщения:
    10.111
  5. Tarmik

    Tarmik

    Регистрация:
    23 авг 2014
    Сообщения:
    38
    ок, но это не единственная игра которую я хочу поковырять.
    Интересно будет добраться и до их скриптов тоже...
     
  6. Cerberus

    Cerberus

    Регистрация:
    9 июл 2007
    Сообщения:
    1.321
    Tarmik, я правильно понимаю, что на самом деле основная цель - не добиться какого-то конкретного результата, а посмотреть на собственном опыте, как это делается?
     
  7. Tarmik

    Tarmik

    Регистрация:
    23 авг 2014
    Сообщения:
    38
    Результаты зависят от свободного времени, желания и получится ли вообще. Да и даже если получится - зависит от уровня генерируемого кода. На ассемблер думаю желающих программировать нет.
     
  8. sev_

    sev_

    Регистрация:
    5 июл 2007
    Сообщения:
    131
    Похоже, что таки придётся покапитанить.

    Tarmik, вы в курсе, что 12 лет назад был создан проект с точно такими же целями — реверсить игры. Это ScummVM, и на сегодняшний день уже поддерживается почти 400 игр. Хотите поучаствовать — добро пожаловать, все материалы доступны на Вики проекта.

    Игры, которые вы упоминаете в ветке, уже давно отревершены полностью, и даже введены усовершенствования, к примеру, починены баги.

    Прямо сейчас мне нужна помощь для игр, выпущенных Никитой и Pipe Studio. Движок уже отревершен, но для каждой игры там логика хардкодом, так что работы полно — от простой к самой сложной.
     
    grinder, Butz и Bato-San нравится это.
  9. Tarmik

    Tarmik

    Регистрация:
    23 авг 2014
    Сообщения:
    38
    Я полагаю что Scumm vm - это аналог dosbox и дисассемблирование игры не глубокое - просто эмуляция. (Я так понял по описанию scummvm, a также из этого линка: http://wiki.scummvm.org/index.php/HOWTO-Reverse_Engineering ) Я хочу более глубокий reverse engineering. ( Читабельный C/C++ код )

    Я кстати пытался связаться с разработчиками scummvm, но безрезультатно - можно будет початиться напрямую о dott.

    Возможно смогу помочь / присоединится к вашей разработке, но тоже надо початится об этом - где, чем и как могу помочь.
     
  10. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.247
    Tarmik, исходники ScummVM открыты, там вполне себе читабельный С/С++ код, смотри, разбирайся, всё есть.
     
  11. Tarmik

    Tarmik

    Регистрация:
    23 авг 2014
    Сообщения:
    38
    Кстати, посмотрел наконец то scummvm исходники, это действительно reverse engineerеные игры - т.е. сделаны исходники из бинарного кода. Лицензия как всегда GPL, т.е. можно посмотреть и сделать так же свой вариант. (VM в данном случае плохой термин для scumm - не знаю зачем его туда втиснули)

    Плохо в таком подходе то что если есть баг - как с подрузкой dott фонта, то надо разбораться в их коде - т.е. reverse engeneeriить scummvm.
    Уровень поддержки - scummvm - порядка 300 - 400, то dosbox тянет на 3000 - т.е. раз в 10 больше.

    Хмм... Но по крайней мере посмотрю может найду offsetы звуков в dott по их исходникам.

    Разбираться с багами scummvm как то не очень охото, но посмотрим ещё...
    Попробовал взять их исходники, нужен по крайней мере nasm для компиляции - может ещё что всплывет - какие библиотеки...

    Мой dosbox удобен тем что взял все и скомпилировал и не надо колдовать с библиотеками.
     
  12. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.247
    Tarmik, по шрифтам это не баг, просто ты используешь неподдерживаемую версию DOTT (русскую).
     
  13. jodesaceg

    jodesaceg

    Регистрация:
    4 ноя 2014
    Сообщения:
    28
    Хорошая идея.

    Все на автора накинулись, а зря. Возраст и максимализм видны невооруженным взглядом, но давайте не будем переходить на личности и обсуждать людей, как это делают дворовые бабки. Идеи мне понравились.

    Мне тоже переодически хочется волшебный отладчик, нажал пару кнопок, и тоже все сразу стало понятно, как игра работает, где какой код за что отвечает, какие структуры данных, как их распаковать/использовать и все такое. В принципе, это даже реализуемо.

    Классическая задача: воткнуть свои шрифты. Вроде бы что может быть проще, даже если латиницу убрать и сохранить все оффсеты? А где-то картинка шрифта запакована, а даже если и нет, то чексумма стоит. И ты пытаешься патчить, только 1 байт исправил, и все идет прахом. Что делать? Сдаваться? |-|EpEBOD|/|Tb KaK yme|-o?

    Для начала можно было бы добавить в отладчик поиск битмапов, которые рисуются куда-то в бекбуфера, как это сделано в некоторых других эмуляторах. Как картинки с палитрами, так и 1-битовые с различным порядком бит, RGB16/24/32 и может что-то еще.

    [​IMG]

    Нашли картинку - дальше можно поставить брейк на память куда рисовали. В принципе, это можно сделать в досбоксе прямо сейчас, только неудобно. А вот наблюдать при пошаговом выполнении, где и как отрисовываются пиксели - было бы полезно. Дальше составить карту EIP-регистра, красиво рисовать график изменения (истории), было бы видно все функции и циклы. Пока же можно писать только лог процессора, у меня это почему-то выходит криво. Если к каждому значению памяти хранить еще EIP значение инструкции, из которого оно было изменено, можно быстро найти откуда берутся данные, построить цепочку до данных в памяти, а оттуда до распаковщика и загрузчика. Даже бряки ставить не надо. Местами это даже реализовано, но вот для ковыряния игрушек (и вообще софта x86) я таких удобных инструментов не знаю. Может подскажете? А если такого нету, то пусть наш герой что-то такое и реализует.


    >Например в Dott file offsetы encyprtятся - как их разкопать.
    Ничего не скажу за конкретно Dott, но иногда это просто более эффективное кодирование. Например, если у тебя файл не более 32кб и ты точно знаешь это, то грех в верхний бит не вставить какой-нибудь флажок. Или как вариант, xor linked list, всем хорошо известная структура данных. Поэтому это не обязательно обфускация/шифрование.


    >затем дисассемблируешь ту функцию что читает файл и заменяешь его на нативный код - т.е. изменение dosbox:a - он будет в себя перебирать запчасти Dott
    Лучше сделай механизм эвентов/хуков, а процессы можно далее разделить даже. К примеру, параллельно стартуешь еще один дочерний процесс с игровой логикой (точнее, дополнениями этой логики, которую хочешь переопределить), с которым общаешься через сокет, отсылаешь туда события о эвентах вида "хотим прочитать звук выстрела" или даже "проиграть звук выстрела", а логическая часть разбирается что с этим сделать. Например, играет звуки, закодированные в FLAC. С тебя протокол взаимодействия и описания интерфейсов (почистить стек, записать результат в регистры), ну и реализация этого в досбоксе/клиентской части.

    >заменен на MIT лицензированный код
    Если это не самоцель, то вопрос лицензирования лучше вообще не поднимать. Как говорят: "Вам шашечки, или ехать?"

    >mov ax, bx
    >=>
    >rax = rbx;
    Тоже хотел такую штуку, когда не имел понятия о ассемблере.
    А как мусье будет разруливать rax/eax/ax/ah/al? А флажки? А стек? А сегменты, прости госспаде?

    >Уже заметил что dosbox поддерживает эмуляцию fat и iso, думаю они не нужны, уберу их совсем
    А дискеты у нас в какой файловой системе будут?

    >Кстати, было бы неплохо если бы код компилировался на лету без перезапуска dosbox
    Для этого и сделай отдельный клиентский процесс, можешь хоть обперекомпилироваться в рантайме, потом просто перезапустить и послать нужный стейт+команды. Можно конечно изобрести свой линкер (и компилятор до кучи), но боюсь твоего запала не хватит.

    >уровень подхода какой то дошкольный, по принципу "своё строить не умею, поэтому буду ломать чужое"
    Нормальный подход: посмотреть, как это сделали другие, сделать самому еще лучше.

    >Запасаюсь попкорном в ожидании новых статей о перехвате "функций дос из досбокс"
    А я бы почитал. Если нету, то напишите сами. Если творческий кризис, то так и скажите, может я напишу.

    >Пользовательские фанатские неофициальные игры на основе DOTT уже существуют - Road и Open Quest
    >Open Quest
    Разве это не технодемка скумм-компилятора?

    >вы в курсе, что 12 лет назад был создан проект с точно такими же целями — реверсить игры. Это ScummVM
    Вообще-то, авторы хотели написать свою игорю. Но решили поискать, как это сделано у других. Я вот тоже все не решу как делать свою игрушку, хотя исходники scummvm читал.
     
    Последнее редактирование модератором: 19 июл 2015
    Чёрный Думер нравится это.
  14. Quester

    Quester

    Legacy

    Регистрация:
    25 сен 2003
    Сообщения:
    714
    SAS нравится это.
  15. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
  16. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    BolgenDosBox. Мне вот интересно, зачем надо было херить кроссплатформенность? Зачем вводить зависимость от CString?
    На данный момент, судя по коммитам, не сделано вообще ничего полезного зато повырезаны копирайты из исходников. Кто тебе дал право это делать, друг? Это не твоя программа.
    Экспериментируешь - экспериментируй локально. Зачем публиковать это?
     
    Alex Kagansky, Ulysses и Bato-San нравится это.
  17. jodesaceg

    jodesaceg

    Регистрация:
    4 ноя 2014
    Сообщения:
    28
    Bato-San, не хочу никого обижать, но я быстро пробежался по ссылкам и не увидел ничего полезного. Прошу извинить и поправить, если я составил неправильное мнение о программах
    1. UTT - не совсем понимаю нужность данной программы, так как распаковать графику/звук/анимацию проще в PNG/WAV/AVI, а дальше работать уже имеющимися средствами. Декодеры все равно писать самому, как и енкодеры (а это самое сложное, ведь почти в каждой игре свой велосипед, часто недокументированный, который не знаешь как загрузить). Сильно помогает ImageMagick, который умеет читать равки сам, как и делать дизеринг и кучу всего полезного. Конечно, возможно редактировать шрифты в гимпе не самое лучшее решение, но инструментов там побольше, да и работать можно в RGB24, что позволит потом или палитру пропатчить, или сделать более оптимальный дизеринг, нежели в ручном режиме. В случае чего пишется простая утилька для нарезки глифов за полчаса и упаковки в нужный формат.
    2. DOSBoxDH - ну фактически это просто копипастилка текста (которая еще и буфер обмена портит), анализа кода/выполнения там нет, полезного разве что поиск оффсетов. Вот было бы версионирование всей памяти, чтобы по снапшотам пробежать и посмотреть что и чем менялось - было бы весело.
     
  18. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    jodesaceg, это ровно то, что ты сам привёл в своём посте, как желательное. Я привёл пример реализации - тебе не нравится. Притом ты сам же и чётко описал почему это вообще не нужно конкретно в отладчике и конкретно в таком виде:
    Tак чего высказывать пожелания суть которых в том, что они реализуются много лучше внешними программами, а поиск всего хозяйства в коде делается "на раз" и без них, если человек вообще способен пользовать отладчик по прямому назначению.


    как это ни странно но данная возможность тоже прекрасно реализуется без досбокса.
     
  19. jodesaceg

    jodesaceg

    Регистрация:
    4 ноя 2014
    Сообщения:
    28
    Bato-San, в отладчике это как раз нужно: найдя место формирования картинки в памяти, можно наблюдать за прорисовкой по шагам. Это не статические ресурсы, которые можно выдрать из файла, это то, что происходит в рантайме. К примеру, на очередном шаге отработал mov - перекрасился пиксель. Смотрим, что там было рядом, перед формированием этого пикселя, откуда данные в регистрах и вообще где мы. Если мы копипастим, например, байты из RAW, а в ресурсах этого нигде нет, то BPM на это место и смотрим кто и как его заполнил, тут где-то будет лоадер. Это просмотр и наблюдение, как работает программа. Это в свою очередь и нужно для написания декодера/енкодера. Рисовать шрифты прямо в отладчике я не предлагаю, для этого есть гимп/фотошоп и куча специализированного софта, там же накладываются тени/градиенты/окантовки, все это дизерится и выплевывается готовое на выводе. Я же говорил о простом окошке, где смотреть битмапы в разных форматах, обновляемое в реалтайме, шаг за шагом. Вы знаете такую внешнюю программу?

    >как это ни странно но данная возможность тоже прекрасно реализуется без досбокса.
    Я конечно могу вообразить пару способов, вроде скриптования и самодельных внешних отладчиков, но это слишком трансректально, потому прошу поделиться красивым и простым способом. Вот у нас есть какой-то код и он нарисовал что-то (по известному адресу, а для этого окошко и надо). За момент рисования я хочу увидеть 1000 снапшотов, чтобы по шагам посмотреть где и кто. Как это осуществить? Что-то вроде лога CPU и вот такого графа: http://rghost.net/58903103/image.png, только бы с актуальными снапшотами памяти, чтобы еще и dataflow был виден.
     
  20. Tarmik

    Tarmik

    Регистрация:
    23 авг 2014
    Сообщения:
    38
    Я пока что работаю чисто в windows, и другие платформы вообще не актуальны нигде по соседству. Когда будут актуальны, буду поддерживать.

    Самый простой пример линкуксовской файловой системы - все case sensitive. Т.е. New folder versus new folder - не одно и то же. Когда они начнут работать на пользователя, тогда и поговорим.

    Кстати - почему бы в линукс или мак не написать аналогичный CString - слабо ?
    Будет тоже кросс платформенный код. :rolleyes:
    С моей точки CString это lead implementation с C++ стринга, пока что лучше не придумали. Остальные оски могут брать пример с CStringа. :)
    (Ну может и придумали, но это надо будет ещё посмотреть и оценить)

    Насчет не сделано ничего полезного - ты прав. Но GPL лиценция диктует то что я ничего полезного с ним не буду делать кроме как обрезания и уничтожения.
    :rolleyes:

    По поводу публикации - пока просто как проэкт легко компилируемый в windows:е без нужды поиска всех запчастей библиотек. Что с ним будет потом - посмотрим.

    Пока что особо времени не было углублятся... посмотрю на этих выходных что нибуть.

    ---------- Сообщение добавлено в 14:22 ---------- Предыдущее сообщение размещено в 13:58 ----------

    Вообще я не собирался офишировать свой досбокс, но Dimouse предложил.
    Не думал что такое количество сообщений посыплется обратно. :rolleyes:

    Но я как смотрю полезной информации я тут подцепил - наподобии scummvm, и wongовского dosbox:a.

    Наконец то дельные комментарии. Я уже сам думал на эту тему. Тоже была идея раздвоить процесс - что бы можно было сравнивать эмулирующий код с нативным. Но тут такая фишка что они вряд ли будут 100 % идентичны - хотя бы из-за скорости процессоров и timerов которые будут запускаться когда смогут.
    Т.е. много работы, а результата мало.
    Или у тебя ещё какие идеи были зачем раздваивать процесс ?

    Ага, я уже это на 4 или 5ом проэкте испытываю - никто ещё лицензию заменить не согласился. Но одно дело когда это 3д движок наподобии Blenderа, а другое когда это старенький никому не нужный dosbox. :rolleyes:

    Что то подобное делает IDA - она генерирует код. Ну несовсем такой как я тут написал, но стиль такой же. Если хочешь быстренько сгенерировать работающий код без детального анализа код - то простой перевод в asm to C вполне подойдет для начала.

    Я кстати уже подумал что как то я слишком быстро убрал это... отконопатил 2 исходника, а осталось ещё 300. Не имеет смысла наверное убирать функциональность пока свой функциональности нету.

    на C# это кстати очень лаконично пишется:
    Код:
    //#define NODEBUGTRACE
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.CSharp;
    using System.CodeDom.Compiler;
    using System.IO;
    using System.Reflection;
    using System.Diagnostics;
    
    namespace CsScriptNS
    {
        public class CsScript
        {
            /// <summary>
            /// Compiles .cs script into dll/pdb, loads as assembly, and executes Main function.
            /// Temporary dll/pdb gets deleted. If .cs throws exception - it will be converted to
            /// error information, including .cs filename and source code line information.
            /// </summary>
            /// <param name="path"></param>
            /// <param name="errors">Errors if any</param>
            /// <returns></returns>
            static public bool RunScript( String _path, out String errors )
            {
                errors = "";
    
                // ----------------------------------------------------------------
                //  Load script
                // ----------------------------------------------------------------
                String path = Path.GetFullPath( _path );
                if( !File.Exists( path ) )
                {
                    errors = "Error: Could not load file '" + path + "': File does not exists.";
                    return false;
                }
    
                //String tempDll = Path.GetDirectoryName( path ) + "\\" + Path.GetFileNameWithoutExtension( path );
                String tempDll = GetUniqueTempFilename(path);
                String pdb = tempDll + ".pdb";
                
                tempDll += ".dll";
                // ----------------------------------------------------------------
                //  Compile it into ram
                // ----------------------------------------------------------------
                Microsoft.CSharp.CSharpCodeProvider provider = new CSharpCodeProvider();
                #pragma warning disable 618
                ICodeCompiler compiler = provider.CreateCompiler();
                #pragma warning restore 618
                CompilerParameters compilerparams = new CompilerParameters();
                compilerparams.GenerateExecutable = false;
                #if NODEBUGTRACE
                // Currently it's not possible to generate in ram pdb debugging information.
                // Compiler option /debug:full should in theory allow that, but it does not work.
                compilerparams.GenerateInMemory = true;
                #else
                compilerparams.GenerateInMemory = false;
                compilerparams.IncludeDebugInformation = true;          // Needed to get line / column numbers
                compilerparams.OutputAssembly = tempDll;
                compilerparams.CompilerOptions = "/d:DEBUG /d:TRACE";   // /debug+ /debug:full /optimize-
                #endif
    
    
                // Add assemblies from my domain - all which are not dynamic.
                var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic).Select(a => a.Location);
                compilerparams.ReferencedAssemblies.AddRange(assemblies.ToArray());
    
                // ----------------------------------------------------------------
                //  If compile errors - report and exit.
                // ----------------------------------------------------------------
                CompilerResults results = compiler.CompileAssemblyFromFile(compilerparams, path);
                if (results.Errors.HasErrors)
                {
                    // Mimic visual studio error handling.
                    StringBuilder sb = new StringBuilder();
                    foreach (CompilerError error in results.Errors)
                    {
                        sb.AppendFormat("{0}({1},{2}): error {3}: {4}\r\n",
                            path, error.Line, error.Column, error.ErrorNumber, error.ErrorText
                        );
                    }
                    errors = sb.ToString();
                    return false;
                }
    
                // ----------------------------------------------------------------
                //  Preload compiled .dll and it's debug information into ram.
                // ----------------------------------------------------------------
                MethodInfo entry = null;
                String funcName = "";
    
                byte[] asmRaw = File.ReadAllBytes(results.PathToAssembly);
                byte[] pdbRaw = null;
                
                if( File.Exists( pdb ) ) 
                {
                    try{
                        pdbRaw = File.ReadAllBytes(pdb);
                    }catch ( Exception )
                    {
                    }
                }
    
                Assembly asm = Assembly.Load(asmRaw, pdbRaw);
                try{
                    File.Delete(tempDll);
                    File.Delete(pdb);
                }catch( Exception )
                {
                    // Could not delete intermediate files.. Oh well...
                }
                
                //Assembly asm = results.CompiledAssembly;
                // ----------------------------------------------------------------
                //  Locate entry point
                // ----------------------------------------------------------------
                BindingFlags flags = BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.IgnoreCase;
                foreach (Type type in asm.GetTypes())
                {
                    funcName = "Main";
                    entry = type.GetMethod(funcName, flags);
    
                    if (entry == null)
                    {
                        funcName = "ScriptMain";
                        entry = type.GetMethod(funcName, flags);
                    }
    
                    if( entry != null ) 
                        break;
                }
    
                if( entry == null )
                {
                    errors = String.Format( "{0}(1,1): error: Code does not have 'Main' function\r\n", path );
                    return false;
                }
    
                if ( entry.GetParameters().Length != 0 )
                {
                    errors = String.Format("{0}(1,1): error: Function '{1}' is not expected to have {2} parameter(s)\r\n", path,
                        funcName,entry.GetParameters().Length);
                    return false;
                
                }
    
                // ----------------------------------------------------------------
                //  Run script
                // ----------------------------------------------------------------
                try{
                    entry.Invoke(null, null);
                } catch ( Exception ex )
                {
                    try{
                        StackFrame[] stack = new StackTrace(ex.InnerException, true).GetFrames();
                        StackFrame lastCall = stack[0];
    
                        errors = String.Format("{0}({1},{2}): error: {3}\r\n", path,
                            lastCall.GetFileLineNumber(), lastCall.GetFileColumnNumber(), ex.InnerException.Message);
                    
                    } catch (Exception ex2 )
                    {
                        errors = String.Format("{0}(1,1): error: Internal error - exception '{3}'\r\n", path, ex2.Message);
                    }
                    return false;
               }
    
                return true;
            } //RunScript
    
            public static String GetUniqueTempFilename( String path )
            {
                String baseName = Path.GetFileNameWithoutExtension(path);
                string tStamp = String.Format("{0:yyyyMMdd_HHmmss}", DateTime.Now);
                string ProcID = Process.GetCurrentProcess().Id.ToString();
                string tmpFolder = System.IO.Path.GetTempPath();
                string outFile = tmpFolder + baseName + "_" + ProcID + "_" + tStamp;
                return outFile;
            }
    
        }
    }
    
    (Copyright, Tarmo Pikaro, 2014, License by here is granted to use this code however you want)

    Кстати - пробовали когда нибуть disassembliровать C# сгенерированный код ?

    ILSpy делает оригинальный C# код, практически такой же как разработчик его написал. т.е. все названия переменных соответствуют тому что программист написал.
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление