gifts2017

Обфускация кода 1С (приведение в нечитаемый вид) для платформы 1С:Предприятие 8.3.7

Опубликовал Андрей Закусов (masterkio) в раздел Программирование - Защита и шифрование

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

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


Выполняются следующие действия:

  • Убираются Области;
  • Убираются все комментарии;
  • Имена не экспортных функций преобразуются в набор символов;
  • Имена переменных преобразуются в набор символов;
  • Убираются переносы строк;
  • Шифруются строковые константы в тексте в нечитаемый набор символов;
  • Вставляются ничего не значащие функции и выражения в код.

Добавлено и исправлено в версии 2:

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

С помощью обработки можно изменять код общих модулей и модули объектов и менеджеров.

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

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

Использование обработки:

  1. В верхнее текстовое поле вставляется исходных код модуля;
  2. Нажимается кнопка «Обработать»;
  3. Выводится список идентификаторов для замены. Те идентификаторы, у которых стоит флаг, считаются экспортными и заменяться не будут.  По умолчанию флаги установлены у экспортных функций и переменных, при необходимости их можно установить/снять вручную.
  4. В нижнем текстовом поле выводится обработанный текст.
 

Код обработки открыт.

Используются только средства встроенного языка 1С.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Обфускация кода 1С (приведение в нечитаемый вид) для платформы 1С:Предприятие 8.3.7
.epf 12,53Kb
04.12.16
146
.epf 12,53Kb 146 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Павел (Pavgorb) 21.12.15 18:16
Обновил до 8.3.7, запустил в режиме толстого клиента, конвертировал...
Увы, после переноса текста в исходную обработку возникли синтаксические ошибки.
Пока не понял в чем дело, но похоже "не любит" двойные кавычки, Экспорт и представление дат в явном виде.
2. Андрей Овсянкин (Evil Beaver) 21.12.15 18:34
Замена идентификаторов на GUID (с добавлением "х", чтобы начиналось с буквы), это еще не обфускация.
CSiER; TreeDogNight; u_n_k_n_o_w_n; qweento; Andreyyy; Yashazz; awa; JohnyDeath; +8 Ответить 2
3. Андрей Закусов (masterkio) 21.12.15 18:47
(1) Pavgorb, Если есть возможность, можете прислать обработку, в которой такое происходит, что бы я смог исправить ошибку?
4. Андрей Закусов (masterkio) 21.12.15 18:48
(2) Evil Beaver, предложите, что еще можно сделать используя только встроенный язык.
5. Maxim Kolkin (the1) 22.12.15 08:36
(3) masterkio, у меня тоже возникли синтаксические ошибки. Пытался обфусцировать код формы Вашей обработки.
6. Maxim Kolkin (the1) 22.12.15 08:40
(2) Evil Beaver, Обфуска́ция — приведение исходного текста или исполняемого кода программы к виду, сохраняющему ее функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции. По моему, обработка подходит под определение.
7. Андрей Закусов (masterkio) 22.12.15 08:58
(5) the1, Для формы не подходит, т.к. там заменяются переменные, которые являются реквизитами формы, поэтому возникают ошибки.
В описании написано, что только для общих модулей и модулей объектов и модулей менеджеров.

По формам думал, но к сожалению, обработкой не возможно пользоваться, если в конфигурации стоит режим совместимости, с версиями ниже 8.3.7, соответственно не получиться указать нужную форму, для анализа ее реквизитов. А т.к. сейчас львиная доля конфигураций еще в режиме совместимости, то я решил отказаться от этого в угоду универсальности обработки.
8. Allexey (alex_4x) 22.12.15 10:47
Для модулей форм просто надо добавить таблицу, в которую сам пользователь (ну тот кто шифрует) вносит переменные, используемые на форме и они не шифруются.
или другой вариант - после шифрации дается таблица, по которой эти реквизиты на форме руками переименовываются в "кривые" названия.
Конечно это не полная автоматизация но выход.
В твоей шифровалке обрабатываются дерективы препроцессора ?
поток выполнения может быть запутан ?

Хорошо бы порядок аргументов и их количество в вызываемых функциях менять, добавлять "контрольные" аргументы, при неправильном значении которых начинает происходить всякая дребедень - это будет некой защитой от отладки. Опять же область видимости переменных - с этим также можно устроить путаницу. так как в 1С нет ни строгой типизации типов - это еще один механизм, который можно применять для усложнения читаемости кода.
9. Андрей Закусов (masterkio) 22.12.15 12:36
(8) alex_4x,
Для модулей форм просто надо добавить таблицу, в которую сам пользователь (ну тот кто шифрует) вносит переменные, используемые на форме и они не шифруются.

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

Такая таблица есть - кнопка "Посмотреть таблицу замены"

В твоей шифровалке обрабатываются дерективы препроцессора ?

Нет, а как и с какой целью их можно обрабатывать, не особо представляю.

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

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

добавлять "контрольные" аргументы
не очень понял, что это.

пять же область видимости переменных - с этим также можно устроить путаницу
тоже не очень понял, как это можно применить.
10. Яков Коган (Yashazz) 22.12.15 16:43
Согласен, не обфускация это в полном смысле слова. Вообще, интереснее всего делать такие преобразования, чтобы требовался некий "ключ", без которого код превращается в пусть и читабельную, но трудноотлаживаемую и незапускаемую "кашу". Т.е. потратив N времени, можно довести код до ума, но трудозатраты должны быть огромны. И вот элементарной заменой на этот ключ код превращался бы в работающий и правильный, вот это было бы круто.

А это - извините, и автору самому потом с таким невозможно работать.
11. Андрей Закусов (masterkio) 22.12.15 17:57
(10) Yashazz, то о чем вы пишите, совсем другая задача, и не понятно зачем это нужно, если у разработчика просто есть исходник с нормальным текстом, а в поставку вы просто включаете испорченный код.
12. Александр Хомяк (logarifm) 23.12.15 00:04
Хорошая идея, автору однозначно +
А идея насчет обратного прнобразования думаю тоже кто-то разработает, все в свое время...
u_n_k_n_o_w_n; +1 Ответить 1
13. Александр (МимохожийОднако) 23.12.15 07:43
(12) logarifm, всё гораздо проще. Для случаев разбора обработанного кода и необходимости правки вполне помогает отладчик, мозг и команда найти-заменить.
14. Александр Пузаков (puzakov) 23.12.15 09:48
Интересно, и почему так много "больных" защитой своего кода разработчиков?
Dr.ZIG; Accident; nikaleks; adelair; so-quest; kotloff; Bell; Evil Beaver; +8 Ответить 3
15. Михаил (Оберон) 23.12.15 10:15
(14) puzakov, потому что жадность!!!
16. Трактор Трактор (Трактор) 23.12.15 10:56
15 лет назад я такой же хренью страдал. Потом понял, что всё фигня.
17. Андрей Закусов (masterkio) 23.12.15 11:33
(14) puzakov, потому что много не порядочных внедренцев.
1v7; MRAK; +2 2 Ответить
18. Пользователь Инфостарта (infostart user) 23.12.15 11:54
19. Валентин Бомбин (so-quest) 23.12.15 11:57
Такое через регэкспы еще лет пять назад делали.
Автор, твою бы энергию да в правильное русло... Эта задача проще решается через построение AST и последующий обход.

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

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

По парсерам если будут интересны наработки - смотри тут https://github.com/wwall/disa_da
Там правда все на 1С. что не совсем честно по отношению к быстродействию и анализу кода.
h00k; Evil Beaver; +2 Ответить 1
20. Андрей Закусов (masterkio) 23.12.15 12:13
(19) so-quest,
А самое интересное - когда сделаешь, приходит понимание что глупость это все... И тратить время на то что бы приводить код к нечитаемому виду - в принципе! не стоит. Слишком просто разбирается назад.


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

Может, конечно это и ерунда все, но я для себя не нашел другого - бесплатного и простого способа хоть как-то защитить конфигурацию. А просто отдавать без защиты - лишать себя денег.
DrVitaly; +1 Ответить
21. Валентин Бомбин (so-quest) 23.12.15 12:23
>как следствие стоимость этого обратного разбор больше, чем сам продукт.
Вы в принципе в вопросе не разобрались. Стоимость разбора вашего обработанного кода - ни о чем. Час работы на обход дерева, полчаса покурить. У вас ведь не меняется ничего, кроме синтаксического представления. Единственное чего нельзя будет восстановить - имена переменных и комментарии.
22. Андрей Закусов (masterkio) 23.12.15 14:09
(21) so-quest,
Вы в принципе в вопросе не разобрались
в каком вопросе я не разобрался?

Стоимость разбора вашего обработанного кода - ни о чем. Час работы на обход дерева, полчаса покурить. У вас ведь не меняется ничего, кроме синтаксического представления. Единственное чего нельзя будет восстановить - имена переменных и комментарии.


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

1.5 часа для, например Москвы, это уже ~ 3000 рублей, т.е. все что дешевле уже не оправданно даже пытаться декодировать.

Ну и, думаю, 1.5 часа это преувеличение, по крайней мере не каждый специалист сделает за такой срок. + там не только изменение синтаксического представления, есть и еще некоторые "запутки", пусть немного, но тоже усложнят дешифровку.
23. Андрей Овсянкин (Evil Beaver) 23.12.15 14:27
(4) (6) masterkio, the1 обычно еще добавляют запутывание control-flow. Добавляют неочевидные условия, goto-переходы и т.п. Но это, конечно отдельная сложная и интересная тема.

Например. Если вы даже без переименования идентификаторов замените все условия и циклы на GOTO - уже никто разбираться не захочет. И для форм сработает, ибо идентификаторы целы.
24. Валентин Бомбин (so-quest) 23.12.15 15:19
> в каком вопросе я не разобрался?
В вопросе построения обфусикаторов. В (23) тебе описали что надо. Решается все это весьма просто - берешь любой парсер 1С который тебе нравиться, или пишешь свой. Строишь по AST списки переходов, трансформируешь в новый автомат и на выходе - реально обфусицированный код. В котором никто даже разбираться не будет.

ОФФ -
Вот что мне нравиться в писателях всяких обфусикаторов - так это их непоколебимая уверенность что их код нужен кому-то, кроме них самих и одного/двух клиентов кому умудрились впарить свое творение.

25. Андрей Закусов (masterkio) 23.12.15 16:09
(24) so-quest,
В вопросе построения обфусикаторов. В (23) тебе описали что надо. Решается все это весьма просто - берешь любой парсер 1С который тебе нравиться, или пишешь свой. Строишь по AST списки переходов, трансформируешь в новый автомат и на выходе - реально обфусицированный код. В котором никто даже разбираться не будет.

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

ОФФ -
Вот что мне нравиться в писателях всяких обфусикаторов - так это их непоколебимая уверенность что их код нужен кому-то, кроме них самих и одного/двух клиентов кому умудрились впарить свое творение.


Не понимаю такой агрессии, если не нужен - так ок, а если нужен, то отдавать его просто так по меньшей мере глупо.

Разбираетесь в чем-то лучше? посоветуйте как лучше или просто промолчите. Зачем писать в какой-то уничижительной форме про других людей? Я думаю найдется куча народа, для которых и ваш код/работа/результаты труда будут никчемным.
ekaruk; CyberCerber; 1attimo; +3 Ответить
26. Валентин Бомбин (so-quest) 23.12.15 16:32
Я высказал свое мнение. Оно не совпало с вашим. В этом проявление агрессии? Насчет лучше или нет - да, в вопросах анализа кода и обфусикации разбираюсь лучше. И выше указал что ваша разработка - пустая трата времени. Вы не согласились и попытались отстоять свою точку зрения. Не получилось. Среагировали на ОФФ и решили перевести обсуждение в выяснение личных отношений. В связи с чем вопрос - где в моем поведении агрессия? Чем я так вас обидел? Считаете что ваша обработка нужна - хорошо. Не хотите ее обсуждать - пусть будет так.

Если обидел чем вас - простите. Не хотел я такого.
Еще раз - простите
27. Андрей Закусов (masterkio) 23.12.15 16:51
Я высказал свое мнение. Оно не совпало с вашим. В этом проявление агрессии?
нет, конечно, только в том, что вы перешли на личности, написав что работа таких как я никому не нужна. Тут я с вами совершенно не согласен.

Насчет лучше или нет - да, в вопросах анализа кода и обфусикации разбираюсь лучше.
Именно это я и отметил, и признаю это.

И выше указал что ваша разработка - пустая трата времени.
нет не пустая, какая бы никчемная и глупая она ни была. + когда мне нужна была подобного рода штука, чтобы хоть как то защитить свой никому не нужный код, я не нашел НИЧЕГО (по крайней мере бесплатного), написанного людьми разбирающимися хорошо в этом вопросе, например, как вы. Нашел только обработку, которая выкладывалась тут же и она сделана в том же ключе как у меня, я занялся своей, т.к. в той не обрабатывался современный код и ее код был закрыт.
И я надеюсь что моя обработка помогла тем, кто ее скачал.

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

Среагировали на ОФФ и решили перевести обсуждение в выяснение личных отношений. В связи с чем вопрос - где в моем поведении агрессия? Чем я так вас обидел?
перешли на личности именно вы, и да, называть чью то работу никому не нужной (и вы говорили не о моей обработке, а о работе всех тех людей, которые пожелали ей воспользоваться) - это если не оскорбление, то неприятный выпад.

Ваш комментарий сначала посчитал самым полезным, вы предоставили некие наработки, давали реальные советы... а потом занялись каким-то само восхвалением...печально.
28. Сан Саныч (herfis) 23.12.15 17:42
А я вот не совсем понимаю, в чем смысл защиты обфусцированием вообще.
Защита авторских прав на код? Усложнить модифицирование кода?
Чтобы можно было "вот вам версия типа без исходников", а если захотите сами дорабатывать - доплатите?
Тут редкий раз вообще встретишь код, который можно дорабатывать без отвращения.
Да и нечасто это требуется, как мне кажется. Если речь об обработках, так 99% используют их as is.
С конфой, в принципе, тоже самое. Но конфу, если очень хочется, и так можно поставлять без исходников общих модулей, хотя опять таки непонятно - зачем.
Спрятать "гениальные" приемы программирования? Не смешите мои тапочки.
Чтобы кто-то не выдал твою конфу за свою? Это еще заслужить надо. Единицы добиваются такого ошеломительного успеха. И в этом случае доказать свое авторство обычно особой проблемы не составляет.
for-elenak; Bell; +2 Ответить 1
29. Андрей Закусов (masterkio) 23.12.15 18:16
(28) herfis,
Если кофа - то чем хуже поставка без исходных кодов?

я лично использую и то и другое, т.е. делаю код не читаемым и потом модуль не включаю.
for-elenak; the1; +2 Ответить 1
30. Сан Саныч (herfis) 23.12.15 18:20
(29) masterkio, Простой вопрос - зачем?
31. Сан Саныч (herfis) 23.12.15 18:25
Хотя, если это работает как маркетинговый прием, тогда есть смысл.
Типа с исходниками, это "all inclusive" и поэтому дороже. И народ такой - цена вопроса небольшая, так зачем брать с урезанными возможностями?
Если это работает, тогда ладно.
32. antz Петров (antz) 23.12.15 19:00
(14) puzakov, многим стыдно за свой код.
y22-k; lefthander; mamanelli; darkmessiahan; Accident; Захаров_Николай; so-quest; Bell; +8 Ответить
33. Владимир Гусев (adhocprog) 23.12.15 19:20
34. Андрей Закусов (masterkio) 23.12.15 19:28
(31) herfis,
Смысл простой.
Есть у вас дополнение к конфигурации, вы продаете ее за деньги, если ни как её не защитить, то один купивший может раздать ее всем своим знакомым, например, или если купил внедренец, то он может поставить ее многим клиентам получив за это деньги, а вам не достанется ничего.

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

biformatus; +1 Ответить 1
35. Валентин Бомбин (so-quest) 23.12.15 21:21
>а потом занялись каким-то само восхвалением...печально.
Печально что вы так и не поняли о чем же тут вам говорили Для вас обфусикация - это маленькие желтые кругляшки именуемые деньгами. Но ни как не часть достаточно большой и интересной математической дисциплины о компиляции и анализе. Приложив хоть немного усилий к изучению которой вы бы добились больших результатов.
Но ведь некогда... Какой-то подлый внедренец именно сейчас ворует ваш гениальный код и из-под полы в переходе метро продает его. И только вы можете с этим боротьбся. И только обфусикация кода с этим справиться.

тьфу. Теорема БЖ-Соболя в действии



36. Вячеслав Павелко (slawanix) 23.12.15 21:35
Я конечно понимаю, жадность там и все такое. Но когда такое делается в среде, изначально ориентированной на открытый код и возможность доработки любой конфигурации сторонними программистами... Ну вот тогда я не очень понимаю. Интересно, веб-разработчики свой код на яве и пхп тоже так стремятся защищать?
37. Андрей Закусов (masterkio) 23.12.15 21:53
(35) so-quest, по-моему вас вообще не туда понесло... :)
38. Андрей Закусов (masterkio) 23.12.15 21:56
(36) slawanix,
но ведь 1С не бесплатный продукт, если бы они дали возможность защищать свои разработки без закрытия кода, его бы не надо было закрывать.
Почти все партнерские решения имеют закрытый код, такова реальность.
39. Вячеслав Павелко (slawanix) 24.12.15 00:05
(38) masterkio, ну допустим я согласен с тем, что разработчики отраслевых конфигураций, с действительно оригинальными решениями, защищают свой продукт ключами, е-токенами и т.д. Но, если ты работаешь у франча, пишешь всякие там обработки на каждый день, отчеты и печатные формы... Не пойму, что действительно есть такая потребность в обфускации. Не догоняю, не опытный я в этих делах. Может подскажете, когда такая потребность возникает? И вот это вот:
Почти все партнерские решения имеют закрытый код, такова реальность.
Они поставляют конфигурации с закрытым или с обфуксированным кодом? Ведь это разные вещи.
40. Андрей Закусов (masterkio) 24.12.15 09:43
(39) slawanix,
Наверно, каждый сам определяет для чего ему это надо .
Для меня
Но, если ты работаешь у франча, пишешь всякие там обработки на каждый день, отчеты и печатные формы... Не пойму, что действительно есть такая потребность в обфускации
- в этом случае не вижу смысла, скорее это даже вред и противоречие этике внедренцев/разработчиков 1С.

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

Они поставляют конфигурации с закрытым или с обфуксированным кодом? Ведь это разные вещи.
- цель одна, скрыть от возможности редактирования часть кода. Просто обфускация + не включение модуля в поставку - это, пусть самая не надежная, но доступная и бесплатная возможность это сделать. Все остальные способы защиты, как правило, требуют дополнительных финансовых затрат.
41. Сан Саныч (herfis) 24.12.15 10:18
(34) masterkio, Что-что?? Защита пин-кодом в обфусцированном коде? Seriously? Небольшая защита? Выложи на спор такую "защиту", замерим время на "взлом". ИМХО, защита не лучше консервной банки. Пока содержимое не нужно - вполне себе защищает.
ЗЫ. Уточню свою мысль. С точки зрения защиты от несанкционированного выполнения кода, обфускация не дает ровным счетом НИЧЕГО. Кто утверждает обратное - не дружит с головой. Единственное, на что способна обфускация в принципе - защита авторских прав и некоторый уровень защиты от модификации кода.
42. Андрей Закусов (masterkio) 24.12.15 10:50
(41) herfis,
Что-что?? Защита пин-кодом в обфусцированном коде? Seriously? Небольшая защита? Выложи на спор такую "защиту", замерим время на "взлом". ИМХО, защита не лучше консервной банки.

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

С точки зрения защиты от несанкционированного выполнения кода, обфускация не дает ровным счетом НИЧЕГО. Кто утверждает обратное - не дружит с головой. Единственное, на что способна обфускация в принципе - защита авторских прав и некоторый уровень защиты от модификации кода.

-она дает защиту модуля от модификации, в который можно встроить защиту от несанкционированного выполнения. Понятно, что не во всех случаях это возможно, но думаю для многих задач можно придумать такого рода защиту.
43. Сан Саныч (herfis) 24.12.15 11:03
(42) masterkio,
в который можно встроить защиту от несанкционированного выполнения

Это иллюзия, которая не выдерживает банальной проверки здравым смыслом. Никаких навыков и опыта для этого не требуется. Можно вообще вчера 1С увидеть первый раз. Достаточно знать, что такое отладчик и азы информатики.
Ну подумайте сами. Вы видите, что на определенном этапе выскакивает проверка пин-кода. Модуль где это происходит, хотя бы корневой - очевиден. Включаете пошаговую отладку и просто идете пока не выскочит окошко. С этого момента отследить, как дальше проходит алгоритм проверки и воткнуть его обход - ничего не стоит.
44. Андрей Закусов (masterkio) 24.12.15 11:28
(43) herfis,
Ну подумайте сами. Вы видите, что на определенном этапе выскакивает проверка пин-кода. Модуль где это происходит, хотя бы корневой - очевиден. Включаете пошаговую отладку и просто идете пока не выскочит окошко. С этого момента отследить, как дальше проходит алгоритм проверки и воткнуть его обход - ничего не стоит.

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

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

Так что то, что вы пишите не совсем верно, опять же все сводится к взлому модуля.
45. Allexey (alex_4x) 24.12.15 13:30
Мне кажется морально-этические нормы и цели обфускации кода - это отдельная тема, а техническая реализация - совсем другая тема. И зачем их обсуждать одновременно - непонятно.
Предположим нужно сделать реально недекомпилируемый, не поддающийся анализу техническими средствами код 1С.
Какие этапы для этого нужно выполнить, чтобы:
1. Гарантировать работоспособность этого кода (как минимум - не внесение новых ошибок, а лучше - контроль возможных ошибок перед модификацией и не добавление новых)
2. Обеспечить высокую сложность автоматического анализа

Для выполнения первого пункта хорошо бы сначала, перед тем как формировать некий обфусцированный код, провести статический анализ того кода, который есть изначально. Есть же статические анализаторы для С например, они проверяют такие вещи как определение переменных, которые не используются, условия, которые всегда будут иметь одно и то же значение
А=Б; Если А=Б Тогда.... Циклы, из которых по определению никогда не выйдем... Для А < Б Цикл .... А=0 КонецЦикла, и множество потенциальных угроз. Статический анализ не гарантированно найдет все ошибки, но укажет потенциально небезопасные участки кода. Конечно это лучше работает в тех языках, где есть обязательное определение переменных и что мне кажется важнее - чёткая типизация переменных. В 1С поскольку нет строгой типизации переменных - ошибка, когда например А = 3, а потом А.Записать() - вроде как и не очевидна, только на этапе выполнения будет понятно, что для А - метода Записать() нет, так как это числовая переменная. И никто не мешает сделать А = 3; А = справочник.фигня.НайтиПоКоду(А); А.Записать(); Вот статический анализ бы мог тут пригодиться не только для написания обфускатора, а просто для анализа кода на возможные ашипки и очепятки.
Вот мне лично было бы более интересно поговорить именно о статическом анализе кода 1С, но это в то же время и шаг к качественной обфускации.
После всестороннего синтаксического анализа появляется граф вызовов функций (встроенных функций языка, функций и процедур модуля, других модулей). И этот граф уже можно модифицировать, разбавляя его бессмыслеными и запутанными конструкциями. Главное, что после этого мы опять же можем с применением ранее созданного статического анализатора проверить работоспособность нашего уже измененного кода. Изменение кода в данном случае - это не замена понятных названий на непонятные, а добавление логических конструкций, изменение порядка и состава аргументов, хранение переменных в усложненных для прямого контроля структурах (например переменные хранятся в стеке или массиве, динамически там перемешиваются, сведения о том какая переменная будет извлечена уже не функция от её названия, а нечто гораздо более сложное).
masterkio; +1 Ответить
46. Сан Саныч (herfis) 24.12.15 14:17
(44) masterkio,
все сводится к взлому модуля

Вот именно! Вернее, не к взлому, а к обратной трансляции байт-кода в код 1С.
Именно об этом я и говорю. Если уже используется поставка без исходных кодов, ваш вариант обфускации - абсолютно лишний. Он ничего не привносит, с какой стороны не глянь.
При самостоятельном применении защиту от несанкционированного выполнения обфускация тоже не помогает реализовать.
Ее имеет смысл использовать только в качестве некоторой защиты от изменений и авторских прав.
47. Сан Саныч (herfis) 24.12.15 14:23
Мне кажется морально-этические нормы и цели обфускации кода - это отдельная тема, а техническая реализация - совсем другая тема. И зачем их обсуждать одновременно - непонятно.

Ну а мне непонятно, почему вы считаете странным обсуждать в комментариях к продукту его целевое назначение.
48. Иван Петров (dgolovanov) 24.12.15 18:33
(47) herfis, прочитал все ваши комменты. Вам женщины не дают, всё в слова выливается?
lefthander; MRAK; teflon; +3 Ответить 2
49. Роман С (Dach) 24.12.15 23:46
(27) речь про вот эту обработку?

http://infostart.ru/public/15907/

если про нее, то она прекрасно работает и с "современным" кодом.

Протестировал ради интереса буквально только что - не смогла только обработать тип ОписаниеОповещения.
Ну, неудивительно, это асинхронное выполнение кода, в рамках отказа от модальности, на момент написания обфускатора еще не применялось...
Неужели Ваш код содержит везде асинхронные вызовы? Или нет? Большинство внедренцев, из тех, от кого собственно и надо бы защищать свои творения - толком то и не знают что это. )))
Как ни навязывает 1С такой подход, не очень он приживается, потому что требует больший порог вхождения, чем прочтение Радченко по диагонали.
Но когда таки навяжут - будет хорошо, считаю, но это тема для отдельной дискуссии.

Кстати, у автора обработки все развилось в целый проект, видимо довольно успешный. Не сочтите за рекламу, но: https://netlenka1c.ru
(сейчас сервис платный, бесплатный был при старте, года 2 назад).

Если уж так нужно защитить свой код, то почему бы не купить абонемент? 4500 в год - не так уж дорого за возможность спать спокойно ;) ;)
А если не хочется покупать абонемент и хочется разработать свое, то воспринимайте критику... Вам Evil Beaver и остальные уже надавали кучу советов... Насчет GoTo и запутывания.

50. Allexey (alex_4x) 25.12.15 10:06
Интересно не "купить абонемент", а сделать самому :-)
Я с автором нетленки общался, но так как проект у него коммерческий, он даже по поводу разбора синтаксиса языка ничего не стал подсказывать. Ну это понятно, всё что приносит доход - ноу хау :-) Как я уже писал выше - мне интересно на данном этапе сделать статический анализатор кода.

Вот вам одна смешная конструкция, для раздумий :-)

//Дерективы компилятора можно так поставить что например 
Функция
//....
#Для тонкого клиента
//...
КонецФункции
#Для толстого клиента
//...
КонецФункции
//Проверку синтаксического контроля не проходит, но работает :-)
...Показать Скрыть
51. Валентин Бомбин (so-quest) 25.12.15 12:17
(37) masterkio, сложно что либо объяснять человеку, если кроме слова деньги он ничего не понимает. Тебе 40 постов пытаюсь объяснить что твоя обработка фигня бесполезная - ты упираешься в то что она якобы работает и даже от чего-то защищает. Тебе говорят как надо делать такой продукт - ты упираешься и говоришь что и так хорошо.
(48) dgolovanov, А как коррелирует между собой сексуальная привлекательность и вопросы по этой обработке? herfis вполне нормальные вопросы задает. То что автор на них ответить не может и юлит - по моему никак не связано с женщинами вообще.
(50) alex_4x, То что ты показываешь - не проблема. Сперва делается проход препроцессором, затем собственно парсер. То есть парсеров должно быть 2. Один для препроцессора, второй для самого языка.
Если тебе что нужно подсказать по статанализу кода- идешь сюда - https://github.com/wwall/drracket-loxy (парсер и пример простого анализа после новогодних будет там). Если просто парсер нужен - то сюда http://oscript.io/ или сюда - https://github.com/wwall/disa_da
52. Allexey (alex_4x) 25.12.15 14:33
Ну что вы, уважаемый so-quest так накинулись на парня! Он же не заставляет вас своей обработкой пользоваться. Ну сделал человек эксперимент, ему и обсудить это хочется и поддержку найти, а вы тут как научный руководитель в институте - всё у вас неправильно, идите перечерчивайте...

Как вашим анализатором drracket-loxy пользоваться ? на чём это написано ? какая-то непонятная для меня мешанина файлов....
http://oscript.io/ - я так понимаю на сях написан. И как это работает ? Ему надо что скармливать ? Модуль один или весь файл метаданных?

53. Сан Саныч (herfis) 28.12.15 10:40
(48) Кто о чем, а вы про "женщины не дают". Напомнили старую русскую поговорку про баню.
54. Allexey (alex_4x) 29.12.15 10:21
herfis, дорогой, ну не устраивайте тут помойку из придирок.
Давайте лучше по существу.
Кто знает как сделать или уже сделал разбор кода 1С на самом 1С ? Понятное дело есть всякие специфические библиотеки, но давайте ограничимся функционалом 1С для удобства и понятности.
55. Сан Саныч (herfis) 29.12.15 11:00
(54) alex_4x, Если нет теоретической базы, то анализ готового кода, опирающегося на глубокую теорию - дело неблагодарное. Набираете в поисковике "написание компилятора" и легко выуживаете кучу профильной литературы по теории компиляторов, в т.ч. синтаксическому/семантическому анализу исходных текстов, конечным автоматам и т.п. Всё это изучается в рамках обучения системному программированию, в т.ч. написание собственных компиляторов. Это ответ на вопрос "как сделать". Лично я ничего такого на 1С не делал и врядли буду. Но препятствий никаких нет. Берете и делаете.
56. Allexey (alex_4x) 29.12.15 13:45
herfis, спасибо за ваш полный сарказма и снобства совет. жаль что в нём нет даже намека на смысл.
Теории - это всё замечательно, и конечные автоматы тоже. Как это всё реализовать на практике - вот вопрос.

Анекдот...
-Мама, вы хотите рыбы?
-Ммм... ну да...
-Ну так идите, купите и пожарьте!

Теоретическая база такова:
Так как программа на языке 1С по разному отрабатывается в разных режимах (на клиенте, на сервере, толстый клиент, com соединение), что обусловлено применением деректив компилятора, сначала надо из исходного кода выделить ту часть, которая будет отрабатываться в интересующем нас случае. Например на клиенте. Остальное просто выбросить.
Далее модуль состоит из частей:
Определение переменных
Определение функций и процедур
Тело модуля (аналог функции main())
Сначала определяем все глобальные переменные модуля.
Встречаем начало объявления функции - запоминаем что началась функция и дальше идут сначала параметры потом тело функции
Встречаем конецфункции - функция закончилась.
Внутри функции(процедуры) - в начале определяются переменные функции(процедуры), потом идет тело функции.
Тело состоит из вызовов процедур
ИмяПроцедуры(Параметры); Параметры - это список Выражений через запятую
И присвоений
ИмяПеременной = Выражение


Вот и вся теоретическая база. Или я глубоко заблуждаюсь ?
57. Валентин Бомбин (so-quest) 29.12.15 15:34
(56) alex_4x, Очень глубоко заблуждаетесь, начиная со слова "Анекдот"
Конечные автоматы, теория построения компиляторов и прочая прикладная математика необходима. Хотя если вы хотите повторить путь пройденый до вас и не достичь ничего нового - то не обязательно. Если вы откажетиесь от этого - поучитсья примерно то же самое что и у автора этой разработки - тяжелый, трудночитаемый, неподдерживаемый код. Без формальной грамматики языка - ничего не сделать. Точнее можно сделать, но будет очень грустно это читать/развивать.

По поводу вашего вопроса "Как вашим анализатором drracket-loxy пользоваться ?" - пока никак. Это начинающийся проект. на данный момент там реализован только токенизире и интерфейс анализа потока токенов. Ссылку дал что бы вы могли посмотреть на один из вариантов реализации статического анализа кода. Аналогичные проекты есть для питона, джавы, сишарпа и прочих языков. У моего проекта язык реализции - schema (точнее drracket). Перегнать на 1С - труда не составит, там никаких сложных конструкций не используется.
58. Андрей Овсянкин (Evil Beaver) 30.12.15 16:00
(35) so-quest, а посоветуйте мне, коллега, хорошую литературу по анализу кода, а? Если не затруднит, конечно.
И за ссылку на oscript.io, отдельное спасибо, мне лестно :)
59. Андрей Овсянкин (Evil Beaver) 30.12.15 16:04
(52) alex_4x,
http://oscript.io/ - я так понимаю на сях написан. И как это работает ?


А никак не работает. Это не парсер, а среда исполнения. В ней нет отчуждаемого анализатора кода, который можно просто взять и для обфускатора заюзать. Написан на C# - это сильно проще, чем С.
60. Александр (nikaleks) 06.01.16 18:24
Ребята, а зачем это нужно?
Выкладывая обработку на открытом источнике, думать о непорядочных внедренцах? ерунда какая-то.
Если уж так нужно, можно паролем защитить модуль, а так ерунда какая-то.
61. Константин Гейнрих (CyberCerber) 09.01.16 23:43
Автор, спасибо за обработку!

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

Но есть некоторые замечания, ошибки:

1. Именно, защитный код, который нужен был мне, скрылся плохо. Т.е. код
Если ТекущаяДата() > '20160101' Тогда
    Возврат;
КонецЕсли;

таким же и остался.

2. Возникает ошибка с директивами препроцессора. Код вида:
#Если Клиент Тогда
#КонецЕсли

должен занимать отдельные строчки, а он идет в середине строки.

3. Проблема с переменной в модуле обработки, которая является реквизитом обработки
Например, есть реквизит обработки "Реквизит1". В одном методе пишу:
Реквизит1 = 1;

А в другом:
Сообщить(Реквизит1);

Ваша обработка заменять его на абракадабру, и во втором методе переменная становится неопределенной, да и вообще смысл теряется.

Желаю исправления этих ошибок и дальнейшего развития обработке!
62. Андрей Закусов (masterkio) 10.01.16 11:25
(61) CyberCerber,
Первые две проблемы понятны, постараюсь исправить в ближайшее время.

По поводу третьей не очень понял.
Если это одна и та же переменная или просто с одинаковым идентификатором, то если они заменяются на другое , не читаемое имя переменной, все равно все должно работать...
63. Константин Гейнрих (CyberCerber) 10.01.16 11:57
(62) masterkio, Реквизит1 - это реквизит самой обработки, он не задан в коде внутри модуля, а добавлен в окне создания обработки. Такую переменную не надо переименовывать.
64. Андрей Овсянкин (Evil Beaver) 10.01.16 19:51
(63) CyberCerber, по вашей задаче - не парьтесь и просто закройте код модуля паролем (или вообще не включайте код в поставку).
65. Евгения Карук (ekaruk) 10.01.16 20:45
На самом деле закрытие кода вещь достаточно полезная.
Я сама всегда рассказывала, что в 1С закрытого кода быть не должно.
Сейчас сама использую для закрытия и урезания функционала бесплатной Лайт версии платного отчета.
Это позволяет без особого труда дать пользователю облегченную версию, чтобы показать, что именно отчет может.
Поставка без кода + легкая обфускация байт-кода.
По моей оценке, 95% программистов Инфостарта такую защиту за срок меньше недели не откроют, не говоря уже о рядовых бухгалтерах.
А те 5%, что откроют, такой фигней заниматься не будут.
MRAK; Dach; teflon; CyberCerber; +4 Ответить
66. Константин Гейнрих (CyberCerber) 10.01.16 22:27
(64) Evil Beaver, пароль, слышал, вскрывается проще простого. А вот про поставку мало знаю... Этот метод можно применить к внешней обработке?
67. Андрей Закусов (masterkio) 10.01.16 22:41
(63) CyberCerber, Понятно, эта проблема уже обсуждалась. Постараюсь ее как-нибудь решить.
68. Евгения Карук (ekaruk) 10.01.16 22:57
(66) CyberCerber, Можно применить к отчету, но для этого его нужно встроить в конфигурацию.
Как вариант, можете ограничиться обфускацией текста обработкой в этой публикации + обычный пароль.
Для пользователя этого более чем достаточно.
69. Константин Гейнрих (CyberCerber) 11.01.16 10:11
(68) ekaruk, так и сделал: обфусцировал и паролем закрыл. Но решил, гулять так гулять, и хотел всеми стандартными способами воспользоваться. :-)
70. Сергей Пономарёв (izidakg) 12.01.16 00:31
исключение модуля очень фиговая защита
лично я ее вскрываю ровно за время открытия соответствующего инструмента
71. Евгения Карук (ekaruk) 12.01.16 00:34
(70) izidakg, Для рядового пользователя этого более чем достаточно.
72. Андрей Овсянкин (Evil Beaver) 12.01.16 01:39
(66) CyberCerber, про пароль я не интересовался, по-моему он не очень просто снимается. А вот декомпилировать обратно можно, да. Но awa, например, знает, как защитить от декомпиляции. Имхо, это надежнее, чем просто замена идентификаторов.
73. Андрей Закусов (masterkio) 21.01.16 22:37
(61) CyberCerber, По вашим вопросам вроде бы поправил. Публикация обновлена.
Единственное с литералами даты не стал заморачиваться, но сделал, что в строковых константах цифры кодируются, т.е. если в вашем случае написать Дата("20160101"), то в явном виде её видно не будет.
74. Master (master-73) 25.01.16 16:02
Ошибка. Если в модуле присутствует примерно такая строка:
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал|_" + Ширина);
75. Роман Ершов (MRAK) 27.01.16 20:46
Автор, молодец.
Не слушай недальновидных коллег, которые пишут, что продукт не нужен. Они просто не сталкивались с ситуацией, где данный инструмент может быть полезен.
Если кому-то не разу не приходилось сверлить стены, то он тоже будет утверждать, что дрель не нужна, и кто ее изобрел - тот дурак :)
Не стоит на таких людей излишне обращать внимание :)
masterkio; +1 Ответить
76. Андрей Закусов (masterkio) 28.01.16 08:54
(74) master-73, Проверю, спасибо за замечание.
77. Капитан Немо (capitan) 29.02.16 14:57
Задумка хорошая.
Но у меня не взлетела.
Появляются строки типа:
структура ( sdferwrrwerwrwer("҄ҙқҧҟҰҦҔҦ
Они видны и на принтскрине автора.
На них - затык, модуль не компилируется без ошибок.
А http://infostart.ru/public/15907/ работает на ура.
78. Андрей Закусов (masterkio) 29.02.16 20:50
(77) capitan, если есть возможность, пришлите пример кода, который не компилируется.
79. Андрей Киреев (FractonKireyev) 31.05.16 15:03
Я наткнулся на ошибку. Обработка не любит тройные кавычки. Текст модуля
Процедура Контроль( Источник, Отказ, ЗаголовокОшибки ) Экспорт
	Если Источник.УчитыватьНДС Тогда
		ОбщегоНазначения.СообщитьОбОшибке( "Установлена форма оплаты перевозчику """ + Строка( Источник.ФормаОплатыПеревозчику ) +
			""". В этом случае обязателен сброс признака ""Учитывать НДС"".", Отказ, ЗаголовокОшибки );
	КонецЕсли;
КонецПроцедуры
...Показать Скрыть

превращается в код
процедура контроль ( источник , отказ , заголовокошибки ) экспорт если источник.учитыватьндс 
 тогда общегоназначения.сообщитьобошибке ( sdferwrrwerwrwer("҇ҥҦҔҡҢҖҟҙҡҔ ҨҢҤҠҔ ҢңҟҔҦү ңҙҤҙҖҢқҫҜҞҧ """) + строка ( источник.формаоплатыперевозчику 
 ) + ""sdferwrrwerwrwer(". Ѷ ұҦҢҠ ҥҟҧҫҔҙ ҢҕҳқҔҦҙҟҙҡ ҥҕҤҢҥ ңҤҜқҡҔҞҔ ""҇ҫҜҦүҖҔҦҰ ҁѸ҅"".") , отказ , заголовокошибки ) ; конецесли ; конецпроцедуры 
  функция sdferwrrwerwrwer(Знач jhkkljhasdflkhjshafdk)  skfjasdfu = Новый Структура("s48,s49,s50,s51,s52,s53,s54,s55,s56,s57,s97,s98,s99,s100,s101,s102,s103,s104,s105,s106,s107,s108,s109,s110,s111,s112,s113,s114,s115,s116,s117,s118,s119,s120,s121,s122,s65,s66,s67,s68,s69,s70,s71,s72,s73,s74,s75,s76,s77,s78,s79,s80,s81,s82,s83,s84,s85,s86,s87,s88,s89,s90,s1040,s1041,s1042,s1043,s1044,s1045,s1046,s1047,s1048,s1049,s1050,s1051,s1052,s1053,s1054,s1055,s1056,s1057,s1058,s1059,s1060,s1061,s1062,s1063,s1064,s1065,s1066,s1067,s1068,s1069,s1070,s1071,s1072,s1073,s1074,s1075,s1076,s1077,s1078,s1079,s1080,s1081,s1082,s1083,s1084,s1085,s1086,s1087,s1088,s1089,s1090,s1091,s1092,s1093,s1094,s1095,s1096,s1097,s1098,s1099,s1100,s1101,s1102,s1103,s10","ø","ù","ú","û","ü","ý","þ","ÿ","Ā","ā","ĩ","Ī","ī","Ĭ","ĭ","Į","į","İ","ı","IJ","ij","Ĵ","ĵ","Ķ","ķ","ĸ","Ĺ","ĺ","Ļ","ļ","Ľ","ľ","Ŀ","ŀ","Ł","ł","ĉ","Ċ","ċ","Č","č","Ď","ď","Đ","đ","Ē","ē","Ĕ","ĕ","Ė","ė","Ę","ę","Ě","ě","Ĝ","ĝ","Ğ","ğ","Ġ","ġ","Ģ","Ѵ","ѵ","Ѷ","ѷ","Ѹ","ѹ","Ѻ","ѻ","Ѽ","ѽ","Ѿ","ѿ","Ҁ","ҁ","҂","҃","҄","҅","҆","҇","҈","҉","Ҋ","ҋ","Ҍ","ҍ","Ҏ","ҏ","Ґ","ґ","Ғ","ғ","Ҕ","ҕ","Җ","җ","Ҙ","ҙ","Қ","қ","Ҝ","ҝ","Ҟ","ҟ","Ҡ","ҡ","Ң","ң","Ҥ","ҥ","Ҧ","ҧ","Ҩ","ҩ","Ҫ","ҫ","Ҭ","ҭ","Ү","ү","Ұ","ұ","Ҳ","ҳ","ٿ"); 
 Для каждого sdskfjasdfu из skfjasdfu Цикл jhkkljhasdflkhjshafdk = СтрЗаменить(jhkkljhasdflkhjshafdk,sdskfjasdfu.Значение,Символ(Число(СтрЗаменить(sdskfjasdfu.Ключ,"s","")))); 
 КонецЦикла; jhkkljhasdflkhjshafdk = СтрЗаменить(jhkkljhasdflkhjshafdk,"|"," "); возврат jhkkljhasdflkhjshafdk; 
 КонецФункции
...Показать Скрыть

Это видно картинке во вложении. Ошибка в результирующем коде возникает в строке 3, позиция 8. Здесь виден фрагмент кода
 ) + ""sdferwrrwerwrwer(". 
, который никак не может быть правильным.

И одно пожелание. Хочется сделать отдельную настройку возле "Вставлять ничего не значащий код" для параметров функции (в моём примере это "Источник, Отказ, ЗаголовокОшибки"), чтобы параметры автоматически тоже проходили (или не проходили) обфускацию. В идентификаторах для замены в больших модулях надо слишком много щёлкать мышкой, чтобы снять все флажки с параметров, а этой настройкой можно будет управлять всеми флажками для параметров одновременно.
Прикрепленные файлы:
80. Вася Смирнов (vasyS) 30.08.16 11:12
При запуске обработке вылетает куча ошибок. Что не так?

{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(301,61)}: Переменная не определена (НаправлениеПоиска)
ПозицияНачалоПеременной = СтрНайти(стрОбработанныйКод," ",<<?>>НаправлениеПоиска.СКонца,ПозицияПеременная,2);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(412,62)}: Переменная не определена (НаправлениеПоиска)
ПредПозицияТочкиЗапятой = СтрНайти(стрОбработанныйКод,";",<<?>>НаправлениеПоиска.СКонца,ТекПозицияТочкиЗапятой-1);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(413,61)}: Переменная не определена (НаправлениеПоиска)
ПредПозицияПерем = СтрНайти(стрОбработанныйКод," перем ",<<?>>НаправлениеПоиска.СКонца,ТекПозицияТочкиЗапятой-1);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(75,21)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияКавычек1 = <<?>>СтрНайти(стрОбработанныйКод,"""",,ТекущаяПозицияПоиска);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(76,21)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияКавычек2 = <<?>>СтрНайти(стрОбработанныйКод,"""",,ТекущаяПозицияПоиска,2);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(130,8)}: Процедура или функция с указанным именем не определена (СтрНайти)
Если <<?>>СтрНайти(стрОбработанныйКод," ") = 0 Тогда
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(150,20)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияФункция = <<?>>СтрНайти(стрОбработанныйКод," функция ",,ТекущаяПозицияПоиска);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(158,30)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияКонцаИмениФункции = <<?>>СтрНайти(стрОбработанныйКод,"(",,ПозицияФункция)-1;
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(159,35)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияКонцаПеременныхФункции = <<?>>СтрНайти(стрОбработанныйКод,")",,ПозицияФункция);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(165,20)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияЭкспорт = <<?>>СтрНайти(стрОбработанныйКод," экспорт ",,ПозицияФункция)-1;
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(175,21)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияЗапятой = <<?>>СтрНайти(СтрокаПараметрыФункции,",");
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(189,9)}: Процедура или функция с указанным именем не определена (СтрНайти)
Если <<?>>СтрНайти(ИмяПараметра,"=") > 0 Тогда
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(190,37)}: Процедура или функция с указанным именем не определена (СтрНайти)
ИмяПараметра = Лев(ИмяПараметра,<<?>>СтрНайти(ИмяПараметра,"=")-1);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(208,20)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияФункция = <<?>>СтрНайти(стрОбработанныйКод," процедура ",,ТекущаяПозицияПоиска);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(216,30)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияКонцаИмениФункции = <<?>>СтрНайти(стрОбработанныйКод,"(",,ПозицияФункция)-1;
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(217,35)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияКонцаПеременныхФункции = <<?>>СтрНайти(стрОбработанныйКод,")",,ПозицияФункция);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(223,20)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияЭкспорт = <<?>>СтрНайти(стрОбработанныйКод," экспорт ",,ПозицияФункция)-1;
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(233,21)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияЗапятой = <<?>>СтрНайти(СтрокаПараметрыФункции,",");
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(247,9)}: Процедура или функция с указанным именем не определена (СтрНайти)
Если <<?>>СтрНайти(ИмяПараметра,"=") > 0 Тогда
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(248,37)}: Процедура или функция с указанным именем не определена (СтрНайти)
ИмяПараметра = Лев(ИмяПараметра,<<?>>СтрНайти(ИмяПараметра,"=")-1);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(265,23)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияПеременной = <<?>>СтрНайти(стрОбработанныйКод," перем ",,ТекущаяПозицияПоиска);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(273,28)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияКонцаПеременной = <<?>>СтрНайти(стрОбработанныйКод,";",,ПозицияПеременной)-1;
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(278,8)}: Процедура или функция с указанным именем не определена (СтрНайти)
Если <<?>>СтрНайти(ИмяПеременной," экспорт ") > 0 Тогда
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(295,23)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияПеременная = <<?>>СтрНайти(стрОбработанныйКод,"=",,ТекущаяПозицияПоиска);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(301,29)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияНачалоПеременной = <<?>>СтрНайти(стрОбработанныйКод," ",НаправлениеПоиска.СКонца,ПозицияПеременная,2);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(316,11)}: Процедура или функция с указанным именем не определена (СтрНайти)
Если НЕ <<?>>СтрНайти(ИмяПеременной,".") = 0 Тогда
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(321,11)}: Процедура или функция с указанным именем не определена (СтрНайти)
Если НЕ <<?>>СтрНайти(ИмяПеременной,">") = 0 Тогда
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(326,11)}: Процедура или функция с указанным именем не определена (СтрНайти)
Если НЕ <<?>>СтрНайти(ИмяПеременной,"<") = 0 Тогда
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(406,29)}: Процедура или функция с указанным именем не определена (СтрНайти)
ТекПозицияТочкиЗапятой = <<?>>СтрНайти(стрОбработанныйКод,";",,ТекПозицияТочкиЗапятой);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(412,30)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПредПозицияТочкиЗапятой = <<?>>СтрНайти(стрОбработанныйКод,";",НаправлениеПоиска.СКонца,ТекПозицияТочкиЗапятой-1);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(413,23)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПредПозицияПерем = <<?>>СтрНайти(стрОбработанныйКод," перем ",НаправлениеПоиска.СКонца,ТекПозицияТочкиЗапятой-1);
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(431,30)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияПервойФункции = Мин(<<?>>СтрНайти(стрОбработанныйКод," функция "),СтрНайти(стрОбработанныйКод," процедура "));
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(431,71)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияПервойФункции = Мин(СтрНайти(стрОбработанныйКод," функция "),<<?>>СтрНайти(стрОбработанныйКод," процедура "));
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(434,39)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияКонцаПоследнейФункции = Макс(<<?>>СтрНайти(стрОбработанныйКод," конецфункции ") + 14 ,СтрНайти(стрОбработанныйКод," конецпроцедуры " + 16));
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(434,91)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияКонцаПоследнейФункции = Макс(СтрНайти(стрОбработанныйКод," конецфункции ") + 14 ,<<?>>СтрНайти(стрОбработанныйКод," конецпроцедуры " + 16));
{ВнешняяОбработка.СтайерОбфускацияКода.Форма.Форма.Форма(446,21)}: Процедура или функция с указанным именем не определена (СтрНайти)
ПозицияПробела = <<?>>СтрНайти(стрОбработанныйКод," ",,КоличествоСимволовВСтроке);
81. Андрей Закусов (masterkio) 31.08.16 08:27
(80) vasyS,
Проверьте по этому пункту в описании:
"Требуется платформа не ниже версии 8.3.7, в конфигурации не должен быть установлен режим совместимости, поэтому для использования обработки лучше всего создать пустую конфигурацию и запустить её в толстом клиенте обычном приложении, в конфигураци необходимо включить возможность использования модальных окон."
82. webandroid webandroid (webandroid) 24.09.16 14:05
текст в ковычках тоже обфусцирует. Зачем??? "҇ҫҜҦүҖҔҦҰ ҁѸ҅"
83. Андрей Закусов (masterkio) 26.09.16 09:12
(82) webandroid, Тексты запросов + по комментария можно найти фрагмент кода.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа