Pull to refresh

Comments 36

Можете вкратце описать основные сценарии использования вашего продукта?
1. Чаще используют декомпилирование. В 1С возможна поставка конфигурации без исходного кода. Классы MdInternals.Cil восстанавливают исходный код из последовательности байт-кода OpCode 1С
2. Восстановление поврежденных конфигураций
3. Выгрузка конфигураций для средств версионирования. После выхода 1С 8.3 этот сценарий сомнительный. В 1С появилась опция выгрузки конфигурации в XML.
4. Автоматизация труда разработчика. Например, автоинкрементация номера версии в свойствах конфигурации или установка текущей даты. После выхода 1С 8.3 этот сценарий сомнительный. В 1С появилась опция выгрузки конфигурации в XML.
Имхо, несколько поздновато, уже появились открытые аналоги, хотя, конечно и не такие, что все-в-одном, как у вас. Но тем не менее, все равно, спасибо.
Выложил, потому что несколько лет не доходили руки до проекта. Есть подозрение, что не дойдут. Может кому-то пригодятся алгоритмы. Смысла нет скрывать их от энтузиастов.

В 2011 (судя по скриншоту) это было актуально. Сейчас — кажется не очень.

Декомпилирование до сих пор очень востребовано. С выходом выгрузки в XML, вы правы, все поменялось. Есть подозрение, что работа напрямую с cf в памяти может быть намного быстрее, чем выгрузка в XML на диск, обработка и загрузка из XML с диска.

Я имею ввиду возмодность читать дерево метаданных прям из файлов cf и cfe во встроенном языке в 8.3.14.

Очень интересно. Можете дать наводку, как называется объект доступа к cf из 1С? Записывать тоже можно?

Реализована возможность анализа метаданных, расположенных в файлах .cf или .cfe. Реализован конструктор для объекта ОбъектМетаданныхКонфигурация.
Реализована возможность получения имени конфигурации, номера версии и поставщика на основании файлов .cf или .cfe. Реализован объект ОписаниеКонфигурации.


Реализована возможность получить из файла .cfu список версий конфигурации, которые могут быть обновлены данным обновлением, а также версию конфигурации, которая получится в результате обновления. Реализован объект ОписаниеОбновленияКонфигурации.


Источник: http://downloads.v8.1c.ru/content//Platform/8_3_14_1494/1cv8upd_8_3_14_1494.htm#788ec9ef-0bf9-11e8-a3f7-0050569f678a

Декомпиляция нарушает лицензионное соглашение 1С.
Это не серьезное обвинение. Лично я не связан с 1С никакими обязательствами. Можно уточнить, что именно нарушает мой проект?
> Декомпиляция нарушает лицензионное соглашение 1С.

А обфускация байт-кода 1С не нарушает «лицензионное соглашение 1С»? А ведь некоторые фирмы распространяют подобные инструменты за деньги. А суть та же, что обфускация изменяет родной байт-код 1С, что деобфускация, или в данном случае простая декомпиляция кода защищенного стандартными средствами 1С? Аналогично архиваторы изменяют бинарный код и не только они, а ведь многие программы под лицензией «изменять бинарный код – ни-ни».

А ведь достаточно очевидно, чтобы создать коммерческий продукт по обфускации байт-кода 1С, фирма должна научиться сначала его деобфусцировать / декомпилировать, ведь спецификации подобного формата нигде нет. Кроме того, авторы, которые покупают обфускатры и защищают свой код, пишут там такое! Например, тупо отслеживают действия пользователя и скрытно собирают его информацию (а это законно?) и даже открыто сообщают ему об этом, типа: «Я вижу, что ты пытаешься декомпилировать программу, лучше напиши мне – продам ее за полцены!».
К сожалению, новизны здесь никакой нет. Даже «Классы MdInternals.Cil» которые «восстанавливают исходный код из последовательности байт-кода OpCode 1С» своей задачи явно не решают.

Выгрузка штатными средствами конфигурации в файл и широко известные утилиты по декомпиляции (необфусцированного) байт-кода 1С плюс бывший в наличии (сейчас не проверял) онлайн-ресурс по декомпиляции байт-кода 1С полностью перекрывают все возможности данной программы.

А «алгоритмы»? Кому они нужны, если они даже не демонстрируют простейших практических возможностей, хотя бы в той же «декомпиялции».

Вот попробуйте хотя бы для себя декомпилировать любой защищенный модуль коммерческой конфигурации и тогда расскажите нам, что у вас получилось :).
К сожалению, новизны здесь никакой нет. Даже «Классы MdInternals.Cil» которые «восстанавливают исходный код из последовательности байт-кода OpCode 1С» своей задачи явно не решают.

Статистика использования онлайн декомпилирования говорит об обратном.

бывший в наличии (сейчас не проверял) онлайн-ресурс по декомпиляции байт-кода 1С полностью перекрывают все возможности данной программы

Если имеется ввиду онлайн-ресурс www.1csoftware.com/dotnet/en-us/decompiler, то он работает и под капотом у него один-в-один выложенный мной проект MdInternals.Cil.

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

Я пробовал декомпиляторы .Net и C# над обфусцированным кодом. Не все справлялись с защитой. Не нужно обвинять проект в том, что он не приспособлен для обхода защиты. Нужен совсем другой подход и проект.
> под капотом у него один-в-один выложенный мной проект MdInternals.Cil.

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

> Я пробовал декомпиляторы .Net и C# над обфусцированным кодом. Не все справлялись с защитой.

А что, есть и такие, что справляются?

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

Это не обвинение, это сожаление.

P.S. Пару слов насчет обфускации байт кода 1С8х. Последние версии коммерческих обфускаторов используют много новых приемов защиты. Однако нужно понимать, что для специалиста это все не слишком серьезно. Общая идея обфускации простая, используется функционально эквивалентный байт-код, который усложняет процесс его восстановления на уровне ЯВУ (языка высокого уровня). Это может осуществляться как за счет добавления избыточной топологии к исходному бинарному циклическому графу, так и за счет якобы шифрования строковых констант и т.п., вроде использования специфики конкретных команд байт-кода. Шифрование не слишком серьезно потому, что в том же модуле всегда присутствует (обфусцированная) функция дешифрования. А с избыточной топологией, в том числе и «мусорным» кодом, можно легко бороться известными аналитическими методами. Главное здесь то, что, согласно математической теореме: «Любые эквивалентные преобразования обратимы», а это означает принципиальную декомпиляцию обфусцированного байт-кода на уровне ЯВУ.

А вот, скажем, на уровне синтаксиса, обфускация является синтаксически неэквивалентной, поэтому в этом смысле она необратима. И, действительно, невозможно восстановить удаленные комментарии и необратимо измененные пользовательские имена переменных, процедур и функций. Однако функционально эквивалентный код уровня ЯВУ всегда можно получить без особых проблем. Алгоритмы там настолько просты, что просто удивительно, что про них никто не знает или не говорит вслух. Я тоже промолчу. А вам достаточно подсказки насчет самой обратимости и существования простого алгоритма этой обратимости.
Об этом можно было бы сказать в статье. Это, по крайней мере, дает представление о возможностях вашей программы. Однако онлайн-ресурс откровенно слабый, даже не формирует внешние переменные модуля. Про операторы модуля уже не помню, может быть тоже не формирует.

На специализированных 1С ресурсах статьи про декомпилирование блокируются. Поэтому упоминал здесь вскользь. Не знал, как Хабр отнесется к этой теме.

А вам достаточно подсказки насчет самой обратимости и существования простого алгоритма этой обратимости.

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

Быстрое решение в свое время мне найти не удалось. Списал это на свое незнание существующих алгоритмах декомпилирования. Вспомню несколько приемов обфускаци:
1. Изменение имени переменных и шифрование строковых констант
2. Добавление кода, который никогда не вызывается. Код прячется в ветвления условий if-then
3. Усложнение логических выражений. Например, добавление к ним по И сложного выражения, возвращающего всегда True
4. Удаление нумерации строк
А как вам рассечение выражений условными операторами? Одно длинное выражение может быть рассечено несколько раз. И все это перемешивается с «мусорным» кодом в ветвях, которые никогда не получают управление. А оператор Попытка / Исключение / КонецПопытки? Здесь тоже можно изощрятся так, что мало не покажется. Но и это все лечится при правильном подходе :).

P.S. Нумерация строк не нужна от слова «совсем».
> Алгоритм декомпиляции прост для не защищенного кода.

Согласен, прост. Для такого кода можно найти обработки 1С8 восстанавливающие исходный текст. Они старые, 2010-2013 годов, судя по датам файлов. Автор у них один, и есть большое подозрение, что он сейчас работает на фирму, которая создает коммерческие обфускаторы. Как говорится в подобных случаях – самые лучшие антихакеры это бывшие хакеры.

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

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

Что касается «разрушения сигнатуры кода», то возможно вы имеете в виду, что байт-код 1С8х может отличаться от оригинального? Конечно, может, возможности у него несколько шире, чем у исходного кода «восьмерки». И авторы обфускаторов этим пользуются на полную катушку. Иной раз просто поражаешься изощренности их мышления. Но, тем не менее, байт-код 1С8 это не ассемблер, принципиально иного, чем на исходном ЯВУ (языке высокого уровня) там мало, что можно сделать. Соответственно и возможности восстановить код ЯВУ на уровне функциональной эквивалентности вполне возможно.

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

Я сказал достаточно много. Если бы у меня была эта информация заранее, то я бы сэкономил себе несколько лишних месяцев программирования.

Люди, которые говорят, ««это» просто, мне просто лень делать» — обычно не способны сделать «это».


Вы правы, создание обфускатора не возможно без создания декомпилятора. Но на сколько мне известно, ни один создатель коммерческого обфускатора (мне известно о 4х, из них сейчас продаются 3) не публиковал свой декомпилятор. Мне кажется это потому, что глупо раздавать знания, которые приносят деньги.


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


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

> создание обфускатора не возможно без создания декомпилятора

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

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

Глупости все это. Все очень даже понятно. Да, вместо случайных имен используются псевдоимена, типа «ЛокальнаяПроцедура001», «ЛокальнаяФункция002», Var_123, Par_321, Label_5555 и т.п. Но это практически нисколько не затемняет исходный код, ведь код 1С перенасыщен русским текстом. Причем, закрывают обычно наиболее значимые модули, исходный текст которых может иметь особую ценность.

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

И я сделал, ну и что из того? На ее создание у меня ушло менее 10% общего времени, остальное время ушло на понимание концепции алгоритма, которую я вам изложил. Только вот всегда цениться именно та информация, которая получена собственным «потом и кровью». Готовый результат никогда и никем адекватно не воспринимается.

Т.е. у вас есть инструмент для декомпиляции обфусцированного кода? У меня иногда возникает необходимость вскрытия такого кода. Я обращусь к вам в следующий раз.

> Т.е. у вас есть инструмент для декомпиляции обфусцированного кода?

Да, есть, заканчиваю уже его третью версию.

> У меня иногда возникает необходимость вскрытия такого кода. Я обращусь к вам в следующий раз.

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

Зачем вы сделали продукт, если вы его не продаете и услуги не оказываете? В чем выхлоп?

> Зачем вы сделали продукт, если вы его не продаете и услуги не оказываете? В чем выхлоп?

Я же сказал – «Развитие!». Продавать и оказывать услуги на этом поприще рискованно, можно нарваться на неприятности. А оно мне надо? Кроме того, у меня нет цели, ущемлять интересы авторов продуктов. А вот в плане развития это самое то! Вообще, смысл существования всего Сущего во Вселенной это Развитие. В т.ч. это касается человека. При условии неприемлемости немотивированного ущерба окружающим людям и окружающей среде.

Эта задача просто идеальная в плане соотношения усилий и результатов. Решив ее, вы почувствуете себя на другом уровне развития, что, конечно приносит колоссальное удовлетворение. Естественно, что результаты творчества дают новые возможности. А вот разумное и адекватное их использование определяет уже нравственную сторону развития личности. В общем, как-то так :).

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

Вы так говорите, как будто байт-код 1С имеет общеизвестный формат, а проблему «запутывания» мешает решать исключительно лень. Открою маленький секрет: 80% адинесников даже не знает, что существует способ получения исходного кода запароленного модуля без всякой обфускации; а людей (не считая сотрудников 1С), которые самостоятельно разобрались в формате байт-кода, вообще единицы. Некому об этом говорить!
> Вы так говорите, как будто байт-код 1С имеет общеизвестный формат, а проблему «запутывания» мешает решать исключительно лень.

Формат не общедоступный, но восстанавливается вполне тривиально. Достаточно две-три недели плотно посидеть на экспериментах. Берете свой код ЯВУ, шифруете его, а потом смотрите, какой ему соответствует байт-код 1С. Это просто рутинная работа, требующая определенного времени и труда. Кое-что что можно найти на форумах. Первые соответствия я нашел именно там. Заметим, что все фирмы, выпускающие коммерческие обфускаторы, получали подобную спецификацию именно таким образом. Да, кое-какие номера команды остаются нерасшифрованными, просто для них еще не было реального соответствия в исходном коде «восьмерки».

> Открою маленький секрет: 80% адинесников даже не знает, что существует способ получения исходного кода запароленного модуля без всякой обфускации; а людей (не считая сотрудников 1С), которые самостоятельно разобрались в формате байт-кода, вообще единицы. Некому об этом говорить!

Многие не знают, как снять пользовательский пароль для входа в 1С. И что теперь? 20% 1С-ников это, на самом деле, очень много. На специализированных форумах по 1С тусуются тысячи людей, сотни из которых – высококлассные специалисты. Некоторые из них даже относят себя к касте, которые знают, как дешифровать необфусцированный байт-код. Таких порядка десяти человек. Вполне достаточно для общения. Хотя, естественно, подробно никто ничего говорить не хочет, хотя раньше на эту тему общались более свободно. Понятно, ибо зачем себе создавать лишние проблемы :).
А готовую версию программы сможете тоже выложить, для тех, кто не в курсе C#?
ValeriVP Emelian Не кажется вам, что нужна отдельная статья на тему Декомпилирования кода 1С на Хабре? Судя по опыту этой статьи, Хабр не будет удалять статью про алгоритм декомпилирования, как делает Infostart? Можно написать в соавторстве, может написать кто-то один и комментариями значительно расширить статью?

У меня на сайте были мои видео на эту тему. 1С попросила убрать.

Давайте восстановим видео. Можно на моей странице декомпилирования, можно в новой статье на Хабре. У меня были похожие требования от 1С, я их вежливо отправил жаловаться моему хостеру. Хостинг у меня в США, домен com тоже зарегистрирован зарубежом. Забавно было бы увидеть суть их претензий. Вы же видите, Хабр тоже не удалил эту статью, на него можно рассчитывать. На Инфостарт нельзя рассчитывать.

Какой мне профит в публикации своих материалов на чужом сайте?

Я бы мог углубиться в тему, что вставленное на страницу youtube видео содержит ссылку на автора и его канал. Но вижу, что соавторство и сотрудничество при меркантильном подходе не получится. Один создал навороченную программу по декомпилированию, но никому не даст результат. Второй — создал видео, но никому его не покажет. Но оба сидят на страницах сайта с выложенными кем-то бесплатными материалами и результатами. Вы дополняете друг друга и удивительным образом нашли друг друга среди миллиардов страниц в Интернете. Чудеса на Рождество все-таки случаются))).
Я создал коммерческий обфускатор (www.v8-zk.ru). И мне нет никакого смысла в публикации каких либо материалов о взломе нигде, кроме моего сайта.

При этом я делюсь своими наработками в других областях.
Sign up to leave a comment.

Articles