Экспертиза процесса разработки программного обеспечения

Судебная экспертиза исходного кода на C#

Исследуем программы на C# и платформе .NET — учётные системы, десктопные приложения, веб-сервисы: что сделано, чем закрыты сборки и собирается ли программа из переданного кода.

Ориентир по стоимости экспертизы
от 100 000 ₽
Ориентир по сроку экспертизы
10 рабочих дней
  • Судебные экспертизы
  • Внесудебные исследования
  • Рецензирование заключений
01 Проверим компетенцию

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

02 Поможем подготовиться

Уточним вопросы и перечень материалов — готовый комплект не обязателен.

03 Работаем с регионами

Принимаем задачи из России, Казахстана и Беларуси; часть материалов можно передать электронно.

04 Сопровождаем результат

Разъясняем методику и выводы, отвечаем на вопросы суда в пределах компетенции эксперта.

О направлении

Подробно о задачах, объектах и методиках

Материал описывает типовые задачи и вопросы. Окончательные формулировки определяются с учётом компетенции эксперта, а правовую оценку обстоятельствам даёт суд.

Содержание страницы

    Спорите с подрядчиком об учётной системе, настольной программе или веб-сервисе, и написаны они на C#. В суде такой спор сводится к тому же вопросу, что и любой другой спор о разработке: соответствует ли сделанное техническому заданию. Но здесь подступиться к ответу проще, чем в большинстве других языков, и причина техническая. Программы для платформы .NET, на которой работает C#, обычно не переводят в машинный код процессора: они хранятся в промежуточном представлении — его называют промежуточным языком, сокращённо IL, — из которого специальные средства восстанавливают текст, очень близкий к исходному: с именами классов, методов и полей, с сохранённой структурой типов. Исключение есть, и его проверяют первым делом — по самой сборке, а не со слов сторон. Программу на .NET можно опубликовать уже переведённой в машинный код, и режимов таких два. При первом машинный код добавляют к промежуточному представлению, и текст восстанавливается в полном обычном объёме. При втором, доступном начиная с .NET 7, промежуточного представления в файле не остаётся вовсе — тогда восстановление невозможно так же, как в C++. Различают их по содержимому файла, и вывод «объекта нет» делают по отсутствию промежуточного представления, а не по одному тому, что в файле есть машинный код. Поэтому вопрос «а есть ли вообще исходный код» здесь почти никогда не бывает тупиком. Экспертиза исходного кода на C# — специализированное направление экспертизы процесса разработки программного обеспечения. В итоге вы получаете заключение с описанием объектов, методов и ограничений; какое доказательственное значение оно получит, оценивает суд.

    Если спор уже начался, сохраните то, что удаляют первым. Собранные файлы программы — их называют сборками — обычно остаются целы: они установлены у вас и работают. Быстрее исчезает другое: доступ к хранилищу исходных текстов, записи сервера сборки, содержимое площадки, где программа развёрнута. Что именно сохранять, разобрано ниже, в разделе «Что сохранить, пока сборки и история на месте».

    Начать можно с разговора, и он бесплатный: назовите систему, опишите спор и перечислите, что у вас на руках. Пока ничего собирать и никуда загружать не нужно — порядок передачи материалов мы предложим отдельно, когда станет понятно, какие из них вообще потребуются.

    С какими спорами приходят по программам на C#

    Обращаются, когда разногласия упираются в проверяемое: в состав переданного, в поведение программы при названных условиях и в зафиксированный ход работ. До начала работы определите, о какой версии, площадке и периоде идёт речь, — без этого у исследования нет предмета.

    Типичные ситуации выглядят так:

    • подрядчик сдал учётную или складскую систему, настольную программу на WinForms или WPF либо веб-сервис на ASP.NET, а заказчик считает техническое задание невыполненным;
    • исходный код передали, но собрать из него работающую программу не получается: не хватает файлов проекта, пакетов или настроек;
    • переданные сборки закрыты обфускатором, и заказчик не может ни доработать систему, ни сменить исполнителя;
    • программа падает, зависает или со временем занимает всю доступную память, и стороны спорят, дефект это или условия эксплуатации;
    • заказчик утверждает, что подрядчик выдал за свою разработку чужой код или пакет, условия которого нарушил;
    • спорят о переносе системы с прежней платформы .NET Framework на современную и о том, входил ли этот перенос в работы;
    • требуется установить, к какому периоду относится спорная версия и что изменилось между выпусками.

    Если спор идёт об обмене с учётной системой предприятия, начните со страницы экспертизы 1С: там объекты и следы другие.

    Почему по .NET исходный текст почти всегда восстановим

    Разница с языками, которые переводят программу прямо в машинный код, принципиальная, и на ней держится всё дальнейшее. Программу на C++ переводят в машинный код необратимо. Программу на C# компилируют в промежуточное представление IL, которое сохраняет имена и структуру: средства вроде ILSpy, dnSpy и dotPeek читают собранный файл и выдают текст на C#, местами почти совпадающий с исходным. Такое восстановление называют декомпиляцией, а сами средства — декомпиляторами.

    Что это значит для спора. Заказчик без исходников не остаётся без предмета: по установленной у него программе эксперт устанавливает состав классов и методов, обращения к базе и внешним системам, использованные пакеты, тексты сообщений и значительную часть логики. Утверждение «мы не можем ничего проверить, потому что нам не отдали код» здесь обычно не подтверждается.

    О потерях эксперт говорит прямо, и они известны заранее: комментарии и авторские пояснения не сохраняются никогда; имена локальных переменных исчезают, если рядом нет отладочных данных; в самой сборке не хранится исходное разбиение по файлам — средство восстановления раскладывает типы по собственному правилу, и части, написанные в одном файле, оказываются в разных; но если сохранены файлы отладочных данных — отдельные или встроенные в сборку, — исходные пути и принадлежность методов файлам восстанавливаются из них. Конструкции, которые компилятор разворачивает — асинхронные методы, перечислители, вложенные функции, — современные средства обычно собирают обратно, но не всегда: на отдельных сочетаниях восстановление срывается и выдаёт развёрнутую форму, а эксперт помечает такие места. Поэтому восстановленный текст не тождествен переданному исходному коду, и подменять им объект исследования нельзя: в заключении всегда указывают, что именно исследовалось — исходные тексты или результат восстановления.

    Обфускация: зачем её ставят и что она значит для спора

    Ровно потому, что исходный текст .NET восстанавливается легко, разработчики массово применяют средства, которые это затрудняют. Их называют обфускаторами, распространённые — Dotfuscator, ConfuserEx и подобные. Они переименовывают классы и методы в бессмысленные наборы знаков, прячут текстовые строки, запутывают порядок выполнения. Есть и более тяжёлые средства — упаковщики и преобразователи кода в собственное представление: после них привычные способы восстановления сразу не работают, сборку сначала приводят в обычный вид отдельными средствами, и удаётся это не всегда. Какое средство защиты применено и удалось ли его снять — отдельный факт, который эксперт устанавливает до всего остального и указывает в заключении.

    Простое переименование меняет трудоёмкость и точность, но не результат: состав пакетов, обращения к системе и внешним сервисам, структура данных устанавливаются и по такой сборке. Спрятанные строки восстанавливаются наблюдением за работой программы, а не чтением, и это отдельный труд. А вот назначение конкретного метода приходится выводить из его поведения, и такой вывод эксперт помечает как предположительный.

    Уже сам факт защиты в споре нередко весит больше, чем содержимое сборок. Если заказчик рассчитывал получить сопровождаемую систему, а получил закрытые сборки без исходников, это проверяемое обстоятельство: эксперт устанавливает, какие сборки обработаны, каким средством и какая доля кода закрыта. Правовую оценку — нарушены ли этим обязательства подрядчика — даёт суд.

    Что сохранить, пока сборки и история на месте

    Копируйте и передавайте только то, что принадлежит вам или к чему у вас есть законное право доступа; чужие системы исследуют по определению суда или иного уполномоченного органа. Если доступ к хранилищу исходных текстов есть только у подрядчика, с которым вы спорите, действовать самостоятельно не нужно: письменно потребуйте передать материалы по договору и зафиксируйте отказ или молчание. Чужое получают через суд по возбуждённому делу — ходатайством об истребовании доказательства, в котором называют, что именно требуется, какие обстоятельства этим подтверждаются и почему получить его самостоятельно нельзя.

    Разумный минимум выглядит так:

    • сохраните каталог установленной программы целиком, вместе с файлами настроек и вспомогательными сборками — именно он чаще всего оказывается единственным бесспорным объектом;
    • если доступ к хранилищу исходных текстов у вас есть, снимите архивом его полную копию со всей историей, ветками и метками — чаще всего это Git;
    • заберите файлы отладочных данных, если они лежат рядом со сборками: в .NET их называют PDB, и с ними восстановление точнее;
    • сохраните записи сервера сборки за спорный период: когда, из чего и с какими настройками выпускались версии;
    • выгрузите базу данных и настройки площадки, где программа развёрнута, — журналы веб-сервера или службы, конфигурацию;
    • для каждого архива посчитайте контрольную сумму и сохраните её отдельно от него — например, в письме самому себе. Это короткая строка, вычисленная из содержимого файла: поменяется в архиве хоть один знак — поменяется и она, поэтому записанная сегодня сумма завтра докажет, что архив тот самый. Команда зависит от того, где лежит архив: в Windows через PowerShell — Get-FileHash архив.zip -Algorithm SHA256, через обычную командную строку — certutil -hashfile архив.zip SHA256; на сервере под Linux — sha256sum архив.zip, в macOS — shasum -a 256 архив.zip;
    • напишите служебную записку на полстраницы: какие архивы получены, с какого сервера, в какой день, под чьей учётной записью и кто при этом был. Через год это единственное, что объяснит происхождение файлов.

    Выполнять это должен тот, у кого есть доступ к серверу и хранилищу, — ваш системный администратор или сотрудник, ведущий инфраструктуру. Если такого человека нет или вы не уверены, с чего начать, позвоните по номеру 8 (800) 333-24-09: подскажем порядок под вашу ситуацию, это бесплатно.

    Пока состояние не зафиксировано, не переустанавливайте программу, не обновляйте её на спорной площадке, не удаляйте старые версии и ветки, не очищайте журналы. Копия, снятая своими силами, доказывает меньше, чем кажется: другая сторона вправе сказать, что архив собран уже после спора. Усиливают её посчитанные сразу контрольные суммы и обеспечение доказательств. Путей три, и они не взаимозаменяемы: до обращения в суд доказательство закрепляет нотариус; в арбитражном процессе суд вправе обеспечить доказательство и до предъявления иска — по заявлению, которое рассматривается по правилам о предварительных обеспечительных мерах; по уже возбуждённому делу подают ходатайство об обеспечении доказательств.

    Сборка .NET повторяема — и это меняет доказывание

    Здесь .NET выигрывает у большинства языков. В большинстве из них одинаковый исходный текст даёт разные собранные файлы, и побайтовое сравнение ничего не доказывает. В современном .NET сборка по умолчанию детерминирована: при одинаковых входных данных и настройках результат совпадает вплоть до байта, и это свойство заявлено самой платформой.

    Работает это при одном условии: исходный текст у вас есть — передан подрядчиком или истребован через суд. Если на руках одни сборки, собирать нечего, и спор решается другим путём, описанным выше: составом классов и методов, обращениями к базе, текстами сообщений, восстановленными из самой программы. Тогда переходите сразу к следующему разделу.

    Когда исходники есть, вопрос «получается ли из переданного текста именно эта программа» решается здесь строже, чем где-либо. Эксперт восстанавливает окружение — версию набора средств разработки, состав пакетов, настройки проекта, — причём восстанавливает по сведениям внутри самих спорных файлов и файлов отладочных данных, а не только со слов стороны, и собирает переданный текст.

    Критерий вывода формулируют до сборки, а не по её итогу. Совпадение полученного файла со спорным — сильный довод в пользу того, что программа собрана из переданного текста; и когда повторяемость подтверждена, сравнивать можно побайтово. Расхождение само по себе обратного не доказывает: часть его объясняется другой версией средств, другим составом пакетов, включёнными в файл сведениями о времени сборки и подписью, поставленной после неё. Каждое такое объяснение эксперт обязан проверить и показать, а не предположить. Если объяснить расхождение нечем, вывод отрицательный; если окружение восстановить не удалось, вопрос остаётся без ответа, и это тоже итог работы.

    Но с оговоркой. Детерминированность — свойство современных версий платформы; у старых проектов на .NET Framework её может не быть. И даже в современной сборке в файл попадают пути к исходным текстам, поэтому у эксперта, собирающего код в своём каталоге, побайтового совпадения без специальных настроек не выйдет — эти настройки задают заранее и указывают в заключении. Поэтому первым делом проверяют, повторяем ли результат вообще, и двух одинаковых прогонов для этого мало: текст собирают дважды в намеренно разных условиях — в другом каталоге, под другой учётной записью, по возможности на другой машине. Совпало — сравнение со спорным файлом можно вести по байтам. Разошлось — сравнивают по содержанию: составу типов и методов, строкам, обращениям к внешним сборкам.

    Версию платформы вам определять не нужно, и спрашивать её у подрядчика, с которым вы спорите, тем более: она записана в самих файлах программы. Назовите систему и год разработки или пришлите перечень файлов из каталога программы — прочитаем на бесплатном разборе.

    Подпись сборки и строгое имя: что они доказывают

    У сборок .NET есть два разных механизма подтверждения происхождения, и путать их не следует.

    Первый — строгое имя: сборка подписывается ключом разработчика, и в неё попадает открытая часть этого ключа. Механизм задумывался как способ различать сборки с одинаковыми именами, а не как защита: подпись снимается и ставится заново другим ключом, а современные версии платформы её при запуске вообще не проверяют. Поэтому вывод по строгому имени возможен только один и только при наличии эталона: отпечаток ключа в спорной сборке совпадает или не совпадает с отпечатком в сборке, происхождение которой известно. Второй механизм — цифровая подпись файла средствами операционной системы, с сертификатом издателя; она проверяется системой и позволяет установить, кому выдан сертификат и не изменялся ли файл после подписания. А вот дата подписания из подписи сама по себе не следует: время в ней ставит по часам своего компьютера тот, кто подписывал. Проверяемым фактом дата становится только при отметке времени независимой службы — эксперт смотрит, есть ли она, кто её выдал и был ли сертификат действителен на тот момент. Без отметки времени вывод о дате по подписи не делают.

    В обоих случаях у вывода есть предел. Даже действительная подпись не говорит об авторстве кода: ключ передают подрядчику, он бывает общим у нескольких проектов, а неподписанная сборка — обычное дело для внутренней разработки. Поэтому подпись работает как один признак в совокупности, а не как самостоятельное доказательство. Если ключ подписи оказался в переданных вам материалах, его следует заменить: обладатель ключа может подписать чужую сборку от вашего имени.

    Пакеты NuGet и условия их использования

    Готовые библиотеки в .NET подключают пакетами, и их состав восстанавливается надёжнее, чем в большинстве языков. Ссылки на пакеты хранятся прямо в файле проекта, а при включённой блокировке версий — ещё и в отдельном файле, закрепляющем точный набор вместе с косвенными зависимостями. У старых проектов на .NET Framework их ищут в отдельном файле packages.config рядом с проектом — если его не прислали, состав пакетов придётся выводить по самой программе. Если исходников нет, состав определяют по самой программе: подключённые сборки видны в её служебных сведениях, а у многих пакетов есть узнаваемые имена и номера версий.

    Каталог загруженных пакетов — не работа подрядчика, и при подсчёте объёма его вычитают. Но подбор библиотек и поддержание их версий — тоже труд, и он оценивается отдельно от числа строк.

    Условия использования пакета записаны в его лицензионном документе — MIT, Apache, BSD, GPL, LGPL и других; встречаются и коммерческие библиотеки с оплатой по числу разработчиков. Эксперт устанавливает факты: какой пакет какой версии подключён, каким документом сопровождается и что в этом документе написано; текст приводится в заключении. Толкование условий и вывод о том, нарушены ли они, — вопрос права, и решает его суд.

    .NET Framework и современный .NET: спор о переносе

    Отдельная и частая тема. Долгое время программы для Windows писали под платформу .NET Framework; ей на смену пришла новая, кроссплатформенная линейка, а поддержка старой ограничена. Из этого вырастают два типа споров.

    Первый: заказчик считает, что подрядчик обязан был сделать систему на современной платформе, а получил её на устаревшей. Здесь эксперт устанавливает факт — под какую платформу и версию собрана программа, — а вопрос о том, следовало ли из договора требование к платформе, решается по документам. Если требование в задании названо, несоответствие проверяемо; если не названо, вывод о «неправильном выборе» становится оценочным, и эксперт его не делает.

    Второй: перенос заказан, выполнен, и стороны спорят о его полноте. Здесь работа предметнее: эксперт сравнивает состав функций до и после переноса, проверяет, какие части остались на прежней платформе, какие внешние компоненты не имеют замены, и воспроизводит заявленные сценарии на обеих версиях. Типичные находки — не переписанные фрагменты, работающие через прослойку совместимости, и функции, которые после переноса ведут себя иначе из-за смены поведения библиотек.

    Отказы, зависания и рост потребления памяти

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

    При необработанной ошибке среда выполнения записывает сведения о месте отказа: цепочку вызовов с именами методов, а при сохранённых отладочных данных — и номера строк. Эти сведения попадают в журнал приложения, в журнал событий Windows или в файл снимка памяти, если его сохранение включено. По ним восстанавливают, где именно произошёл отказ и с какими данными работала программа. Место, где отказ проявился, при этом не всегда совпадает с местом дефекта — как и в других средах, эксперт проверяет альтернативные объяснения: неверные входные данные, недоступность внешней системы, нехватку ресурсов, действия других программ.

    Зависание исследуют иначе, чем отказ: пока программа не отвечает, снимают снимок её состояния и смотрят, чем заняты потоки — ждут ли они ответа базы или внешней системы, встали ли на общей блокировке или заблокировали друг друга взаимным ожиданием. Один снимок показывает картину, два-три подряд отвечают на вопрос, стоит она или движется медленно, — а это разные обстоятельства, и в заключении их не смешивают.

    Рост потребления памяти исследуют воспроизведением на стенде — отдельном компьютере, настроенном как рабочий, — со снятием снимков состояния памяти в разные моменты и сравнением между ними. В .NET память освобождается автоматически, поэтому классическая утечка встречается реже, а типичная причина другая: объекты остаются связанными с долгоживущим обработчиком событий, кешем или статическим полем и потому не освобождаются. Но дело этим не исчерпывается: память может расходоваться вне управляемой области — соединениями, файлами, графическими ресурсами, которые не закрывают, — и такой рост сравнение снимков не покажет. Поэтому наблюдают и за общим потреблением процесса, а расхождение между ним и объёмом управляемых объектов само по себе указывает, где искать. Вывод о том, что дефект есть, сопровождают указанием, при каком сценарии он воспроизведён, и оценкой того, наступают ли последствия при заявленном в задании режиме эксплуатации.

    Где у решения на .NET прячется логика помимо кода

    Заключения чаще всего портит одно: эксперт смотрит только код. У корпоративных решений значительная часть поведения задаётся вне программы.

    Смотреть нужно как минимум сюда:

    • файлы настроек приложения и веб-сервиса: строки подключения к базе, адреса внешних систем, включённые и выключенные возможности;
    • переменные окружения и параметры запуска службы: в современном .NET они перекрывают записанное в файлах, поэтому один файл настроек без них картины не даёт;
    • саму базу данных: справочники, правила расчёта, права доступа, хранимые процедуры — на SQL Server значительная часть логики нередко живёт именно там;
    • настройки площадки: параметры веб-сервера IIS или службы Windows, расписания фоновых задач, учётные записи, от имени которых всё работает;
    • обмен с внешними системами: адреса, форматы, журналы обеих сторон;
    • файлы, загруженные пользователями, и шаблоны документов, если система их формирует.

    Одного каталога с программой обычно мало, и объём материалов лучше согласовать заранее — иначе исследование упрётся в вопрос, ответ на который лежит в настройке, а не в коде.

    Сравнение двух кодовых баз: почему по .NET это работает лучше

    Спор о заимствовании по .NET разбирают полнее, чем по большинству языков, и снова из-за восстановимости кода. Сравнивать можно не только исходные тексты, но и собранные файлы — а значит, у эксперта есть объект даже тогда, когда одна из сторон исходники не отдала.

    Сравнение ведут по промежуточному представлению, а не по восстановленному тексту: восстановление зависит от средства и его версии, и два инструмента дадут разный текст из одного и того же файла. Промежуточный код от этого не зависит и потому пригоден для сопоставления. Сравнивают состав типов и их членов, структуру и порядок операций внутри методов, тексты сообщений, схему данных.

    Как и в других языках, из сравнения сначала вычитают общее основание — но перечень вычитаемого задают в тех же единицах, в которых ведут сравнение, иначе вычитание не срабатывает. В промежуточном представлении это код подключённых пакетов; то, что среда разработки создаёт сама, — описания форм, модели данных, обёртки; стандартные конструкции языка; и, что важнее всего, код, который дописывает сам компилятор: развёрнутые асинхронные методы и перечислители, классы для замыканий, хранилища автоматических свойств, служебные члены. Этот слой у двух независимо написанных программ совпадает просто потому, что его создал один и тот же компилятор, и без его вычитания процент совпадения получается бессмысленно высоким. По той же причине версию компилятора и настройки сборки либо уравнивают, либо учитывают при оценке: они сами порождают и совпадения, и расхождения. Значимыми считают совпадения, которые общим основанием не объясняются, и каждое проверяют вручную. Развёрнуто эта задача разобрана на странице экспертизы плагиата исходного кода.

    Как датируют спорную версию

    Вопрос «когда это было написано» возникает почти в каждом споре о сроках, и надёжного одиночного источника для него не существует ни в одном языке. По .NET источников больше обычного, но каждый со своими пределами.

    Что даёт На что при этом опираются::

    • история в хранилище исходных текстов — самый содержательный источник, но даты в ней задаются свободно штатными средствами, поэтому её подтверждают другими;
    • записи сервера сборки: когда, из чего и с какими настройками выпускалась каждая версия, — их подделать сложнее, потому что они ведутся отдельной системой;
    • сведения о версии внутри самих файлов программы и время их создания на площадке — но файловые метки переписываются копированием и переустановкой, поэтому сами по себе они доказывают мало;
    • отметка времени в цифровой подписи сборки, если она есть: это единственный источник даты, не зависящий от часов того, кто подписывал;
    • журналы установки и обновления на сервере заказчика, резервные копии за прошлые периоды;
    • переписка сторон с вложениями, акты и задачи в системе учёта.

    Совпадение независимых источников позволяет говорить о периоде обоснованно; расхождение эксперт обязан показать, а не сгладить. Если спор именно о сроках и хронологии работ, его разбирает экспертиза сроков и хронологии разработки.

    Когда спор выходит за пределы C#

    Крупные системы редко пишут на одном языке: серверная часть на C# обрастает интерфейсом в браузере, обменом с учётной системой и вспомогательными сервисами. Границу исследования лучше провести до постановки вопросов.

    Обычно её проводят так:

    Ссылки на соседние направления — не предложение заказать несколько экспертиз. Все они ведутся одной организацией, и, когда задач в споре несколько, их обычно ставят вопросами в одном исследовании: это дешевле и быстрее нескольких отдельных заключений. Знать язык заранее не обязательно — его называют в техническом задании и в актах, а по составу файлов эксперт определяет его сам.

    Какие обстоятельства устанавливают по программе на C#

    Что именно устанавливать, определяет поставленный вопрос. Но перечень возможного по .NET шире, чем по языкам, которые переводят программу прямо в машинный код, и полезно знать его заранее — хотя бы для того, чтобы не просить эксперта о невозможном и не упустить достижимое.

    • сохранено ли в спорных файлах промежуточное представление — от этого зависит, есть ли объект для восстановления вообще;
    • та ли это программа: собирается ли из переданных исходников то, что установлено у заказчика, и в чём расходится;
    • выполнено ли каждое проверяемое требование задания — с указанием объекта и способа, которым это проверялось;
    • состав подключённых пакетов, их версии и то, какими лицензионными документами они сопровождаются;
    • применялась ли обфускация, к каким сборкам и в каком объёме;
    • под какую платформу и версию собрана программа, чем подписана и когда;
    • причина отказа, зависания или роста потребления памяти при воспроизведённом сценарии;
    • совпадения между двумя кодовыми базами за вычетом пакетов, шаблонного и сгенерированного кода;
    • чем спорная версия отличается от предыдущей и что изменилось между ними;
    • когда выпущена спорная версия — по совпадению нескольких независимых источников;
    • сколько кода написано подрядчиком за вычетом пакетов и сгенерированных файлов — величина техническая, стоимость по ней не выводится.

    За пределами перечня остаётся то, что решает суд: добросовестность сторон, толкование договора, существенность недостатка, размер убытков. Технический вывод даёт для этого основание, но не заменяет его. Спор о деньгах выделяют в самостоятельный вопрос — им занимается экспертиза объёма и стоимости работ, при необходимости вместе с экономистом.

    Как проверяют соответствие заданию по коду и по работающей системе

    По .NET у эксперта редко бывает один объект: почти всегда есть и работающая система, и сборки, а нередко и исходные тексты. Поэтому проверку каждого требования привязывают к тому объекту, на котором оно вообще проверяемо, и пишут об этом в заключении.

    У каждого требования свой объект. Требования, сформулированные в терминах устройства программы — «модуль расчёта должен быть выделен», «обмен должен идти через очередь», — проверяют по коду: по исходному тексту, если он передан, иначе по восстановленному из сборок, и разница между этими двумя случаями оговаривается прямо. Требования о поведении проверяют на стенде: поднимают ту же версию платформы, разворачивают копию базы и подставляют заглушки вместо внешних сервисов. Требования, которые без данных заказчика или без живых сервисов не воспроизводятся, проверяют на его площадке — по сценарию, согласованному заранее, в согласованное время и силами его сотрудников. Односторонней такая проверка быть не должна: по судебной экспертизе лица, участвующие в деле, вправе присутствовать при её производстве, а порядок и время работ на площадке определяет назначивший орган. Возражение другой стороны само по себе результат не отменяет — допустимость и вес такого эксперимента оценивает суд, но проверка, поставленная на оборудовании одной стороны без её извещения, эту оценку почти наверняка не выдержит. Поэтому доступ согласуют через суд, а ход и результат протоколируют.

    Результат по каждому требованию записывают одинаково: реализовано, реализовано частично, не реализовано либо не проверяется на представленных объектах, — с указанием объекта, способа и полученного результата. Последний исход по .NET встречается реже, чем там, где программа переведена прямо в машинный код, но встречается: чаще всего тогда, когда требование завязано на внешнюю систему, доступ к которой не предоставлен. Существенность недостатка и его влияние на приёмку оценивает суд. Если спор целиком о соответствии заданию и язык значения не имеет, задачу закрывает экспертиза соответствия работ техническому заданию.

    Что просят прислать по спору о системе на .NET

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

    Программа: исходники, сборки, пакеты

    Первая часть — то, из чего программа получается и во что превращается:

    • исходные тексты вместе с файлами проектов и решения — с ними разбор идёт короче и точнее всего, а контрольная сборка возможна только по ним; если их нет, работают по сборкам, и это отдельно оговаривается в заключении;
    • хранилище исходных текстов с полной историей, ветками и метками, если оно велось;
    • сборки спорной версии и, если сохранились, предыдущих — по ним сравнивают, что изменилось между выпусками;
    • файлы отладочных данных, лежащие рядом со сборками: с ними восстановление точнее, а разбор отказа превращается в чтение;
    • ссылки на пакеты в файлах проектов, файл блокировки версий и, для развёрнутого приложения, список зависимостей, который создаётся при публикации;
    • сведения о наборе средств разработки: версия платформы, целевая версия, параметры сборки.

    Площадка: где система живёт и что она о себе оставила

    Вторая часть — то, без чего первая объясняет не всё:

    • файлы настроек приложения и площадки, включая параметры веб-сервера IIS или службы Windows;
    • выгрузка базы данных: справочники, правила, права доступа, хранимые процедуры;
    • журналы приложения и журнал событий Windows за спорный период, снимки памяти при отказах;
    • журналы обмена с внешними системами — с обеих сторон, если это возможно;
    • записи сервера сборки: когда, из чего и с какими параметрами выпускалась каждая версия;
    • техническое задание с приложениями, договор, акты, переписка сторон, задачи в системе учёта, документы на коммерческие компоненты.

    Чего не хватает по вашему спору, скажем после первичного разбора: набор зависит от вопросов, и тащить всё подряд не нужно.

    Как передать материалы и не раскрыть доступы

    Здесь у .NET своя особенность: секреты лежат не в коде, а рядом с ним. В файлах настроек почти всегда обнаруживаются строка подключения к базе с паролем, ключи внешних сервисов и учётные данные служебных записей, а вместе со сборками может уехать ключ, которым они подписаны.

    Сначала о самом порядке. Пересылать что-либо до разговора не нужно: сперва мы определяем по описанию спора, какие материалы вообще потребуются, и только потом договариваемся о передаче. Идёт она по защищённому каналу и ограниченному кругу лиц: архивы шифруют, пароль передают отдельно от них, состав переданного и контрольные суммы фиксируют актом приёмки. Носители с боевыми настройками по обычной почте и через мессенджеры не пересылают.

    Здесь важно не путать две вещи. Файлы программы и настроек передают в том виде, в каком они работают: удалять из них пароли нельзя, потому что это изменит исследуемый объект, и другая сторона справедливо на это укажет. А объём выгрузки базы — вопрос не изменения объекта, а выбора объектов: таблицы, к спору не относящиеся, в исследование просто не включают, и это согласуют заранее. Если персональные данные клиентов всё же попадают в выгрузку, объём определяют по вопросам, а не по принципу «пусть будет», и лишнее обезличивают там, где это не мешает исследованию. Основание передачи при этом разное. По судебной экспертизе материалы идут через назначивший орган в рамках производства по делу. Вне судебного производства такого основания само по себе не возникает: письменное поручение обработки эксперту — с перечнем разрешённых действий, целями и обязанностью соблюдать конфиденциальность и требования к защите — описывает, как обрабатывать, но не заменяет основания, по которому данные вообще передаются. Годится ли для вашего случая согласие субъектов, иное предусмотренное законом основание или передача только обезличенных данных, определяют вместе с юристом до выгрузки.

    После передачи меняют всё, что открывает доступ: пароль к базе, ключи сервисов, ключ подписи сборок, пароли служебных учётных записей. Это отдельная работа для вашей ИТ-службы, и её планируют заранее — смена пароля к боевой базе и ключей внешних сервисов затрагивает работающую систему. Прежние значения остаются в архиве как часть объекта, но перестают что-либо открывать. Возврат или уничтожение переданного, а также срок хранения фиксируют в договоре до начала работы — не после.

    Отдельно о разглашении. Соглашение о конфиденциальности связывает эксперта, но не участников дела: материалы, поступившие в суд, доступны сторонам, и закрытое заседание этого не отменяет — оно закрывает зал от посторонних, а не дело от оппонента. Если раскрытие исходных текстов противнику для вас неприемлемо, обсудите со своим юристом другие пути: ограничить объём передаваемого вопросами, просить об исследовании на вашей территории без вывоза носителей, поставить вопрос о неразглашении перед судом до передачи. Решение принимает суд, но поставить вопрос нужно заранее.

    Как идёт работа: от приёмки материалов до выводов

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

    1. Приёмка: записывают состав материалов и контрольные суммы, описывают происхождение каждой копии.
    2. Опознание объектов: что перед экспертом — исходные тексты, сборки или и то и другое; сохранено ли в сборках промежуточное представление; какая версия платформы, какие пакеты, есть ли обфускация и подпись.
    3. Восстановление окружения и двойная контрольная сборка: сначала проверяют, повторяем ли результат вообще, и только потом сопоставляют его со спорными файлами.
    4. Разбор кода: по исходному тексту либо по восстановленному, с указанием, что именно исследовалось, каким средством восстановления и какой его версии.
    5. Проверка требований — каждое своим способом, с записью условий, при которых получен результат.
    6. Проверка альтернативных объяснений: настройки, данные, внешние системы, действия третьих лиц.
    7. Формулирование выводов в пределах поставленных вопросов и перечисление ограничений.

    Ограничения по .NET называют всегда, даже когда они не помешали: обфускация, отсутствие отладочных данных, невозможность поднять внешнюю систему, отказ в доступе к площадке. Читатель заключения должен видеть не только то, что установлено, но и то, на чём это установлено.

    Как формулируют вопросы по программе на C#

    У вопроса по .NET есть особенность, которой нет у других языков: у эксперта может быть несколько разных объектов, и вопрос должен называть тот, о котором идёт речь. «Программа заказчика» — не объект; объект — конкретный архив с контрольной суммой либо конкретный набор сборок с указанием, откуда они взяты. Второе, что должно быть в вопросе, — проверяемый критерий: пункт технического задания, требование договора или документация.

    Полезно разделять вопросы по предмету: происхождение кода, соответствие заданию, применение обфускации и причина отказа — это четыре разных исследования, и в одном вопросе их не смешивают. Стоит предусмотреть и ответ «на представленных материалах не проверяется». При судебной экспертизе окончательный круг вопросов определяет суд, а в иных предусмотренных законом процедурах — орган или лицо, назначившие экспертизу; эксперт отвечает в пределах специальных знаний и представленных материалов и при неясности вопроса сообщает об этом назначившему органу. Помощь с формулировками возможна до назначения; подробные перечни под конкретные задачи собраны на страницах экспертизы качества исходного кода и экспертизы плагиата исходного кода. По спорам о программах на C# чаще всего ставят такие вопросы:

    1. Является ли содержимое архива с контрольной суммой SHA-256 … исходным текстом программы, представленной сборками …; возможно ли собрать из него работоспособную программу и каких компонентов для этого недостаёт?
    2. Соответствует ли программа, представленная сборками …, требованиям пунктов … технического задания (приложение № … к договору от …)?
    3. Применялись ли к сборкам, представленным файлами …, средства, затрудняющие изучение программного кода; если да, какие сборки и какая доля содержащегося в них кода ими обработаны?
    4. Какие сторонние программные пакеты и каких версий использованы в программе … и какими лицензионными документами они сопровождаются?
    5. Какова причина отказа программы …, зафиксированного в журнале … при сценарии, описанном в …?
    6. Имеются ли в сборках … и … совпадения программного кода, не объясняемые использованием общих пакетов, стандартных конструкций языка и кода, создаваемого средой разработки?

    Форматы работы: от разбора до рецензии

    До обращения в суд и после назначения экспертизы возможности разные, и выбирать формат стоит по стадии спора.

    До иска и параллельно с ним доступны внесудебное исследование по договору с вами и письменная консультация по материалам — второе дешевле и быстрее, потому что отвечает не на все вопросы, а на один: что вообще удастся установить по тому, что у вас есть. Судебную экспертизу назначает суд или орган расследования, и здесь эксперта предупреждают об уголовной ответственности за заведомо ложное заключение, а материалы поступают через назначивший орган. Если по делу уже есть чужое заключение, его разбирают рецензированием — подробнее на странице рецензии на заключение о процессе разработки. Сама рецензия заключение не отменяет: она нужна как обоснование ходатайства. По делу заявляют о вызове эксперта для пояснений, о назначении дополнительной экспертизы, если заключение неполно или неясно, либо повторной — если возникли сомнения в обоснованности заключения или в выводах экспертов есть противоречия. Заранее установленной силы у заключения нет: суд оценивает его наряду с остальными доказательствами. Отдельный формат — участие специалиста в заседании, когда нужно пояснить суду уже проведённое исследование.

    Что меняется после назначения судебной экспертизы: назначенный эксперт перестаёт быть доступен стороне напрямую. Он не принимает от неё материалы, не даёт частных оценок по существу поручения, а доступ к площадке и любые новые сведения получает через суд. Если специалист раньше работал для одной из сторон, это раскрывают при рассмотрении его кандидатуры; решение о назначении и об отводе принимает назначивший орган.

    Из чего складываются стоимость и срок

    Расчёт складывается из трёх позиций. Первая — состояние объекта.

    Разница между «есть исходные тексты», «есть только сборки» и «сборки закрыты обфускатором» — это разница в трудоёмкости в разы: в первом случае эксперт читает код, во втором сначала восстанавливает его и сверяет с поведением, в третьем ещё и выводит назначение методов по их работе. Второе обстоятельство — окружение: программа на C# почти никогда не работает в одиночку, и стенд с нужной версией платформы, копией базы и заглушками внешних сервисов готовится отдельно, иногда дольше, чем идёт сам разбор. Третье — нужен ли выезд: проверки на работающей системе заказчика согласуются по времени, порядку и участникам, и это отдельная позиция.

    Остальное считают как везде: размер спорного контура, число проверяемых требований, количество поставленных вопросов, необходимость смежных специалистов. Ориентир для судебной экспертизы — от 100 000 ₽, ориентировочный срок — 10 рабочих дней; и то и другое уточняют после просмотра материалов, а если задача выходит за эти рамки, мы скажем об этом сразу, а не в процессе.

    Отдельно о том, что будет, если ответом окажется «на представленных материалах не проверяется». Такой исход возможен, он тоже результат работы: эксперт указывает, какого объекта или каких условий не хватило, и этот вывод оплачивается наравне с любым другим. Поэтому объём работ определяют после первичного разбора, а по телефону только назначают встречу — он бесплатный и как раз показывает, что по имеющимся материалам установить реально, а что нет. Выезд, стенд с внешними системами и участие в заседании — отдельные позиции сметы; их называют до начала работы, а не задним числом.

    Чтобы получить расчёт, архивы собирать не надо. Хватит описания спора, названия системы и перечня того, что у вас на руках: договор, задание, переписка, доступы. Позвоните по номеру 8 (800) 333-24-09 или оставьте заявку — скажем, относится ли задача к нашей компетенции, какое направление её закрывает, что стоит сохранить сегодня и каких данных не хватает для расчёта.

    Проведение экспертизы по уголовному делу

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

    Негосударственными судебно-экспертными учреждениями постановление Пленума Верховного Суда Российской Федерации от 21 декабря 2010 г. № 28 «О судебной экспертизе по уголовным делам» признаёт некоммерческие организации, созданные в соответствии с Гражданским кодексом Российской Федерации и Федеральным законом «О некоммерческих организациях» и осуществляющие судебно-экспертную деятельность в соответствии с принятыми ими уставами.

    По сведениям организации, проведение судебных экспертиз предусмотрено её уставом (см. действующую редакцию в разделе «Документы организации»). Это само по себе не означает автоматического поручения любой экспертизы. Возможность поручить конкретное исследование определяет назначающий орган с учётом предмета дела, квалификации эксперта, оснований для отвода и действующего перечня экспертиз, выполняемых только государственными судебно-экспертными организациями.

    Актуализировано
    Форматы работы

    Стоимость и сроки

    Указан предварительный ориентир. Точный расчёт зависит от вопросов, объёма материалов, количества объектов и необходимости выезда. Начало отсчёта фиксируем после проверки необходимого комплекта.

    По договору

    Внесудебное исследование

    от 100 000 ₽
    10 рабочих дней
    точная стоимость будет определена после ознакомления с объектом исследования

    Итог — внесудебное исследование или документ специалиста по договору. Его наименование, представление и доказательственное значение зависят от вида процесса и оцениваются судом.

    Заказать исследование
    Проверка готового заключения

    Рецензирование

    от 40 000 ₽
    10 рабочих дней
    точная стоимость будет определена после ознакомления с заключением и приложениями

    Итог — письменная рецензия на готовое заключение. Она проверяет исходные данные, методы и выводы, но не отменяет заключение и не заменяет новое исследование объекта.

    Передать заключение на проверку
    Письменный ответ эксперта

    Консультация и справка

    от 20 000 ₽
    2-3 рабочих дня
    точная стоимость будет определена после ознакомления с объектом исследования

    Поможет предварительно оценить вопрос, определить перспективу исследования и подготовить дальнейшие действия.

    Описать вопрос
    Разбор задачи — без оплаты

    Проверим вид исследования, комплектность материалов и возможность работы. Если по присланным материалам видно, что ответить нельзя, скажем сразу и работу не возьмём. Когда материалы структурированы, предварительный прогноз тоже бесплатный; если разбор требует долгой работы эксперта, предупредим об этом до начала — тогда это платная консультация.

    Получить предварительную оценку
    Организация исследования

    Как строится работа над экспертизой

    До начала исследования уточним предмет задачи, состав материалов и формат итогового документа.

    1. 01 Предварительный разбор

      Проверяем компетенцию и сообщаем, можно ли провести исследование по поставленной задаче.

    2. 02 Вопросы и материалы

      Уточняем вопросы и сообщаем, каких документов или объектов не хватает.

    3. 03 Экспертное исследование

      Эксперт применяет профильные методики, фиксирует ход работы и обосновывает выводы.

    4. 04 Заключение и пояснения

      Передаём результат и при необходимости разъясняем суду применённую методику и выводы.

    Документы организации

    Ответы специалистов

    Частые вопросы

    Практические пояснения о назначении, материалах и использовании экспертного заключения.

    Все вопросы по направлению
    В каких спорах помогает экспертиза программы на C#?

    Исследование нужно там, где спор упирается в проверяемое состояние программы, а не только в толкование договора. Типичные поводы: подрядчик сдал учётную систему или веб-сервис, а заказчик считает задание невыполненным; исходники передали, но собрать из них работающую программу не выходит; сборки закрыты обфускатором; программа отказывает или со временем занимает всю память.

    Отдельный повод — проверка чужого заключения. Если экспертиза по делу уже проведена и её выводы вызывают сомнения, разбирают не программу, а сам документ: описание объектов, воспроизводимость проверок, обоснованность выводов.

    Не годится экспертиза там, где вопрос правовой: приняты ли работы, существенны ли недостатки, кто отвечает за срыв сроков. По .NET к ним добавляется частая просьба, которую эксперт тоже не выполняет: сказать, стоила ли работа заплаченных денег. Он устанавливает факты о программе, а правовую оценку даёт суд.

    Отдельная страница: В каких спорах помогает экспертиза программы на C#?
    Что даёт декомпиляция сборки .NET и чего не даёт?

    Даёт текст на C#, местами почти совпадающий с исходным. Программа на .NET обычно хранится не в машинном коде, а в промежуточном представлении, которое сохраняет имена классов, методов и полей и структуру типов; декомпиляторы вроде ILSpy, dnSpy и dotPeek выдают из него читаемый код. Но опубликовать программу можно и переведённой в машинный код, причём двумя способами: при первом промежуточное представление остаётся в файле рядом с машинным кодом и декомпиляция идёт как обычно, при втором его в файле нет — тогда она невозможна, как в C++. Что именно перед экспертом, устанавливают первым делом.

    Чего восстановление не даёт: комментариев и авторских пояснений — их не сохраняется никогда; имён локальных переменных, если рядом нет файлов отладочных данных. Исходного разбиения по файлам в самой сборке тоже нет, но при сохранённых отладочных данных — отдельным файлом или внутри сборки — пути исходных файлов и принадлежность им методов восстанавливаются из них.

    Поэтому восстановленный текст не тождествен исходному, и подменять им объект нельзя: в заключении указывают, что исследовалось — исходные тексты или результат декомпиляции, каким средством и какой версии. Доказательственное значение полученного вывода оценивает суд.

    Отдельная страница: Что даёт декомпиляция сборки .NET и чего не даёт?
    Сборки закрыты обфускатором — что это меняет для исследования?

    Смотря какое средство применено. При обычном переименовании исследование становится дольше, но предмет не исчезает: состав подключённых пакетов, обращения к базе и внешним сервисам, структура данных устанавливаются и по такой сборке, а спрятанные текстовые строки восстанавливаются наблюдением за работой программы. Есть и тяжёлые средства — упаковщики и преобразователи кода в собственное представление, — после которых привычные способы сразу не работают: сборку сначала приводят в обычный вид отдельными средствами, и удаётся это не всегда.

    Что действительно страдает — понимание назначения конкретных методов: имена заменены бессмысленными наборами знаков, и назначение приходится выводить из поведения. Такой вывод эксперт помечает как предположительный, а не выдаёт за установленный факт.

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

    Отдельная страница: Сборки закрыты обфускатором — что это меняет для исследования?
    Как проверяют, что программа собрана из переданного кода?

    Пересобирают переданный код и сравнивают результат со спорной программой — и по .NET такое сравнение строже, чем в большинстве языков. Причина в том, что сборка здесь по умолчанию детерминирована: при одинаковых входных данных и настройках результат совпадает вплоть до байта.

    Порядок такой: эксперт восстанавливает окружение — версию набора средств разработки, состав пакетов, настройки проекта, — собирает переданный текст дважды в намеренно разных условиях — в другом каталоге, под другой учётной записью, по возможности на другой машине — и сравнивает результаты между собой. Двух одинаковых прогонов для этого мало: они совпадут всегда и ничего не покажут. Только потом собранное сопоставляют со спорными файлами.

    С оговоркой: у старых проектов на .NET Framework детерминированности может не быть, а пути к исходным текстам попадают в файл и в современной сборке — эксперт задаёт нужные настройки заранее. Если прогоны расходятся, сравнивают не байты, а содержание: состав типов и методов, строки, внешние связи. Совпадение — сильный довод, расхождение само по себе обратного не доказывает и требует проверенного объяснения; оценивает вывод суд.

    Отдельная страница: Как проверяют, что программа собрана из переданного кода?
    Что доказывает подпись сборки и строгое имя?

    Механизмов два, и они разные. Строгое имя задумывалось как способ различать сборки с одинаковыми именами, а не как защита: подпись снимается и ставится заново другим ключом, а современные версии платформы её при запуске не проверяют. Вывод по нему возможен только сравнительный — отпечаток ключа в спорной сборке совпадает или нет с отпечатком в сборке известного происхождения. Цифровая подпись файла средствами операционной системы работает иначе: она проверяется системой и показывает издателя и то, что файл после подписания не менялся.

    А вот даты в ней самой по себе нет: время подписания ставит по часам своего компьютера тот, кто подписывал. Проверяемым фактом дата становится только при отметке времени независимой службы, и эксперт смотрит, есть ли она и кто её выдал. Без отметки вывод о дате по подписи не делают.

    Предел у такого вывода жёсткий. Авторства кода подпись не подтверждает: ключ передают подрядчику, он бывает общим у нескольких проектов, а неподписанные сборки — обычное дело для внутренних разработок. Поэтому подпись работает как один признак в совокупности, а не как самостоятельное доказательство; правовое значение этому признаку придаёт суд.

    Отдельная страница: Что доказывает подпись сборки и строгое имя?
    Как устанавливают состав пакетов NuGet и их лицензии?

    Читают то место, где список пакетов записан, и по .NET оно надёжнее, чем в большинстве языков. У современных проектов ссылки на пакеты хранятся прямо в файлах проекта, а при включённой блокировке версий — ещё и в отдельном файле, который закрепляет точный набор вместе с косвенными зависимостями. У старых проектов на .NET Framework их ищут в отдельном файле packages.config рядом с проектом.

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

    Условия использования изложены в сопровождающем пакет лицензионном документе — MIT, Apache, BSD, GPL, LGPL и других; встречаются и коммерческие библиотеки. Эксперт устанавливает, какой пакет какой версии подключён и каким документом сопровождается, и приводит его текст; толкование условий — за судом.

    Отдельная страница: Как устанавливают состав пакетов NuGet и их лицензии?
    Спор о переносе с .NET Framework: что установит эксперт?

    Это два разных спора, и различать их полезно до постановки вопросов. Первый — о выборе платформы: заказчик считает, что систему следовало делать на современной линейке .NET, а получил её на прежней .NET Framework. Эксперт устанавливает факт — под какую платформу и версию собрана программа; было ли требование к платформе в задании, определяют по документам, а без такого требования вывод о «неправильном выборе» становится оценочным — такую оценку даёт суд, а не эксперт.

    Второй — о полноте выполненного переноса. Здесь работа предметнее: сравнивают состав функций до и после, проверяют, какие части остались на прежней платформе и какие внешние компоненты не имеют замены, воспроизводят заявленные сценарии на обеих версиях.

    Типичные находки во втором случае — фрагменты, работающие через прослойку совместимости, и функции, изменившие поведение из-за смены версий библиотек.

    Отдельная страница: Спор о переносе с .NET Framework: что установит эксперт?
    Программа на C# падает: можно ли установить причину?

    Обычно да, и следов в .NET больше, чем в других средах. При необработанной ошибке среда выполнения записывает цепочку вызовов с именами методов, а при сохранённых файлах отладочных данных — и номера строк. Эти сведения попадают в журнал приложения, в журнал событий Windows или в файл снимка памяти, если его сохранение включено заранее.

    Важная оговорка: место, где отказ проявился, не всегда совпадает с местом дефекта. Поэтому цепочка вызовов — отправная точка исследования, а не готовый ответ. Зависание исследуют иначе: пока программа не отвечает, снимают снимок её состояния и смотрят, чем заняты потоки — ждут ли ответа базы или внешней системы, встали ли на общей блокировке.

    Причину эксперт устанавливает после проверки альтернативных объяснений: неверные входные данные, недоступность внешней системы, нехватка ресурсов, действия другой программы. Если журналов и снимков не сохранилось, он фиксирует это как ограничение. Дефект это или условия эксплуатации, оценивает суд: эксперт даёт для такого вывода техническое основание.

    Отдельная страница: Программа на C# падает: можно ли установить причину?
    Программа со временем занимает всю память — как это исследуют?

    Классическая утечка в .NET встречается реже, потому что память освобождается автоматически. Обычно причина другая: объекты остаются связанными с долгоживущим обработчиком событий, кешем или статическим полем и потому не освобождаются, хотя больше не нужны.

    Исследуют это воспроизведением на стенде — отдельном компьютере, настроенном как рабочий, — со снятием снимков состояния памяти в разные моменты и сравнением между ними: видно, какие объекты накапливаются и что их удерживает. Параллельно следят за общим потреблением процесса: если оно растёт, а объём управляемых объектов нет, память расходуется вне управляемой области — незакрытыми соединениями, файлами, графическими ресурсами.

    Условия воспроизведения должны совпадать с реальными: объём и характер данных, длительность работы, нагрузка. Вывод сопровождают указанием, при каком сценарии дефект воспроизведён, и оценкой того, наступают ли последствия при заявленном в задании режиме эксплуатации. Дефект это или условия эксплуатации, решает по этим данным суд.

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

    Потому что у решений на .NET значительная часть поведения задаётся вне кода, и исследование только по коду упрётся в вопрос, ответ на который лежал в настройке.

    Смотрят как минимум: файлы настроек приложения и веб-сервиса — строки подключения, адреса внешних систем, включённые и выключенные возможности; саму базу данных, где на SQL Server нередко живут справочники, правила расчёта, права доступа и хранимые процедуры; настройки площадки — параметры веб-сервера IIS или службы Windows, расписания фоновых задач, учётные записи; журналы обмена с внешними системами.

    Но этим не ограничивается: в современном .NET настройки перекрываются переменными окружения и параметрами запуска службы, поэтому их состав фиксируют отдельно, иначе один файл настроек картины не даёт. Суду важно видеть, при каких именно значениях получен результат. Одного каталога с программой обычно недостаточно, и объём материалов лучше согласовать заранее. Что именно нужно по вашему спору, скажем после первичного разбора.

    Отдельная страница: Почему для исследования нужен не только код, но и настройки?
    Как сравнивают две кодовые базы на C#?

    Сравнивают промежуточное представление, а не восстановленный текст: восстановление зависит от средства и его версии, и два инструмента дадут разный текст из одного файла. Промежуточный код от этого не зависит и потому пригоден для сопоставления — сравнивают состав типов и их членов, структуру и порядок операций, тексты сообщений, схему данных.

    Из сравнения сначала вычитают общее основание, причём в единицах того же представления: код пакетов, порождения среды разработки, стандартные конструкции языка и код, который дописывает сам компилятор, — развёрнутые асинхронные методы и перечислители, классы для замыканий, хранилища свойств. Последний слой совпадает у любых двух программ просто потому, что его создал один компилятор, и без его вычитания процент совпадения получается бессмысленно высоким.

    Значимыми считают совпадения, которые общим основанием не объясняются, и каждое проверяют вручную, а не принимают по проценту сходства из инструмента. Само по себе совпадение направления заимствования не показывает: кто у кого, устанавливают по датам и истории, а вывод о нарушении прав делает суд. Развёрнуто задача разобрана на странице экспертизы плагиата исходного кода.

    Отдельная страница: Как сравнивают две кодовые базы на C#?
    Как датируют спорную версию программы на C#?

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

    Дальше идут записи сервера сборки — когда, из чего и с какими настройками выпускалась версия; их подделать сложнее, потому что ведёт их отдельная система. К ним добавляют сведения о версии внутри файлов программы, журналы установки, резервные копии, переписку с вложениями и акты. Отдельно стоит отметка времени в цифровой подписи сборки, если она есть: это единственная дата, не зависящая от часов подписавшего, — файловые же метки переписываются копированием и переустановкой.

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

    Отдельная страница: Как датируют спорную версию программы на C#?
    На руках только работающая программа: что тогда?

    Работать по такой программе можно, и по .NET заметно больше, чем по другим языкам. Установленная у вас копия — полноценный объект исследования: по ней устанавливают состав классов и методов, обращения к базе и внешним системам, подключённые пакеты, тексты сообщений и значительную часть логики.

    Чего по ней не установить: содержания комментариев, исходных имён локальных переменных без файлов отладочных данных и того, какие решения принимал разработчик. Не работает и главный довод направления — контрольная сборка: собирать нечего, пока исходный текст не передан, и сравнение ведут по самой программе. Выводы о качестве исходного текста по восстановленному делают осторожно и с прямой оговоркой, что исследовался результат восстановления.

    Если исходный текст остался у подрядчика, его получают через суд: по возбуждённому делу заявляют ходатайство об истребовании доказательства, называя, что именно требуется, какие обстоятельства этим подтверждаются, где оно находится и почему получить его самому нельзя. По .NET в такое ходатайство просят включить и файлы отладочных данных: без них восстановление грубее.

    Отдельная страница: На руках только работающая программа: что тогда?
    Из переданного кода программа не собирается: что это доказывает?

    Невозможность собрать программу из переданного комплекта — самостоятельный технический факт, и устанавливается он воспроизводимо. Эксперт разворачивает окружение и фиксирует, на каком шаге сборка останавливается и чего именно не хватает: файлов проекта, пакетов, ключа подписи, файлов настроек, вспомогательных сборок.

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

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

    Отдельная страница: Из переданного кода программа не собирается: что это доказывает?
    Как проверяют требования, если программу не поднять на стенде?

    Способ проверки выбирают под требование. Требования об устройстве программы проверяют чтением исходного текста или восстановленного из сборки — с обязательным указанием, что именно исследовалось. Требования о поведении проверяют запуском на стенде: отдельном компьютере с той же версией платформы, базой и внешними системами или их заглушками.

    Часть требований завязана на данные заказчика или на внешние сервисы, которые на стенде не поднять. Такие проверки выполняют на площадке заказчика, по согласованному сценарию и в согласованное время. Односторонней проверка быть не должна: по судебной экспертизе лица, участвующие в деле, вправе присутствовать при её производстве, а порядок работ на площадке определяет назначивший орган.

    Если ни один способ не применим, эксперт указывает, какого объекта или каких условий не хватило, и оставляет вопрос без ответа. Это самостоятельный результат: он показывает суду, чего именно недостаёт. Если спор целиком о соответствии заданию и язык значения не имеет, задачу закрывает экспертиза соответствия работ техническому заданию.

    Отдельная страница: Как проверяют требования, если программу не поднять на стенде?
    Нужен ли эксперту доступ к работающей системе заказчика?

    Обычно требуется, и это стоит предусмотреть заранее. Программа на C# редко живёт сама по себе: ей нужны база, внешние сервисы, настройки веб-сервера IIS или службы Windows, учётные записи, от имени которых всё работает.

    Часть проверок удаётся выполнить на стенде, воспроизводящем эти условия. Но там, где требование завязано на данные заказчика или на внешние системы, проверку выполняют на его площадке: по согласованному сценарию и в согласованное время. Эксперт фиксирует условия и результат, а другая сторона по судебной экспертизе вправе при этом присутствовать. Возражение само по себе результат не отменяет — допустимость эксперимента оценивает суд, но проверка, поставленная без извещения другой стороны, эту оценку почти наверняка не выдержит.

    После назначения судебной экспертизы доступ к площадке согласуют через суд, а не напрямую с одной из сторон.

    Отдельная страница: Нужен ли эксперту доступ к работающей системе заказчика?
    Сколько кода в проекте на C# написал подрядчик?

    Считают в файлах, строках или типах, но не по всему каталогу проекта: сначала из него вычитают чужое и машинное. Это каталог загруженных пакетов, файлы, созданные средой разработки по шаблону, автоматически сгенерированный код — описания форм, модели данных, обёртки для обращения к службам, — а также тесты и артефакты сборки.

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

    Полученная величина — технический факт, а не сумма: строка сложной интеграции и сотня строк однотипного описания сущностей несопоставимы по трудозатратам. Выводы о принятом объёме и его цене делает суд, а расчёт для них даёт отдельная экспертиза объёма и стоимости работ.

    Отдельная страница: Сколько кода в проекте на C# написал подрядчик?
    Какие материалы собрать по спору о системе на .NET?

    Основной комплект: исходные тексты с файлами проекта и решения, хранилище исходных текстов с полной историей, собранные файлы спорной версии и, если есть, предыдущих, файлы отладочных данных, ссылки на пакеты и файл блокировки версий.

    К этому добавляют развёртывание и следы работы: файлы настроек приложения и площадки, выгрузку базы данных, журналы приложения и системы, снимки памяти при отказах, записи сервера сборки, журналы обмена с внешними системами.

    Из документов нужны техническое задание с приложениями, договор, акты, переписка сторон, задачи в системе учёта и документы на приобретение коммерческих компонентов. Собирать и передавать можно только то, что принадлежит вам или к чему у вас есть законное право доступа; чего не хватает — скажем после первичного разбора, а недостающее у другой стороны запрашивают через суд.

    Отдельная страница: Какие материалы собрать по спору о системе на .NET?
    Как передать материалы, если в настройках лежат пароли?

    В файлах настроек .NET почти всегда лежат строки подключения к базе с паролем, ключи внешних сервисов и учётные данные служебных записей. Вычищать их из копии нельзя: это изменит объект исследования.

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

    Соглашение о конфиденциальности связывает эксперта, но не участников дела: материалы, поступившие в суд, доступны сторонам, и закрытое заседание этого не меняет — оно закрывает зал от посторонних, а не дело от оппонента. Если раскрытие для вас неприемлемо, обсудите с юристом другие пути: ограничить объём передаваемого вопросами и просить об исследовании на вашей территории, без вывоза носителей.

    Отдельная страница: Как передать материалы, если в настройках лежат пароли?
    В базе есть персональные данные клиентов — как быть с выгрузкой?

    Объём выгрузки согласуют до отправки и по возможности ограничивают таблицами, относящимися к спору. Полная копия рабочей базы «на всякий случай» создаёт самостоятельный риск для вас как оператора и почти никогда не нужна для ответа на поставленные вопросы.

    Основание передачи при этом разное, и различать их нужно до отправки. При судебной экспертизе материалы идут в рамках производства по делу, через назначивший орган. Вне судебного производства оно само по себе не возникает: письменное поручение обработки эксперту, даже с перечнем разрешённых действий и обязанностью соблюдать конфиденциальность, описывает порядок, но не заменяет основания. Что подойдёт — согласие субъектов, иное предусмотренное законом основание или передача обезличенных данных, — решают с юристом до выгрузки. Условия поручения согласуют до передачи, а не после неё.

    Отдельно учитывают, что материалы, поступившие в суд, доступны сторонам: соглашение о конфиденциальности связывает эксперта, но не участников дела. Это тоже влияет на выбор объёма.

    Отдельная страница: В базе есть персональные данные клиентов — как быть с выгрузкой?
    Есть ли смысл заказывать экспертизу программы на C#?

    Это и выясняют до заказа, а не после. Предварительный разбор бесплатный: по описанию спора и перечню того, что у вас есть, мы говорим, относится ли задача к нашей компетенции, какие обстоятельства по таким материалам устанавливаются, а какие нет, и чего не хватает. Бывает и ответ «по этим материалам не установить ничего» — его тоже скажем сразу. Присылать архивы для этого не нужно.

    Если нужен документ, а не разговор, оформляют письменную консультацию по материалам: она отвечает не на все вопросы сразу, а на один — что вообще удастся установить по имеющимся сборкам, исходникам и журналам. Это отдельная платная работа, и с бесплатным разбором её не смешивают.

    Гарантировать заранее содержание будущих выводов нельзя: по .NET многое зависит от того, есть ли исходные тексты, закрыты ли сборки обфускатором и удастся ли поднять окружение с базой и внешними системами. А какое доказательственное значение получит готовое заключение, оценивает суд.

    Отдельная страница: Есть ли смысл заказывать экспертизу программы на C#?
    Как поставить вопрос эксперту о программе на C#?

    Вопрос работает, когда в нём назван объект и назван проверяемый критерий. Объект здесь — конкретный архив с контрольной суммой либо конкретный набор собранных файлов с указанием происхождения; критерий — пункт технического задания или иной документ.

    Полезно ставить вопросы раздельно: отдельно о том, является ли переданное исходным текстом спорной программы, отдельно о соответствии заданию, отдельно о применении обфускации, отдельно о причине отказа. И стоит предусмотреть ответ «на представленных материалах не проверяется».

    Формулировки вроде «качественно ли выполнены работы» непроверяемы, а просить эксперта оценить достаточность доказательств нельзя — это функция суда. При судебной экспертизе окончательный круг вопросов определяет суд; помощь с формулировками возможна до назначения.

    Отдельная страница: Как поставить вопрос эксперту о программе на C#?
    Чем отличается судебная экспертиза сборок .NET от внесудебной?

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

    По .NET разница особенно заметна на площадке и на стенде. Внесудебно эксперт работает с тем, что дал заказчик: его сборками, его копией базы, его площадкой. После назначения экспертизы сборки другой стороны, доступ к её серверу и к хранилищу исходных текстов запрашивают через назначивший орган, и он же определяет порядок и время работ на площадке.

    Стадия обычно и диктует выбор. До иска берут внесудебное исследование, чтобы понять, есть ли предмет, и обосновать ходатайство о назначении экспертизы. Требования к описанию объектов и к воспроизводимости в обоих случаях одинаковы: заключение, написанное без них, в деле не работает.

    Отдельная страница: Чем отличается судебная экспертиза сборок .NET от внесудебной?
    Сколько идёт и во что обходится экспертиза программы на C#?

    Ориентир по судебной экспертизе — от 100 000 ₽ и 10 рабочих дней; точную сумму и срок называют после бесплатного разбора и закрепляют договором до начала работы. Разброс задают три обстоятельства, и первое — есть ли исходные тексты и закрыты ли сборки: с исходниками работа предсказуема, по чистым сборкам она дольше, а обфусцированные добавляют ещё один порядок.

    Второе — сколько внешнего нужно поднять: программа на C# редко живёт сама по себе, и стенд с базой, внешними системами и настройками площадки готовится отдельно. Третье — нужен ли доступ к площадке заказчика: такие проверки согласуют по времени и порядку, и это отдельная строка расходов, как и участие специалиста в заседании.

    Дальше обычное: объём спорного контура, число проверяемых требований, количество вопросов, необходимость смежных специалистов. Отдельно об исходе «на представленных материалах не проверяется»: это тоже результат работы, он оплачивается наравне с любым другим, а суду показывает, какого объекта или условия не хватило.

    Отдельная страница: Сколько идёт и во что обходится экспертиза программы на C#?
    Как оспорить заключение о программе на платформе .NET?

    Проверяют путь к выводам. Первое — объекты: назван ли конкретный архив с контрольной суммой или конкретный набор файлов с указанием происхождения, и сказано ли, что исследовалось — исходный текст или результат восстановления. Смешение этих двух вещей — самая частая ошибка по .NET.

    Второе — как сделан вывод о соответствии сборки исходникам: проверял ли эксперт, повторяема ли сборка вообще, и не сравнивал ли байты там, где повторяемости нет. Третье — вычтено ли общее основание при подсчёте объёма и совпадений: без вычета пакетов и сгенерированного кода величины завышаются кратно.

    Отдельно смотрят, не вышел ли эксперт за пределы вопросов и компетенции: не дал ли правовой оценки лицензий, не распределил ли вину. Сама рецензия заключение не отменяет — она обосновывает ходатайство: о вызове эксперта для пояснений, о дополнительной экспертизе при неполноте или неясности, о повторной при сомнении в обоснованности заключения или при противоречиях в выводах. Заранее установленной силы у заключения нет, суд оценивает его наряду с другими доказательствами. Подробнее — на странице рецензии на заключение о процессе разработки.

    Отдельная страница: Как оспорить заключение о программе на платформе .NET?
    Обращение в организацию

    Отправьте материалы на предварительную оценку

    Приложите имеющиеся документы и кратко опишите задачу. Мы проверим компетенцию и комплектность, определим специальность эксперта и сообщим возможные срок и стоимость.

    Отправить материалы