Имя: Пароль:
LIFE
Спам
OFF: Обфускатор 1С.
0 AndStar
 
20.12.12
10:27
http://netlenka1c.ru/
Коллега разработал. Просит отзывы.
По-моему неплохо получилось.
1 MRAK
 
20.12.12
10:32
2 AndStar
 
20.12.12
10:35
Это не то.
3 ХочуСказать
 
20.12.12
10:36
(0)
онлайн?

остой..
пусть оффлайн выкаладывает
4 IamAlexy
 
20.12.12
10:37
(0) онлайн это хорошо...

главное незабывайте сохранять копии незашифрованных модулей и затем выкладывать их в обменниках...
5 Serg_1960
 
20.12.12
10:47
(0) Красивое решение вопроса.

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

Автор - молодец. Красивое решение вопроса - нетленки - бесплатно.
6 vitek89
 
20.12.12
10:50
Круть!
7 pessok
 
20.12.12
10:54
(0) красиво!
8 Адинэснег
 
20.12.12
10:56
(0)бугога... Щас побежали тебе базу модулей наполнять :-D
9 pessok
 
20.12.12
10:57
(8) ну ты же на копрокоде 100500 летней давности проверял, как все?)
10 Aleksey
 
20.12.12
10:57
где кнопка скачать?
11 MRAK
 
20.12.12
11:00
(2) согласен, в (0) красивее)
12 buhkiller
 
20.12.12
11:01
(0) Че-то многовато в тексте "перейти"
13 pessok
 
20.12.12
11:02
(12) дык обфускатор
14 pessok
 
20.12.12
11:03
при регистрации дает сохранить сорцы на сервере, гы
15 Ursus maritimus
 
20.12.12
11:03
(0) не нужно. у 70% 1Сников код сразу обфусцирован.
16 Азат
 
20.12.12
11:04
не пойму, в чем глобальная мегамысль автора? регать домен, платить за него бабки и отдавать услугу бесплатно????
17 pessok
 
20.12.12
11:05
(16) бесплатна она пока тестят ее, имхо, потом сделает рекламу, платную регистрацию и т.п..
да и стоимость домена... щас даже одноэсник-студент за час больше получает, чем платить за год за домен
18 PLUT
 
20.12.12
11:07
обфускатор надо допилить, чтобы еще операторы и методы на буржуйском языке))) вот тогда точно мегаобфускатор получится
19 TormozIT
 
гуру
20.12.12
11:09
Неплохо.
20 Undefined vs NULL
 
20.12.12
11:09
вот оригинал

Procedure Operator() Export
   
   If CurrentDate()<='20100301' Then
       Return;    
   EndIf;

   QueryText = "SELECT
                  |    Продажи.Регистратор,
                  |    SUM(Продажи.СтоимостьРегл) AS Summa
                  |FROM
                  |    РегистрНакопления.Продажи AS Продажи
                  |
                  |GROUP BY
                  |    Продажи.Регистратор";
   Query = New Query(QueryText);
   VT = Query.Execute().Unload();
   Sum = 0;
   For each Row in VT do
       Sum = Sum + Row.Summa;        
   EndDo;

EndProcedure

вот результат

procedure operator() export if currentdate()<=_c() then return; endif; b___ = _d__(__d_,__d__); _b = new query(b___); vt = _b.execute().unload(); __b = d__(); for each row in vt do __b = __b + row.summa; enddo; endprocedure

хреновая обфускация
21 pessok
 
20.12.12
11:09
не жрет пендосские операторы чтоле?
22 Undefined vs NULL
 
20.12.12
11:11
+(20) шучу, весь модуль удачно, просто там была эта процедура-шутка, вот обратил внимание
23 Asmody
 
20.12.12
11:12
производительность мерили?
24 Адинэснег
 
20.12.12
11:16
ПОСОНЫ НАЛЕТАЙ У МЕНЯ БРАТ ПРОВЕРИЛ КАПЕЦ КАРТА В БАЗЕ ЧУТЬ ВСЁ НЕ СНЯЛИ СПАСИБО ДРУГУ ОН СЕРВИС ЗОПИЛИЛ
http://s1.hostingkartinok.com/uploads/images/2012/12/072e1467de2e2ebbd91d7b7e0237dca6.png
25 Stim
 
20.12.12
11:17
а обратная фускация реализована? а то понадобится самому допилить - и потратишь неделю на разбор)
26 le_
 
20.12.12
11:20
(24) После ввода информации о карте она автоматически попадает в базу кардера и сервис возвращает положительный результат? )
27 pessok
 
20.12.12
11:22
(24) ты сделал мой день!
28 Адинэснег
 
20.12.12
11:23
29 le_
 
20.12.12
11:24
1С: Управление кардингом )
30 Stim
 
20.12.12
11:25
ааа)))
31 Pooh
 
20.12.12
11:26
(24) бггг
всегда нравилось такое )
32 фобка
 
20.12.12
11:34
(0) имхо, надо еще убирать пробелы у операторов " = ", "+","-"
хотя и так визуально неплохо смотрится, даже на маленьких функциях.
33 фобка
 
20.12.12
11:34
еще можно рандомно менять написание методов с рус на англ
34 К_Дач
 
20.12.12
11:37
Пусть автор поделится, какмими методами криптозащиты он пользовался))) помимо обычной замены имен с помощью ключа, очевидно, анализируется ход выполнения модуля и спомощью "перейти" запутывается, не меняя при этом сам ход
35 фобка
 
20.12.12
11:38
(34) там подмена числовых констант на функции с метками
36 К_Дач
 
20.12.12
11:42
Очень круто вобщем, без знания лога на расшифровку уйдет количество времени, несоизмеримое с эффективностью от взлома. Автор молодец, добился фактически фактически "гарантированной стойкости". Скорее всего после бета-теста, услуга станет платной. Между прочим, у сайта есть огромные шансы подружиться с инфостартом... большинство обрадуется возможности защитить свои нетленки. Ну а Доржи - тот вообще будет счастлив
37 le_
 
20.12.12
11:42
38 Stim
 
20.12.12
11:44
еще раз - как обратно вернуть свой код?
39 rotting
 
20.12.12
11:44
поубивал бы, понаписывают глючный код, а потом еще и паролями всякими позакрывают......
40 PLUT
 
20.12.12
11:47
(38) никак. работает в одну сторону
41 Stim
 
20.12.12
11:49
(40) фигово. нужно выдавать какой-то уникальный ключ, по которому можно вернуть все в зад
42 pessok
 
20.12.12
11:50
(41) зачем?
43 К_Дач
 
20.12.12
11:51
(41) наверняка функционал расшифровки будет предоставляться после покупки услуги. А ключ - он скорее всего будет индивидуальным и привязан к пользователю, чтобы один разработчик не мог расшифровывать код другого...
44 pessok
 
20.12.12
11:54
и щас каждый сидит и думает... "бл*ть, ну почему не я?"$$$
45 PLUT
 
20.12.12
11:55
(43) функционал расшифровки то зачем? не проще хранить исходники?

как вариант - исходники и результаты хранить в БД, привязать к пользователю. дальше - банальное сравнение
46 Stim
 
20.12.12
11:56
(42) чтобы поддерживать и сопровождать свои решения.
47 vde69
 
20.12.12
11:57
(45) ключ расшифровки для сабжа вполне реально генерить, только он будет большим...
48 pessok
 
20.12.12
11:57
(46) дык ты пишешь то по нормальному коду, Ctrl+A, Ctrl+C, потом в базе "для клеендов" Ctrl+V
49 К_Дач
 
20.12.12
11:58
(45) да, но так для разработки и поддержки собственных продуктов тебе всегда нужен доступ к сайту и интернет. Ну и защищенное соединение, разумеется.
50 PLUT
 
20.12.12
11:59
(47) в качестве нагрузки к тексту обфускации можно исходники зашифрованные прям в модуль добавлять, зашифровать каким-нибудь открытым ключом, по принципу ЭЦП)
51 Stim
 
20.12.12
11:59
(48) это не то. тебе нужно вносить исправление в функционал клиента, исхдники могут потеряться
52 pessok
 
20.12.12
12:01
(51) а зачем у клиента? пользовать свой ключик на чужом компьютере опасно
53 Stim
 
20.12.12
12:03
(52) у клиента - потому что у него функционал. у него могут быть 100500 обработок, исходники от которых уже давно канули в небытие
54 pessok
 
20.12.12
12:04
(53) ну вообще да, согласен. деобфускатор нннннада
55 PLUT
 
20.12.12
12:09
(49) несложно свою обормотку написать для шифрования исходного текста модуля. потом его тупо в текст модуля в конце добавить. засада будет, если кто-то его оттуда выпилит, а бэкапов не будет. но если клиенты на поддержке, то репозиторий  .CF клиентов нужно у себя держать
56 Никола_
Питерский
 
20.12.12
12:12
ТС передай коллеге пускай мутит авторизацию через другие сервисы(соц. сети, и прочее зло), вломы(лениво) региться, а обратная связь только через регистрацию !
57 PLUT
 
20.12.12
12:14
(56) Tyson
Джордж Вашингтон
Kavar
vde69
Вадя
Alex33
PowerBoy
tomvlad
J_B
Starhan
vladko
Bida
Begin
le_
rij
ilpar
Я не курил
forforumandspam
notton
Stim
Lokli
Адинэснег
Никола_Питерский
фобка
skiller3000
PLUT
Пухлый кот
эцп
ReaderT
Есть вопросик
бомболюк
pessok
egorious
geka-geka
БледноЗолотистый
НеМогуВойтиВАккаунт
Юный 1С
Нетленка1С

автор в ветке?
58 vde69
 
20.12.12
12:14
для автора советы

1. добавить мусора для неверной работы "перейти к определению"
2. Все процедуры и функции сделать с параметрами и по параметру отрабатывать мусорные варианты (для защиты от оптимизаторов выкидывающих мусор)
59 PLUT
 
20.12.12
12:17
+(57) Дата регистрации:    20.12.2012     сегодня
60 le_
 
20.12.12
12:18
61 Нетленка1С
 
20.12.12
12:28
Всем большое спасибо за советы и обсуждение данного проекта. Отвечу на некоторые вопросы:
1.    Возможности обратной деобфускации без потери данных нет, т.к. часть информации при защите теряется безвозвратно. Любой защищенный коммерческий продукт, можно сломать, восстановить часть кода, методами обратной инженерии, но цель обфускатора в значительном усложнении его несанкционированного использования.
2. Английский язык, если нужнен, постараюсь добавить в ближайшее время.
3. Методы защиты планирую добавлять, в том числе и предикаты и защиту от Перехода к определению
4. Авторизацию через другие сервисы добавлю в ближайшее время
62 PLUT
 
20.12.12
12:34
(61) что насчет (50)? бред?

а вообще такая защита для коммерческого продукта - по сути привязка клиента к "Славик незаменимый"

вдруг приходит телеграмма: "Папа всё. Целую. Мама"
63 Нетленка1С
 
20.12.12
12:46
(62) Вполне реалистично.Можно подумать как это реализовать.
64 vde69
 
20.12.12
12:53
(62)(63)
такая защита все равно ломается и не так сложно как кажется на первый взгляд...

уверен, что через некоторое время появится анти-офбуксатор :)
65 Stim
 
20.12.12
12:56
(63) защищать нужно от продажи, а не от сопровождения.
клиент должен иметь право обращаться к другим разработчикам для изменения/сопровождения, но не должен иметь права продавать продукт
66 PLUT
 
20.12.12
12:56
(64) она для затруднения допиливания "левыми" лицами, у которых по идее "башню снести" должно. т.е. не совсем защита для ломания
67 ДайтеДайте Сказать
 
20.12.12
12:58
(0) овно, хоть бы сайт без глюков сделали
68 ДайтеДайте Сказать
 
20.12.12
12:59
(67) у меня воспользоваться не получилось, два раза код вводил
69 pessok
 
20.12.12
13:02
Д`Артаньян в теме, посоны!
70 PLUT
 
20.12.12
13:05
(68) зарегистрируйся на сцайте
71 Feunoir
 
20.12.12
13:06
Подозрение на то, что неправильно обрабатывается "константа типа дата". Из такого кода:


Процедура ВыбПериодНажатие(Элемент)
   НастройкаПериода = Новый НастройкаПериода;
   НастройкаПериода.РедактироватьКакИнтервал = Истина;
   НастройкаПериода.РедактироватьКакПериод = Истина;
   НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
   НастройкаПериода.УстановитьПериод(НачалоПериода, ?(КонецПериода='0001-01-01', КонецПериода, КонецДня(КонецПериода)));
   Если НастройкаПериода.Редактировать() Тогда
       НачалоПериода = НастройкаПериода.ПолучитьДатуНачала();
       КонецПериода = НастройкаПериода.ПолучитьДатуОкончания();
   КонецЕсли;
КонецПроцедуры


получается такой:

функция ___a_() перейти ~a__;~___a:перейти ~_a_;~_a:перейти ~__a;~__a__:возврат "";~__a:перейти ~___a;~_a___:возврат -1;~__a_:возврат новый списокзначений;~a__:перейти ~_a;~a___:возврат истина;~_a__:возврат "";~_a_:перейти ~a___; конецфункции
функция ___d() перейти ~__c_;~d:перейти ~d_;~_c___:перейти ~___c_;~d___:возврат '00010101000000';~__d:возврат null;~___c_:перейти ~d;~__c_:перейти ~_c___;~__c__:возврат 01;~d_:перейти ~__c__;~_d:возврат "";~d__:возврат 1; конецфункции
процедура выбпериоднажатие(a) a_ = f__(); a_.редактироватькакинтервал = ___a_(); a_.редактироватькакпериод = __b__(); a_.вариантнастройки = вариантнастройкипериода.период; a_.установитьпериод(началопериода, ?(конецпериода='_c__()-___d()-_e()', конецпериода, конецдня(конецпериода))); если a_.редактировать() тогда началопериода = a_.получитьдатуначала(); конецпериода = a_.получитьдатуокончания(); конецесли; конецпроцедуры
функция _c__() перейти ~_b___;~c:перейти ~c_;~_c_:возврат новый списокзначений;~c_:перейти ~c__;~c__:перейти ~c___;~__c:возврат истина;~___c:возврат "";~_b___:перейти ~c;~c___:перейти ~___b_;~___b_:возврат 0001;~_c:возврат 0; конецфункции
функция _e() перейти ~_d_;~_d__:возврат 01;~___d_:перейти ~_d__;~e___:возврат "";~__d__:перейти ~_d___;~e__:возврат неопределено;~e:возврат -1;~e_:возврат 1;~__d_:перейти ~__d__;~_d_:перейти ~__d_;~_d___:перейти ~___d_; конецфункции
функция f__() перейти ~__e;~_e___:возврат истина;~__e_:перейти ~__e__;~__e__:перейти ~___e;~_e__:перейти ~__e_;~f_:возврат ложь;~__e:перейти ~_e_;~f:возврат null;~_e_:перейти ~_e__;~___e:возврат новый настройкапериода;~___e_:возврат 1; конецфункции
функция __b__() перейти ~b;~b_:возврат истина;~__b:перейти ~b_;~_b__:возврат ложь;~b__:перейти ~b___;~___b:возврат "";~b:перейти ~b__;~b___:перейти ~_b;~_b_:возврат ложь;~__b_:возврат неопределено;~_b:перейти ~__b; конецфункции


при проверке синтаксиса ругается на:

a_.установитьпериод(началопериода, ?(конецпериода=<<?>>'_c__()-___d()-_e()', конецпериода, конецдня(конецпериода)));
72 PLUT
 
20.12.12
13:10
ну конфигуратора башню снесло от такой даты '_c__()-___d()-_e()'
73 Feunoir
 
20.12.12
13:11
(72) Так в исходном тексте нормально. А после обфускации - фигня.
74 PLUT
 
20.12.12
13:19
(73) руками исправь в конструкции ?(условие,истина,ложь). не так много их.

автор допилит))
75 Feunoir
 
20.12.12
13:21
(74) Это-ж бета-тест. А я бета-тестер. Поэтому и пишу про найденные ошибки в надежде, что "автор допилит". У меня чисто академический интерес, так как сам обфускацией не увлекаюсь.
76 quest
 
20.12.12
13:29
вот понять не могу - там регэкспами парситься или все же строиться ast и по нему уже компилируется?
77 Нетленка1С
 
20.12.12
14:45
(71) Вот для этого и нужен бета-тест :) Спасибо
Исправил.
78 х86
 
20.12.12
16:58
(77)если не секрет у тебя какие планы на сайт и обработку? сделать коммерческий проект?
79 orefkov
 
20.12.12
17:02
(77)
Еще обращения к свойствам/методам после точки запилить через Выполнить, с шифрованием имен.
80 orefkov
 
20.12.12
17:06
Перед КонецХХХ(Если,Процедуры,Функции,Цикла) точку с запятой можно не ставить.
новый списокзначений заменить на новый(функция_возвращающая_строку_списокзначений)
81 PLUT
 
20.12.12
17:12
теперь модули без исходных текстов для скрытия г@внокода не нужны! теперь можно обфускивать спокойно и не париться

ура товарищи)
82 Serg_1960
 
20.12.12
17:31
(81) Ты не прав. г@внокод изначально обфусцирован - его автор сам себе злобный обфускатор.
83 PLUT
 
20.12.12
17:33
(82) или коллективный автор)) если франч - автор нетленки
84 МуМу
 
20.12.12
21:56
С точки зрения производительности не есть гуд. Но с точки зрения маркетинга и подачи - молодец! Хотя ошибочки есть. А насчет защиты - автор, не слушай жадных, злых одинэсников. Защищать нужно - ничто так не внушает веру в человечность и порядочность как стопроцентная предоплата(не мое).
85 Злопчинский
 
20.12.12
22:26
что мешает при обфурскации запрашивать (или генерить самому) длинный пароль. Исходный нормальный код - зипуется с паролем и перекодируется в читабельные букавки, зазипованный тескт вставляется как блок комментариев. Пароль - выдается разработчику вместе с обфусцировнным кодом.
86 HeroShima
 
20.12.12
22:35
лучше эксклюзивную функциональность в бинарник убирать, имха, а так: симпатично
87 AlexBor
 
naïve
20.12.12
22:43
Господа знающие подскажите от какого слово произошло обфускация?
88 AlexBor
 
naïve
20.12.12
22:47
Скажите а как в плане законности, кто то по договору что то сделал или слепил ту же нетленку, и вот вам пожалуйста вроде как и не совсем и пароль, но как то и защита что ли. Т.е. допустим ты ушел и после тебя пришел другой работать открыл и что дальше какие могут быть варианты развития событий?
89 МуМу
 
20.12.12
23:06
(85) В продолжении темы. Этот текст отправляется mms, в ответ на него получается мастер код. Затем в ответ на него отправляется определенная сумма денег по яндекс мани, а затем отправляется клиент код.:)
90 Serg_1960
 
21.12.12
02:37
(87) Обфускация (от лат. obfuscare — затенять, затемнять; и англ. obfuscate — делать неочевидным, запутанным, сбивать с толку)
91 КонецЦикла
 
21.12.12
02:42
Должна ли поставка продукта с ТАКИМ кодом оговариваться в договоре интересно? Или типа буквы знакомые и хорошо?
92 Serg_1960
 
21.12.12
03:00
Если автор алгоритмы пишет по догору для заказчика, авторские права (как правило) передаются заказчику и обфускация - вне закона.
Если автор продаёт готовый продукт (пусть и адаптированный для заказчика) - обфускация, в данном случае - защита авторских прав и законно.

Впрочем в "нормальном" договоре авторские права отдельно оговаривается.

Имхо, обфускация алгоритма законна при наличии авторский прав на алгоритмы и (как и электронная защита) должна оговариваться в документации.
93 Нетленка1С
 
21.12.12
07:52
Добавил вход с учетными записями Google, Facebook, Twitter. Добавил страницу в Twitter, где буду писать об исправлениях и улучшениях.
94 Vladal
 
21.12.12
08:45
Вот здесь код сразу написан обфусцированным:
http://s52.radikal.ru/i137/1207/77/6ea15989e208.png
95 ptrtss
 
21.12.12
08:57
Хорошее подспорье уволенным программерам
96 Vladal
 
21.12.12
09:00
(95) Да это всё для подростков. Тайна! Шпиён! Мой гениальный код никто не увидит! BolgenOS!
Помню, одно время на кружке информатики страдали скрытием своих исходников. Лет так по 13-14 нам тогда было.
97 Serg_1960
 
21.12.12
09:09
(64) "уверен, что через некоторое время появится анти-офбуксатор" - уже появился :)

Реализация обфускации позволяет автоматизировать "обратный процесс", НО: при обфускации удаляются наименования переменных и поэтому "восстановленные" алгоритмы, пусть и в меньшей степени, но всё-таки остаются "обфусцированными :(
98 Serg_1960
 
21.12.12
09:23
(77) "Спасибо. Исправил"  - хорошо, проверьте :)

Функция ___a_() Экспорт
  Перейти ~a__;
  ~___a:Перейти ~_a_;
  ~_a:Перейти ~__a;
  ~__a__:Возврат "Проверка ""нетленки"" на наличие в тексте ""ковычек""";
  ~__a:Перейти ~___a;
  ~_a___:Возврат -1;
  ~__a_:Возврат Новый СписокЗначений();
  ~a__:Перейти ~_a;
  ~a___:Возврат ИСТИНА;
  ~_a__:Возврат "";
  ~_a_:Перейти ~a___;
КонецФункции
99 х86
 
21.12.12
09:30
а почему в спам переместили?
100 1Сергей
 
21.12.12
09:33
(сто)
101 Нетленка1С
 
21.12.12
09:34
(98) Можно исходный код посмотреть?
102 Serg_1960
 
21.12.12
09:35
(99) Потому что это спам - Спам (англ. spam) — рассылка коммерческой и иной рекламы или иных видов сообщений (информации) лицам, не выражавшим желания их получать.
103 Serg_1960
 
21.12.12
09:53
(101) Нет, нельзя.

PS: Сорри, Нетленка1С, но пример в (71) - остается "читабельный" даже без анти-обфускации.

Функция ___a_()
...    
функция ___d()
...    
процедура выбпериоднажатие(a)
   a_ = f__();
   a_.редактироватькакинтервал = ___a_();
   a_.редактироватькакпериод = __b__();
   a_.вариантнастройки = вариантнастройкипериода.период;
   a_.установитьпериод(началопериода, ?(конецпериода=""+_c__()+"-"+___d()+"-"+_e(), конецпериода, конецдня(конецпериода)));
   если a_.редактировать() тогда
       началопериода = a_.получитьдатуначала();
       конецпериода = a_.получитьдатуокончания();
   конецесли;
конецпроцедуры
...    
функция _c__()
...    
функция _e()
...    
функция f__()
...    
функция __b__()
104 Stagor
 
21.12.12
10:24
Пук="В=10;";
Выполнить(Пук);

получил:

//Не найдено функций


*** Итог - работай дальше.
105 quest
 
21.12.12
10:26
(101) исходный код - lexer + (возможно) парсер.

(0) мне кажется более правильным будет подход с описываением не отдельными функциями, а в одной функции собрать всю логику и поделить метками,далее через "перейти" бегать куда надо, собирая текст программы из имеющихся строк, после чего выполнить собранную строку. Отказаться от именований переменных через __ а использовать родной и боли знакомый GUID.
106 Stagor
 
21.12.12
10:28
все - это детские игрушки.
Нужно просто написать конфигурацию в 10 раз больше по коду, чем УПП с УФ и запросами на 10 страниц каждый, и никто в ней не разберется без всякого обфускатора.
107 Нетленка1С
 
21.12.12
10:32
(104)

функция Пук()

Пук="В=10;";
Выполнить(Пук);

конецфункции
108 ОбычныйЧеловек
 
21.12.12
10:33
(96) Когда (если) напишешь, что нить стоящее - приходи поговорим "о скрытие исходников, защите кода" и т.д. а до этого момента - это просто какой-то детский лепет.
109 Нетленка1С
 
21.12.12
10:33
Необходимо наличие хотя бы одной функции в модуле. Пока.
110 Serg_1960
 
21.12.12
10:38
(105) +1 Генерация меток по принципам уникального идентификатора (подсказываю: "тире" заменить на "нижнюю черту").
+2 Использование автономных функций без параметров - недостаток алгоритма обфускации. Я бы даже сказал - профанация оббускации :) Лучше одну функцию "обфускации", но с множественными входами и выходами и изменяемой логикой по входным параметрам.
111 mrParadox
 
21.12.12
10:41
Насколько медленнее работает после?
112 Нетленка1С
 
21.12.12
11:09
На обычных обработках и отчетах разница не ощутима.
Самую большую долю потерь составляет расшифровка строк.
Потеря зависит от числа больших строковых констант в модуле, на парсере с миллионом операций над большими строками, падение было 25%.
Вообще не уверен в необходимости шифрования строк. В обфускации это считается самой слабой защитой, т.к. все данные для расшифровки хранятся в коде программы. Возможно будет функция отключения шифрования строк для специфичных модулей с большим количеством вызовов сложных строк.
113 quest
 
21.12.12
11:10
(109) Вопрос наверное риторический  - ты видишь способ монетизировать эту разработку? и второй практический - на чем написано? AST строиться?
114 Нетленка1С
 
21.12.12
11:23
(113) Есть определенные идеи на этот счет. С введением монетизации, работа над развитием проекта конечно велась бы уже на другом уровне, значительно быстрее и позволила бы добавлять новые функции нужные пользователем. Базовый функционал однозначно планировался как бесплатный, по мере развития проекта будет видно.

строится AST
115 Нетленка1С
 
21.12.12
11:27
(110) я уже писал, что это все планируется добавлять
116 Нетленка1С
 
21.12.12
11:36
(113) .NET
117 quest
 
21.12.12
12:02
(116) граф потока управления строиться? Если да - как устроен? парсер самописный?
118 Нетленка1С
 
21.12.12
12:09
(117) все самописное, детали пока раскрыть не могу
119 kiruha
 
21.12.12
12:11
(0)
И где гарантия, что "защищаемые" не сохраняются на серере автора нетленки ?
120 quest
 
21.12.12
12:13
(117) ну тогда вопросов нет.
(119) а зачем?
121 kiruha
 
21.12.12
12:17
(120)
Потом выложить в сеть бесплатно
122 Нетленка1С
 
21.12.12
12:18
иии? в чем смысл для автора сервиса?
123 kiruha
 
21.12.12
12:19
надежней было бы скачать обработку, как
в http://infostart.ru/public/15907/
а не онлайн

для авторов
124 Нетленка1С
 
21.12.12
12:19
(121) чтобы все пользователи увидели свои модули в открытом доступе?
125 Нетленка1С
 
21.12.12
12:20
функцию хранения текстов по желанию на сервере вообще можно убрать, меньше забот
126 Нетленка1С
 
21.12.12
12:23
(123) цель проекта была - онлайн защита
127 kiruha
 
21.12.12
12:25
(126)
Чтобы потом монетеизировать ?
128 quest
 
21.12.12
12:26
ты не верную цель выбрал. защита - никому не нужна. а вот анализ кода - расчет метрик, построение графов зависимости, поиск неиспользуемых/недостижимых - уже более востребованная вещь.

видимо через месяц мне также придется спамить и рекламировать свой проект :)
129 Нетленка1С
 
21.12.12
12:26
(127) Я писал выше о монетизации.
130 Нетленка1С
 
21.12.12
12:28
(128) время покажет
131 kiruha
 
21.12.12
12:36
(128)
Уже было Ищи fez с 1000+ тестов кода
132 kiruha
 
21.12.12
12:39
133 Stagor
 
21.12.12
12:48
(107) не работает с таким кодом!



Функция ЧегоНадо()
   Сообщить("Привет");
КонецФункции

Функция ЧтоЯДелаю()
   Выполнить("ЧегоНадо();")
КонецФункции
134 Фея с лопатой
 
21.12.12
12:50
почему, у меня вот это выдало.

функция a() _a__="106110921087108210811092"; __a_="647842";сообщить(_a_(_a__,__a_)); конецфункции
функция _a_(a__,a___) если пустаястрока(a__) или пустаястрока(a___) тогда возврат a__; конецесли; _a = стрдлина(a__)/4; __a = ""; для ___a=1 по _a цикл __a = __a + символ(число(сред(a__, (___a-1)*4+1, 4))-число(символ(кодсимвола(a___, ___a)))); конеццикла; a___ = ""; a__ = __a; возврат a__; конецфункции
функция a_() b___="10701085107910861060107310821086004000430067"; _b="78407160028";выполнить(b__(b___,_b)) конецфункции
функция b__(__a__,_a___) если пустаястрока(__a__) или пустаястрока(_a___) тогда возврат __a__; конецесли; ___a_ = стрдлина(__a__)/4; b = ""; для b_=1 по ___a_ цикл b = b + символ(число(сред(__a__, (b_-1)*4+1, 4))-число(символ(кодсимвола(_a___, b_)))); конеццикла; _a___ = ""; __a__ = b; возврат __a__; конецфункции
135 GANR
 
21.12.12
12:53
Если за код стыдно - можно и обфусировать его.
136 Нетленка1С
 
21.12.12
13:06
(134) Код внутри Выполнить не анализируется, в этом случае можно написать так

Функция  Проверка() экспорт
   
   ЧегоНадо();
   ЧтоЯДелаю();
       
КонецФункции

//@global
Функция ЧегоНадо()
  Сообщить("Привет");
КонецФункции

Функция ЧтоЯДелаю()
  Выполнить("ЧегоНадо();")
КонецФункции
137 kiruha
 
21.12.12
13:15
(135)
Если выкладываешь демки и бесплатные варианты обработок - идеально
Никто не может доработать до полнофункционального применения
138 Stagor
 
21.12.12
13:17
(136) Советуешь пол конфигурации переписать, что бы обфускатор работал корректно? :)
139 Stagor
 
21.12.12
13:20
"Код внутри Выполнить не анализируется" - Значит не для любого кода 1С8
140 Neg
 
21.12.12
13:28
Хрень получается

функция __b__() перейти ~b;~___b:возврат новый <<?>>списокзначений;~_b:перейти ~__b;~b___:перейти ~_b;~b_:возврат 0;~b__:перейти ~b___;~_b__:возврат null;~__b:перейти ~b_;~b:перейти ~b__;~__b_:возврат новый списокзначений;~_b_:возврат null; конецфункции
{Документ.ЧекККМ.Форма.Модуль(123)}: Переменная не определена (списокзначений)
функция __b__() перейти ~b;~___b:возврат новый списокзначений;~_b:перейти ~__b;~b___:перейти ~_b;~b_:возврат 0;~b__:перейти ~b___;~_b__:возврат null<<?>>;~__b:перейти ~b_;~b:перейти ~b__;~__b_:возврат новый списокзначений;~_b_:возврат null; конецфункции
{Документ.ЧекККМ.Форма.Модуль(123)}: Переменная не определена (null)
функция __b__() перейти ~b;~___b:возврат новый списокзначений;~_b:перейти ~__b;~b___:перейти ~_b;~b_:возврат 0;~b__:перейти ~b___;~_b__:возврат null;~__b:перейти ~b_;~b:перейти ~b__;~__b_:возврат новый <<?>>списокзначений;~_b_:возврат null; конецфункции
{Документ.ЧекККМ.Форма.Модуль(123)}: Переменная не определена (списокзначений)
функция __b__() перейти ~b;~___b:возврат новый списокзначений;~_b:перейти ~__b;~b___:перейти ~_b;~b_:возврат 0;~b__:перейти ~b___;~_b__:возврат null;~__b:перейти ~b_;~b:перейти ~b__;~__b_:возврат новый списокзначений;~_b_:возврат null<<?>>; конецфункции
{Документ.ЧекККМ.Форма.Модуль(123)}: Переменная не определена (null)
функция c___(_b___,___b_) если пустаястрока(_b___) или пустаястрока(___b_) <<?>>тогда возврат _b___; конецесли; c = стрдлина(_b___)/4; c_ = ""; для c__=1 по c цикл c_ = c_ + символ(число(сред(_b___, (c__-1)*4+1, 4))-число(символ(кодсимвола(___b_, c__)))); конеццикла; ___b_ = ""; _b___ = c_; возврат _b___; конецфункции
{Документ.ЧекККМ.Форма.Модуль(124)}: Неправильное использование арифметической или строковой операции
функция c___(_b___,___b_) если пустаястрока(_b___) или пустаястрока(___b_) тогда возврат _b___; конецесли; c = стрдлина(_b___)/4; c_ = ""; для c__=1 по c цикл c_ = c_ + символ<<?>>(число(сред(_b___, (c__-1)*4+1, 4))-число(символ(кодсимвола(___b_, c__)))); конеццикла; ___b_ = ""; _b___ = c_; возврат _b___; конецфункции
{Документ.ЧекККМ.Форма.Модуль(124)}: Функция не обнаружена (символ)
функция a() ___c="006700860089008700730094005700530054004800980035006800840090008600910096005200540094"; _c_="144413856053155875361";_c="007000860084008700910054006200560053005400550064005401010033007100830089008600870096005600490097"; __c="076305814518681444835714";если остаток>___a_<<?>>() тогда возврат c___(_c,__c); конецесли; если остаток=__b__() тогда возврат c___(___c,_c_); конецесли; конецфункции
{Документ.ЧекККМ.Форма.Модуль(125)}: Функция не обнаружена (___a_)
функция ___a_() перейти ~a_;~__a__:возврат '00010101000000';~__a_:возврат 0;~_a:перейти ~__a;~__a:перейти ~___a;~_a__:возврат новый <<?>>массив;~a__:возврат 0;~_a_:возврат истина;~a___:перейти ~_a;~a_:перейти ~a___;~_a___:возврат 1;~___a:перейти ~a__; конецфункции
{Документ.ЧекККМ.Форма.Модуль(126)}: Переменная не определена (массив)
функция ___a_() перейти ~a_;~__a__:возврат '00010101000000';~__a_:возврат 0;~_a:перейти ~__a;~__a:перейти ~___a;~_a__:возврат новый массив;~a__:возврат 0;~_a_:возврат истина<<?>>;~a___:перейти ~_a;~a_:перейти ~a___;~_a___:возврат 1;~___a:перейти ~a__; конецфункции
{Документ.ЧекККМ.Форма.Модуль(126)}: Переменная не определена (истина)
При проверке модуля обнаружены синтаксические ошибки!
141 Neg
 
21.12.12
13:31
А сраненького говн(о)кода

Функция ПроверитьВид()
   Если Остаток>0 Тогда
    Возврат "FONT[16711680] COUNT[10]";  
   КонецЕсли;
   
   Если Остаток=0 Тогда
     Возврат "BRUSH[1000] COUNT[10]";  
   КонецЕсли;
КонецФункции
142 Stagor
 
21.12.12
14:23
(0) Вообщем - отзывы такие:
Игрушка. Для серьезной обфускации непригодна!
143 Нетленка1С
 
21.12.12
14:37
(138) Это бета-тест, все можно добавить
144 Stagor
 
21.12.12
15:22
(143) добавить анализ кода внутри Выполнить и Вычислить будет почти невозможно. Вложенность метапрограммирования может быть разная!
145 kiruha
 
22.12.12
14:31
(144)
Ну и нафиг - пусть остается
Мне кажется уже и так обфускация избыточна
146 Stagor
 
24.12.12
12:11
(145) Большинству она на уровне кода 1С не нужна вообще.
147 BMW1C
 
26.12.12
15:42
По поводу вопроса хранения модулей на сервере.

Во первых, теперь для этого требуется пароль. Модуль шифруется алгоритмом AES (Rijndael). Не зная пароля текст

восстановить невозможно. Забыли пароль - текст уже не вернуть никогда.

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

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

всего)? То все модули, которые когда либо защищали этим паролем, становятся сразу же скомпроментированы.

Поэтому от сохранения исходника в тексте модуля придется, скорее всего, отказаться ради безопасности.
148 х86
 
26.12.12
16:03
(143)зачем такую злую капчу поставил?
149 PLUT
 
26.12.12
16:05
(147) а если использовать как в ЭЦП? ГОСТ Р34.10-2001 есть, что-то там про открытый и закрытый ключ))) крипропровайдер уже в винду встроенный есть?? и еще бесплатный какой-то, ну который с 1С-Отчетность вроде идет?
150 BMW1C
 
26.12.12
16:09
(148) Можно войти с учетной записью гугла, или др.
Занимает секунды
151 BMW1C
 
26.12.12
16:16
(149) Пока мне кажется генерирование пар ключей и т.д выходит за рамки данного сайта. Можно сделать так. Если не хочется привязки к сервису, защитил модуль у заказчика, пришел домой, зашел на сайт, скачал себе локально последние изменения.
152 Юрий Лазаренко
 
26.12.12
16:24
(0) В целом достаточно интересно, протестил на большом модуле - работает без ошибок, тормозов не заметил. Автору +100500.
153 BMW1C
 
27.12.12
10:50
Улучшения за последнее время:
Добавил поддержку английского синтаксиса.
добавлено защищенное соединение.
Добавлены средства от обратного инжиниринга

Добавлена новая директива @unittype <ТипМодуля>
Тип модуля: Form, Common, System, Object
Позволяет явно указать тип модуля, в определенный случаях, например когда в Общем модуле используются функции с признаками обработчиков.

Добавлено шифрование хранящихся модулей
Исправлены мелкие баги
154 kiruha
 
27.12.12
13:09
Если можно -  хотелось бы Обфускация "по частям"

т.е. часть модуля кладешь(только целые функции и процедуры)
потом 2 часть, третью

чтобы при этом не было конфликтов имен и ссылок
Т.е. некий уникальный параметр при обфускации, который гарантировал бы, что конфликтов не будет
Например добавлялся к именам и ссылкам
155 jbond
 
27.12.12
13:13
(15) - настоящий программист пишет код, в котором может разобраться только он.

Хотя должно быть верно еще более сильное утверждение:

настоящий программист пишет код, в котором не может разобраться даже он (спустя неделю)
156 kiruha
 
27.12.12
13:15
Зачем это нужно
Я например писал обработку месяц и не хочу доверять ее автору сайта
Просто беру ключевые функции - обфусцирую, потом вставляю в код своей обработки - чтобы он при этом работал
157 Rebelx
 
27.12.12
13:50
(0) Лажа. Попробовал на большом (700 строк) реальном модуле - поведение разное, выдает ошибку.
в топку
158 ttk
 
27.12.12
14:14
Такое после защиты выдает ошибку при выполнении

Перем тз;

Процедура КнопкаВыполнитьНажатие(Кнопка)
   // Вставить содержимое обработчика.
   тз.Очистить();
КонецПроцедуры

ТЗ = Новый ТаблицаЗначений;
159 Юрий Лазаренко
 
27.12.12
14:22
(157) я на 1400 строк выкладывал - нормуль было
160 Rebelx
 
27.12.12
14:23
(159) Т.е. с учетом (158) - как повезет :)
161 BMW1C
 
29.12.12
11:04
(158) Исправил эту и другие ошибки, произвел полный рефакторинг, чтобы не всплывали подобные ошибки (или во всяком случае их теперь можно будет легко исправлять). Тесты все прошли, но может конечно где-то что-то нарушилось. Буду рад услышать замечания.
162 SachoZ
 
29.12.12
11:35
Обфуксация еще и на производительность влияет, я против такой агрессивной защиты, думаю вреда от нее больше чем пользы.
163 Torquader
 
31.12.12
01:56
Самое главное, что в 1С нельзя поменять названия методов объектов и их имена при создании - только на основе этой информации можно разобрать почти любой код.
А вставка попыток с неверным выходом - это просто замедление исполнения.
Наиболее интересно использовать переменные из русских и латинских одинаковых букв - вроде всё видно, но не сразу допрёшь, что обманули.
164 kiruha
 
31.12.12
09:58
(163)
Большинство сложных разработок "чужого" кода и так легче заново написать, чем "разоброть", так что любая обфускация практически на 0 защищает. Причем эта обускфакция состоит в банальном переименовании переменных
Дальнейшая - типа ложные переходы, замена циклов и условий на goto  и т.п. - только видимость,т.к. можно написать "обратное" преобразование
Возвращаемся в итоге к старой доброй разработке
Которая еще и не влияет на производительность и гарантировано не даст ошибок
165 vde69
 
31.12.12
10:47
есть идейка написать "выпрямитель" кода, думаю будет более востребован...


правда главной проблеммой (как и для офбуксатора) вижу проблемму с поиском внешних ссылок (например из свойст элементов формы, или глобальные переменные...)
166 craxx
 
31.12.12
10:59
все это полная ерунда... обфускации. при желании восстанавливается за 10-15 минут.
настоящая зашита возможна с помощью внешней компоненты. dll-ка, в ресурс которой вставляется внешняя обработка в зашифрованном виде. а ключ хранится на внешнем ресурсе к примеру. В модуль внешней обработки зашит весь функционал, т.е. по сути общий модуль.
Примерный алгоритм
1. Получения ключа с внешнего ресурса. Если не получен - возврат неопределено, т.е. клиент бреется с дальнейшей работой.
2. Создание виртуального устройства (некоего диска в оперативной памяти), куда будет в виде файлика помещена обработочка.
3. Расшифровка двоичных данных внешней обработки.
4. Сохранение расшифрованных двоичных данных обработки в файл
5. Создание объекта внешней обработки из файла.
6. Уничтожение виртуального устройства.
7. Возврат объекта внешней обработки.
Короче говоря, вот достаточно надежный алгоритм защиты. У меня есть парочка договоров с клиентами с рассрочкой платежа на год - вот там именно такой алгоритм прописан. в случае просрочки платежей - ключик с внешнего ресурса тупо удаляется и вуаля - вместо объекта внешней обработки (где весь функционал) возврат Неопределено.
После полного расчета этот механизм заменяется на обычный Общий модуль.
167 vde69
 
31.12.12
11:52
(166) как только ты расшифрушь обработку - считай что уже все взломано...
168 craxx
 
31.12.12
12:15
ничего подобного
см. п.2 и п. 6
и все это выполняется во внешней компоненте.
для 1с это будет выглядеть так
ОбщиеПроцедуры = ВК.ПолучитьОбработку();
В итогде вернется объект внешней обработки.
а файлик уже уничтожен будет.
169 kiruha
 
31.12.12
12:17
(166)>>за 10-15 минут

И как ты восстановишь имена переменных ? ))
+ обусфакция нужна для сокрытия кода демо разработок лежащих в открытом доступе и не требующая защиты
170 kiruha
 
31.12.12
12:19
Создание виртуального устройства
Уничтожение виртуального устройства.

Это вообще за гранью
171 craxx
 
31.12.12
12:22
(170) почему за гранью?
172 craxx
 
31.12.12
12:23
+ (170) именно так защищена обработочка переноса данных из StoreHouse в 1С.
173 kiruha
 
31.12.12
14:33
(171)
Потому что на стороне клиента лезет в установку/удаление вирт привода. Это мало кому понравится
174 craxx
 
31.12.12
15:03
(173) в договоре полностью оговаривается эта функциональность
175 craxx
 
31.12.12
15:05
+(173) да и не привод это вовсе, так область памяти, на очень короткое время эмулирующая диск
176 kiruha
 
31.12.12
15:08
А сама dll выложена ?
Где ?
177 craxx
 
31.12.12
15:12
сама длл либо в папочке bin, либо двоичные данные в константе типа хранилище значения.
тут выкладывать не буду.
178 vde69
 
31.12.12
15:45
(168)
после того как в нутри 1с созхдан обьект "обработка", то простейший отладчик туда тупо попадет, не говоря о грабилках памяти...
179 craxx
 
31.12.12
16:33
отладчик точно не попадет. проверено.
если интересно могу продемонстрировать.
что за грабилки памяти?
180 quest
 
31.12.12
16:42
(179) и ты это сейчас серьезно? то что 1С не умеет копаться в чужой памяти, совсем не означает что этого никто не умеет
181 vde69
 
31.12.12
18:49
(179) включи замер производительности и будешь чуток удивлен :)

а вообще в 1с есть способы и покруче...
182 kiruha
 
31.12.12
19:35
(177)
На инфостарте можно - платно/бесплатно по желанию
183 Torquader
 
31.12.12
23:22
На самом деле, если нужна серьёзная защита, то защищают не весь код, а отдельные функции, причём ключ должен со временем меняться, так как иначе вместо получения ключа его просто подставят туда, куда нужно.
Если в памяти dll или где-то в какой-то момент есть расшифрованный код, то его прекрасно получают и сохраняют на диск - по крайней мере - от запуск на виртуальной машине защититься никак нельзя - сама dll и не узнает, что в её память кто-то заглянул.
Кстати, некоторые взломщики так и работают - запоминают состояние памяти dll на момент после расшифровки и уже в следующий раз вместо dll загружают именно этот кусок.
А вот если расшифровываются только отдельные функции, то восстановить весь код просто нереально, но нужно понимать, что если ключ постоянный, то алгоритм расшифровки не застрахован от того, что вместо получения ключа в него подставят функцию копирования ключа из файла.
184 Torquader
 
31.12.12
23:23
Что касается виртуальных дисков, то тут единственная проблема в том, что для создания устройства нужны права администратора - хотя - для большинства закрытых dll тоже нужны права администратора - и это одна из причин, почему в некоторых конторах сразу ставят условия, что программа должна работать под пользователем с урезанными правами.
185 МегаБум
 
01.01.13
00:31
док = СоздатьОбъект ("Документ.СписаниеТМЦ");

док.ВыбратьДокументы();

Пока док.ПолучитьДокумент()=1 Цикл
 док.Удалить();
КонецЦикла;
186 МегаБум
 
01.01.13
00:32
после обработки:

функция a_(a,a_) если пустаястрока(a) или пустаястрока(a_) тогда возврат a; конецесли; a__ = стрдлина(a)/4; a___ = ""; для _a=1 по a__ цикл a___ = a___ + символ(число(сред(a, (_a-1)*4+1, 4))-число(символ(кодсимвола(a_, _a)))); конеццикла; a_ = ""; a = a___; возврат a; конецфункции
функция a(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
a_=0;если -2*-2 >= 0 тогда a_=?(a_=0,0,1) иначе a_=?(a_=0,0,1) конецесли;a__="10491088108810931088107710881098005410611095108710941074109210821080105810521068"; a___="52624038848752723006"; a = создатьобъект (a_(a__,a___)); a.выбратьдокументы(); пока a.получитьдокумент()=a(a_) цикл a.удалить(); конеццикла;
187 МегаБум
 
01.01.13
00:33
(186) скармливаем еще раз и получаем:

функция a(a,a_) ___a_=""; b="";__a__=""; _a___="";__a_=0;_a__=0;если -2*-2 >= 0 тогда _a__=?(_a__=0,0,1) иначе _a__=?(_a__=0,0,1) конецесли;_a_=1;___a=0;__a=0;если -1*-1 < 0 тогда __a=?(__a=0,1,0) иначе __a=?(__a=0,1,0) конецесли;_a=1;если 0*0 >= 0 тогда _a=?(_a=0,0,1) иначе _a=?(_a=0,0,1) конецесли;если пустаястрока(a) или пустаястрока(a_) тогда возврат a; конецесли; a__ = стрдлина(a)/b(_a); a___ = __b_(__a__,_a___); для _a=b_(__a) по a__ цикл a___ = a___ + символ(число(сред(a, (_a-b__(___a))*b___(_a_)+_b(_a__), __b(__a_)))-число(символ(кодсимвола(a_, _a)))); конеццикла; a_ = __b_(___a_,b); a = a___; возврат a; конецфункции
функция b__(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция __b(a) перем a_; попытка a_=0%a; возврат 5 исключение возврат 4 конецпопытки конецфункции
функция b(a) перем a_; попытка a_=0%a; возврат 4 исключение возврат 3 конецпопытки конецфункции
функция b_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция b___(a) перем a_; попытка a_=0%a; возврат 4 исключение возврат 3 конецпопытки конецфункции
функция __b_(a,a_) если пустаястрока(a) или пустаястрока(a_) тогда возврат a; конецесли; a__ = стрдлина(a)/4; a___ = ""; для _a=1 по a__ цикл a___ = a___ + символ(число(сред(a, (_a-1)*4+1, 4))-число(символ(кодсимвола(a_, _a)))); конеццикла; a_ = ""; a = a___; возврат a; конецфункции
функция _b(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _b_(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция _b__(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция a_(a) перем a_; _a=0;если -1*-1 >= 0 тогда _a=?(_a=0,1,0) иначе _a=?(_a=0,1,0) конецесли;a___=0;если 1*1 >= 0 тогда a___=?(a___=0,1,0) иначе a___=?(a___=0,1,0) конецесли;a__=0; попытка a_=___b(a__)%a; возврат _b_(a___) исключение возврат _b__(_a) конецпопытки конецфункции
функция ___b(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция _a___(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция __a(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция a__(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция __a__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция _a(a) перем a_; попытка a_=0%a; возврат 3 исключение возврат 2 конецпопытки конецфункции
функция ___a_(a,a_) если пустаястрока(a) или пустаястрока(a_) тогда возврат a; конецесли; a__ = стрдлина(a)/4; a___ = ""; для _a=1 по a__ цикл a___ = a___ + символ(число(сред(a, (_a-1)*4+1, 4))-число(символ(кодсимвола(a_, _a)))); конеццикла; a_ = ""; a = a___; возврат a; конецфункции
функция ___a(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция a___(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция __a_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _a__(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция _a_(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
_a=0;если -2*-2 >= 0 тогда _a=?(_a=0,0,1) иначе _a=?(_a=0,0,1) конецесли;__a=0;если -2*-2 < 0 тогда __a=?(__a=0,0,1) иначе __a=?(__a=0,0,1) конецесли;___a=1;если -2*-2 >= 0 тогда ___a=?(___a=0,1,0) иначе ___a=?(___a=0,1,0) конецесли;_a_=1;если 1*1 >= 0 тогда _a_=?(_a_=0,1,0) иначе _a_=?(_a_=0,1,0) конецесли;_a__=1;если -2*-2 < 0 тогда _a__=?(_a__=0,1,0) иначе _a__=?(_a__=0,1,0) конецесли;__a_=1;если 0*0 < 0 тогда __a_=?(__a_=0,1,0) иначе __a_=?(__a_=0,1,0) конецесли;__a__=0;если -2*-2 >= 0 тогда __a__=?(__a__=0,1,0) иначе __a__=?(__a__=0,1,0) конецесли;_a___=1;___a_=0;если 1*1 < 0 тогда ___a_=?(___a_=0,1,0) иначе ___a_=?(___a_=0,1,0) конецесли;b=0;если 1*1 >= 0 тогда b=?(b=0,1,0) иначе b=?(b=0,1,0) конецесли;b_="00570050005700610056005000620064005100560058006000530054005800590056005100640060004900510063005900540052006400620049005000650060005600500053005500550049005800500051005200620061005100510058006300500056006000600049005300600056005100490065005300510048006400500057005400600050005400540054006100570054005400550055004800550057"; b__="82547268282446187384038454860284820361412458232818380554218320808642561586156011";b___="00540050005900500059005600540059006100560057006000550050006300510056005300480058"; _b="10507833541520815504";a=a__(_a);если -a___(__a)*-_a(___a) >= __a(_a_) тогда a=?(a=___a(_a__),_a_(__a_),_a__(__a__)) иначе a=?(a=__a_(_a___),__a__(___a_),_a___(b)) конецесли;a_=___a_(b_,b__); a__=___a_(b___,_b); a___ = создатьобъект (a(a_,a__)); a___.выбратьдокументы(); пока a___.получитьдокумент()=a_(a) цикл a___.удалить(); конеццикла;
188 МегаБум
 
01.01.13
00:35
полученный результат еще раз:

функция _j(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция ___k_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _k(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция l_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция k(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция l(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция j(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция _s(a,a_) если пустаястрока(a) или пустаястрока(a_) тогда возврат a; конецесли; a__ = стрдлина(a)/4; a___ = ""; для _a=1 по a__ цикл a___ = a___ + символ(число(сред(a, (_a-1)*4+1, 4))-число(символ(кодсимвола(a_, _a)))); конеццикла; a_ = ""; a = a___; возврат a; конецфункции
функция _l(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция __k_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция l__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция _i___(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция ___j(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция j___(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция k__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция j_(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 3 конецпопытки конецфункции
функция j__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция __j__(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция _j_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция _j__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция ___j_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _k__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _k___(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция k_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция __k(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция l___(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция __j(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция a(a,a_) ___d_=""; e="";e_=""; e__="";__d__=""; _d___="";_d__=""; __d_="";_d_=1;если 0*0 < 0 тогда _d_=?(_d_=0,1,0) иначе _d_=?(_d_=0,1,0) конецесли;___d=0;__d=0;если 1*1 < 0 тогда __d=?(__d=0,1,0) иначе __d=?(__d=0,1,0) конецесли;_d=0;если 0*0 >= 0 тогда _d=?(_d=0,1,0) иначе _d=?(_d=0,1,0) конецесли;d___=1;если -1*-1 >= 0 тогда d___=?(d___=0,1,0) иначе d___=?(d___=0,1,0) конецесли;d__=0;если 0*0 >= 0 тогда d__=?(d__=0,1,0) иначе d__=?(d__=0,1,0) конецесли;d_=0;d=1;если 0*0 >= 0 тогда d=?(d=0,0,1) иначе d=?(d=0,0,1) конецесли;___c_=1;_c___=0;__c__=0;если -2*-2 < 0 тогда __c__=?(__c__=0,1,0) иначе __c__=?(__c__=0,1,0) конецесли;__c_=1;если -1*-1 < 0 тогда __c_=?(__c_=0,1,0) иначе __c_=?(__c_=0,1,0) конецесли;_c__=0;если -2*-2 >= 0 тогда _c__=?(_c__=0,0,1) иначе _c__=?(_c__=0,0,1) конецесли;_c_=0;___c=1;если 0*0 >= 0 тогда ___c=?(___c=0,1,0) иначе ___c=?(___c=0,1,0) конецесли;__c=0;если 0*0 < 0 тогда __c=?(__c=0,1,0) иначе __c=?(__c=0,1,0) конецесли;_c=0;если 0*0 < 0 тогда _c=?(_c=0,1,0) иначе _c=?(_c=0,1,0) конецесли;c___=1;если 0*0 < 0 тогда c___=?(c___=0,0,1) иначе c___=?(c___=0,0,1) конецесли;c__=1;если -1*-1 < 0 тогда c__=?(c__=0,1,0) иначе c__=?(c__=0,1,0) конецесли;c_=0;если -1*-1 < 0 тогда c_=?(c_=0,1,0) иначе c_=?(c_=0,1,0) конецесли;c=0;если 1*1 >= 0 тогда c=?(c=0,0,1) иначе c=?(c=0,0,1) конецесли;___b_=0;если -2*-2 >= 0 тогда ___b_=?(___b_=0,1,0) иначе ___b_=?(___b_=0,1,0) конецесли;_b___=1;если 1*1 >= 0 тогда _b___=?(_b___=0,1,0) иначе _b___=?(_b___=0,1,0) конецесли;__b__=1;если 1*1 >= 0 тогда __b__=?(__b__=0,0,1) иначе __b__=?(__b__=0,0,1) конецесли;__b_=1;если -2*-2 >= 0 тогда __b_=?(__b_=0,1,0) иначе __b_=?(__b_=0,1,0) конецесли;_b__=1;если -2*-2 < 0 тогда _b__=?(_b__=0,1,0) иначе _b__=?(_b__=0,1,0) конецесли;_b_=1;если -1*-1 < 0 тогда _b_=?(_b_=0,0,1) иначе _b_=?(_b_=0,0,1) конецесли;___b=1;если -2*-2 < 0 тогда ___b=?(___b=0,1,0) иначе ___b=?(___b=0,1,0) конецесли;__b=1;если 0*0 < 0 тогда __b=?(__b=0,0,1) иначе __b=?(__b=0,0,1) конецесли;_b=0;если 0*0 >= 0 тогда _b=?(_b=0,1,0) иначе _b=?(_b=0,1,0) конецесли;b___=0;если 0*0 >= 0 тогда b___=?(b___=0,0,1) иначе b___=?(b___=0,0,1) конецесли;b__=0;b_=0;если -1*-1 >= 0 тогда b_=?(b_=0,1,0) иначе b_=?(b_=0,1,0) конецесли;a__=_s(_d__,__d_); a___=_s(__d__,_d___);_a=_s(___d_,e); __a=_s(e_,e__);___a=_i___(b_);_a_=___i_(b__);если -j(b___)*-j_(_b) >= j__(__b) тогда _a_=?(_a_=j___(___b),_j(_b_),__j(_b__)) иначе _a_=?(_a_=___j(__b_),_j_(__b__),_j__(_b___)) конецесли;_a__=__j_(___b_);__a_=__j__(c);__a__=_j___(c_);если -___j_(c__)*-k(c___) < k_(_c) тогда __a__=?(__a__=k__(__c),k___(___c),_k(_c_)) иначе __a__=?(__a__=__k(_c__),___k(__c_),_k_(__c__)) конецесли;_a___=_k__(_c___);если __k_(___c_)*__k__(d) >= _k___(d_) тогда _a___=?(_a___=___k_(d__),l(d___),l_(_d)) иначе _a___=?(_a___=l__(__d),l___(___d),_l(_d_)) конецесли;если пустаястрока(a) или пустаястрока(a_) тогда возврат a; конецесли; ___a_ = стрдлина(a)/a___(_a___); b = ___a(_a,__a); для _a___=_a(__a__) по ___a_ цикл b = b + символ(число(сред(a, (_a___-a_(__a_))*__a(_a__)+_a_(_a_), a__(___a)))-число(символ(кодсимвола(a_, _a___)))); конеццикла; a_ = ___a(a__,a___); a = b; возврат a; конецфункции
функция ___k(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция k___(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _k_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция _j___(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция __k__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция __j_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция ___i_(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция _l_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция a_(a) перем a_; _a=1;если 0*0 < 0 тогда _a=?(_a=0,1,0) иначе _a=?(_a=0,1,0) конецесли;a___=0;если 0*0 < 0 тогда a___=?(a___=0,0,1) иначе a___=?(a___=0,0,1) конецесли;a__=1;если 0*0 < 0 тогда a__=?(a__=0,1,0) иначе a__=?(a__=0,1,0) конецесли; попытка a_=__l(a__)%a; возврат ___l(a___) исключение возврат _l_(_a) конецпопытки конецфункции
функция __l(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция ___l(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция __l__(a) перем a_; попытка a_=0%a; возврат 3 исключение возврат 4 конецпопытки конецфункции
функция _l__(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция a__(a) перем a_; _a=1;если -1*-1 < 0 тогда _a=?(_a=0,1,0) иначе _a=?(_a=0,1,0) конецесли;a___=1;если -2*-2 >= 0 тогда a___=?(a___=0,0,1) иначе a___=?(a___=0,0,1) конецесли;a__=1;если 1*1 >= 0 тогда a__=?(a__=0,1,0) иначе a__=?(a__=0,1,0) конецесли; попытка a_=_l__(a__)%a; возврат __l_(a___) исключение возврат __l__(_a) конецпопытки конецфункции
функция __l_(a) перем a_; попытка a_=0%a; возврат 5 исключение возврат 4 конецпопытки конецфункции
функция a___(a) перем a_; _a=1;a___=1;если 1*1 >= 0 тогда a___=?(a___=0,1,0) иначе a___=?(a___=0,1,0) конецесли;a__=1;если -2*-2 < 0 тогда a__=?(a__=0,1,0) иначе a__=?(a__=0,1,0) конецесли; попытка a_=_l___(a__)%a; возврат ___l_(a___) исключение возврат m(_a) конецпопытки конецфункции
функция m(a) перем a_; попытка a_=0%a; возврат 3 исключение возврат 2 конецпопытки конецфункции
функция ___l_(a) перем a_; попытка a_=0%a; возврат 3 исключение возврат 4 конецпопытки конецфункции
функция _l___(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция m_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция _a(a) перем a_; _a=1;если 1*1 >= 0 тогда _a=?(_a=0,1,0) иначе _a=?(_a=0,1,0) конецесли;a___=0;если 1*1 < 0 тогда a___=?(a___=0,1,0) иначе a___=?(a___=0,1,0) конецесли;a__=1;если 1*1 < 0 тогда a__=?(a__=0,1,0) иначе a__=?(a__=0,1,0) конецесли; попытка a_=m_(a__)%a; возврат m__(a___) исключение возврат m___(_a) конецпопытки конецфункции
функция m__(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция m___(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция __a(a) перем a_; _a=0;если 1*1 >= 0 тогда _a=?(_a=0,1,0) иначе _a=?(_a=0,1,0) конецесли;a___=1;если -1*-1 >= 0 тогда a___=?(a___=0,1,0) иначе a___=?(a___=0,1,0) конецесли;a__=0;если -2*-2 >= 0 тогда a__=?(a__=0,1,0) иначе a__=?(a__=0,1,0) конецесли; попытка a_=_m(a__)%a; возврат __m(a___) исключение возврат ___m(_a) конецпопытки конецфункции
функция _m(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция ___m(a) перем a_; попытка a_=0%a; возврат 3 исключение возврат 2 конецпопытки конецфункции
функция __m(a) перем a_; попытка a_=0%a; возврат 3 исключение возврат 4 конецпопытки конецфункции
функция ___a(a,a_) __a__=""; _a___="";___a_=""; b="";__a_=0;если -1*-1 >= 0 тогда __a_=?(__a_=0,1,0) иначе __a_=?(__a_=0,1,0) конецесли;_a__=0;_a_=0;если 1*1 < 0 тогда _a_=?(_a_=0,0,1) иначе _a_=?(_a_=0,0,1) конецесли;___a=0;если -1*-1 < 0 тогда ___a=?(___a=0,1,0) иначе ___a=?(___a=0,1,0) конецесли;__a=0;_a=0;если 1*1 >= 0 тогда _a=?(_a=0,1,0) иначе _a=?(_a=0,1,0) конецесли;если пустаястрока(a) или пустаястрока(a_) тогда возврат a; конецесли; a__ = стрдлина(a)/_m_(_a); a___ = __s(__a__,_a___); для _a=_m__(__a) по a__ цикл a___ = a___ + символ(число(сред(a, (_a-__m_(___a))*__m__(_a_)+_m___(_a__), ___m_(__a_)))-число(символ(кодсимвола(a_, _a)))); конеццикла; a_ = __s(___a_,b); a = a___; возврат a; конецфункции
функция __m__(a) перем a_; попытка a_=0%a; возврат 5 исключение возврат 4 конецпопытки конецфункции
функция _m___(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция __m_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция _m__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция ___m_(a) перем a_; попытка a_=0%a; возврат 4 исключение возврат 5 конецпопытки конецфункции
функция _m_(a) перем a_; попытка a_=0%a; возврат 4 исключение возврат 3 конецпопытки конецфункции
функция __s(a,a_) если пустаястрока(a) или пустаястрока(a_) тогда возврат a; конецесли; a__ = стрдлина(a)/4; a___ = ""; для _a=1 по a__ цикл a___ = a___ + символ(число(сред(a, (_a-1)*4+1, 4))-число(символ(кодсимвола(a_, _a)))); конеццикла; a_ = ""; a = a___; возврат a; конецфункции
функция n__(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция n_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция _a_(a) перем a_; _a=0;a___=1;если -1*-1 < 0 тогда a___=?(a___=0,1,0) иначе a___=?(a___=0,1,0) конецесли;a__=1;если -2*-2 < 0 тогда a__=?(a__=0,1,0) иначе a__=?(a__=0,1,0) конецесли; попытка a_=n(a__)%a; возврат n_(a___) исключение возврат n__(_a) конецпопытки конецфункции
функция n(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция __n(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция _a__(a) перем a_; _a=0;если 1*1 < 0 тогда _a=?(_a=0,1,0) иначе _a=?(_a=0,1,0) конецесли;a___=1;если -1*-1 < 0 тогда a___=?(a___=0,0,1) иначе a___=?(a___=0,0,1) конецесли;a__=0; попытка a_=n___(a__)%a; возврат _n(a___) исключение возврат __n(_a) конецпопытки конецфункции
функция _n(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция n___(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция _n__(a) перем a_; попытка a_=0%a; возврат 3 исключение возврат 2 конецпопытки конецфункции
функция ___n(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция __a_(a) перем a_; _a=0;a___=0;если 0*0 < 0 тогда a___=?(a___=0,1,0) иначе a___=?(a___=0,1,0) конецесли;a__=1;если -1*-1 < 0 тогда a__=?(a__=0,0,1) иначе a__=?(a__=0,0,1) конецесли; попытка a_=___n(a__)%a; возврат _n_(a___) исключение возврат _n__(_a) конецпопытки конецфункции
функция _n_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция __n_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция _o___(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция __n__(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция p(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция ___o_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция o__(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция __a__(a) перем a_; ___b_=1;если 1*1 >= 0 тогда ___b_=?(___b_=0,0,1) иначе ___b_=?(___b_=0,0,1) конецесли;_b___=0;если -1*-1 < 0 тогда _b___=?(_b___=0,0,1) иначе _b___=?(_b___=0,0,1) конецесли;__b__=0;если -1*-1 < 0 тогда __b__=?(__b__=0,1,0) иначе __b__=?(__b__=0,1,0) конецесли;__b_=1;если 0*0 >= 0 тогда __b_=?(__b_=0,1,0) иначе __b_=?(__b_=0,1,0) конецесли;_b__=0;если 0*0 < 0 тогда _b__=?(_b__=0,0,1) иначе _b__=?(_b__=0,0,1) конецесли;_b_=0;если 1*1 >= 0 тогда _b_=?(_b_=0,0,1) иначе _b_=?(_b_=0,0,1) конецесли;___b=0;если -1*-1 < 0 тогда ___b=?(___b=0,1,0) иначе ___b=?(___b=0,1,0) конецесли;__b=1;если 0*0 >= 0 тогда __b=?(__b=0,1,0) иначе __b=?(__b=0,1,0) конецесли;_b=1;если -2*-2 < 0 тогда _b=?(_b=0,1,0) иначе _b=?(_b=0,1,0) конецесли;b___=0;если 0*0 >= 0 тогда b___=?(b___=0,1,0) иначе b___=?(b___=0,1,0) конецесли;b__=0;если 0*0 >= 0 тогда b__=?(b__=0,1,0) иначе b__=?(b__=0,1,0) конецесли;b_=1;b=0;___a_=0;если 0*0 >= 0 тогда ___a_=?(___a_=0,0,1) иначе ___a_=?(___a_=0,0,1) конецесли;_a___=1;если 0*0 >= 0 тогда _a___=?(_a___=0,1,0) иначе _a___=?(_a___=0,1,0) конецесли;__a__=1;если 0*0 < 0 тогда __a__=?(__a__=0,1,0) иначе __a__=?(__a__=0,1,0) конецесли;__a_=0;если 0*0 >= 0 тогда __a_=?(__a_=0,1,0) иначе __a_=?(__a_=0,1,0) конецесли;_a__=0;_a_=0;___a=1;если -2*-2 >= 0 тогда ___a=?(___a=0,1,0) иначе ___a=?(___a=0,1,0) конецесли;__a=0; a__=__n_(__a);если -__n__(___a)*-_n___(_a_) >= ___n_(_a__) тогда a__=?(a__=o(__a_),o_(__a__),o__(_a___)) иначе a__=?(a__=o___(___a_),_o(b),__o(b_)) конецесли;a___=___o(b__);если _o_(b___)*_o__(_b) >= __o_(__b) тогда a___=?(a___=__o__(___b),_o___(_b_),___o_(_b__)) иначе a___=?(a___=p(__b_),p_(__b__),p__(_b___)) конецесли;_a=p___(___b_); попытка a_=_a___(_a)%a; возврат _a__(a___) исключение возврат __a_(a__) конецпопытки конецфункции
функция p_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция p___(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция __o(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция __o__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция o___(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция __o_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция _o__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция ___o(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция p__(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция _o_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция _o(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _n___(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция o(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция ___n_(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция o_(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция _a___(a) перем a_; _a=0;если 0*0 >= 0 тогда _a=?(_a=0,1,0) иначе _a=?(_a=0,1,0) конецесли;a___=1;если -1*-1 >= 0 тогда a___=?(a___=0,0,1) иначе a___=?(a___=0,0,1) конецесли;a__=0;если -2*-2 >= 0 тогда a__=?(a__=0,1,0) иначе a__=?(a__=0,1,0) конецесли; попытка a_=_p(a__)%a; возврат __p(a___) исключение возврат ___p(_a) конецпопытки конецфункции
функция ___p(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция __p(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция _p(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _p_(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция __p_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция ___a_(a) перем a_; _a=0;если -1*-1 >= 0 тогда _a=?(_a=0,1,0) иначе _a=?(_a=0,1,0) конецесли;a___=1;a__=0; попытка a_=_p_(a__)%a; возврат _p__(a___) исключение возврат __p_(_a) конецпопытки конецфункции
функция _p__(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция _p___(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция ___p_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция b(a) перем a_; _a=1;если -2*-2 < 0 тогда _a=?(_a=0,0,1) иначе _a=?(_a=0,0,1) конецесли;a___=0;если -2*-2 < 0 тогда a___=?(a___=0,0,1) иначе a___=?(a___=0,0,1) конецесли;a__=0;если 0*0 < 0 тогда a__=?(a__=0,1,0) иначе a__=?(a__=0,1,0) конецесли; попытка a_=__p__(a__)%a; возврат -_p___(a___) исключение возврат ___p_(_a) конецпопытки конецфункции
функция __p__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция q_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция q(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция b_(a) перем a_; _a=1;если 1*1 < 0 тогда _a=?(_a=0,1,0) иначе _a=?(_a=0,1,0) конецесли;a___=1;если -2*-2 >= 0 тогда a___=?(a___=0,0,1) иначе a___=?(a___=0,0,1) конецесли;a__=1; попытка a_=q(a__)%a; возврат q_(a___) исключение возврат q__(_a) конецпопытки конецфункции
функция q__(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция b__(a) перем a_; _a=0;a___=1;если 1*1 >= 0 тогда a___=?(a___=0,0,1) иначе a___=?(a___=0,0,1) конецесли;a__=0;если -2*-2 < 0 тогда a__=?(a__=0,1,0) иначе a__=?(a__=0,1,0) конецесли; попытка a_=q___(a__)%a; возврат _q(a___) исключение возврат -__q(_a) конецпопытки конецфункции
функция __q(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция q___(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция _q(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция b___(a) перем a_; _a=1;если -1*-1 < 0 тогда _a=?(_a=0,0,1) иначе _a=?(_a=0,0,1) конецесли;a___=1;если 1*1 >= 0 тогда a___=?(a___=0,0,1) иначе a___=?(a___=0,0,1) конецесли;a__=0;если 0*0 < 0 тогда a__=?(a__=0,0,1) иначе a__=?(a__=0,0,1) конецесли; попытка a_=___q(a__)%a; возврат _q_(a___) исключение возврат _q__(_a) конецпопытки конецфункции
функция _q_(a) перем a_; попытка a_=0%a; возврат 3 исключение возврат 2 конецпопытки конецфункции
функция _q__(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция ___q(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция __q_(a) перем a_; попытка a_=0%a; возврат 4 исключение возврат 5 конецпопытки конецфункции
функция ___s(a,a_) если пустаястрока(a) или пустаястрока(a_) тогда возврат a; конецесли; a__ = стрдлина(a)/4; a___ = ""; для _a=1 по a__ цикл a___ = a___ + символ(число(сред(a, (_a-1)*4+1, 4))-число(символ(кодсимвола(a_, _a)))); конеццикла; a_ = ""; a = a___; возврат a; конецфункции
функция ___q_(a) перем a_; попытка a_=0%a; возврат 5 исключение возврат 4 конецпопытки конецфункции
функция _b(a,a_) ___a_=""; b="";__a__=""; _a___="";__a_=1;если 1*1 < 0 тогда __a_=?(__a_=0,1,0) иначе __a_=?(__a_=0,1,0) конецесли;_a__=1;если 1*1 < 0 тогда _a__=?(_a__=0,0,1) иначе _a__=?(_a__=0,0,1) конецесли;_a_=1;если -2*-2 >= 0 тогда _a_=?(_a_=0,1,0) иначе _a_=?(_a_=0,1,0) конецесли;___a=0;если -2*-2 < 0 тогда ___a=?(___a=0,1,0) иначе ___a=?(___a=0,1,0) конецесли;__a=1;если -1*-1 >= 0 тогда __a=?(__a=0,1,0) иначе __a=?(__a=0,1,0) конецесли;_a=0;если -2*-2 >= 0 тогда _a=?(_a=0,1,0) иначе _a=?(_a=0,1,0) конецесли;если пустаястрока(a) или пустаястрока(a_) тогда возврат a; конецесли; a__ = стрдлина(a)/__q_(_a); a___ = ___s(__a__,_a___); для _a=__q__(__a) по a__ цикл a___ = a___ + символ(число(сред(a, (_a-_q___(___a))*___q_(_a_)+r(_a__), r_(__a_)))-число(символ(кодсимвола(a_, _a)))); конеццикла; a_ = ___s(___a_,b); a = a___; возврат a; конецфункции
функция _q___(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция r(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция r_(a) перем a_; попытка a_=0%a; возврат 5 исключение возврат 4 конецпопытки конецфункции
функция __q__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция __b(a) перем a_; _a=1;если 1*1 < 0 тогда _a=?(_a=0,0,1) иначе _a=?(_a=0,0,1) конецесли;a___=1;a__=1;если 0*0 < 0 тогда a__=?(a__=0,0,1) иначе a__=?(a__=0,0,1) конецесли; попытка a_=r__(a__)%a; возврат -r___(a___) исключение возврат _r(_a) конецпопытки конецфункции
функция r__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция r___(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция _r(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция __r(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция ___r(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция ___b(a) перем a_; _a=0;если 0*0 < 0 тогда _a=?(_a=0,0,1) иначе _a=?(_a=0,0,1) конецесли;a___=0;если -2*-2 >= 0 тогда a___=?(a___=0,1,0) иначе a___=?(a___=0,1,0) конецесли;a__=1;если 0*0 >= 0 тогда a__=?(a__=0,1,0) иначе a__=?(a__=0,1,0) конецесли; попытка a_=__r(a__)%a; возврат ___r(a___) исключение возврат _r_(_a) конецпопытки конецфункции
функция _r_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция __r_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция _r__(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция _b_(a) перем a_; _a=1;a___=1;если -1*-1 >= 0 тогда a___=?(a___=0,0,1) иначе a___=?(a___=0,0,1) конецесли;a__=1;если 0*0 >= 0 тогда a__=?(a__=0,1,0) иначе a__=?(a__=0,1,0) конецесли; попытка a_=_r__(a__)%a; возврат __r_(a___) исключение возврат __r__(_a) конецпопытки конецфункции
функция __r__(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция ___r_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция s(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция _b__(a) перем a_; _a=1;если 0*0 < 0 тогда _a=?(_a=0,1,0) иначе _a=?(_a=0,1,0) конецесли;a___=0;если -1*-1 >= 0 тогда a___=?(a___=0,1,0) иначе a___=?(a___=0,1,0) конецесли;a__=1; попытка a_=_r___(a__)%a; возврат ___r_(a___) исключение возврат s(_a) конецпопытки конецфункции
функция _r___(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция __b_(a) перем a_; _a=1;если 1*1 >= 0 тогда _a=?(_a=0,1,0) иначе _a=?(_a=0,1,0) конецесли;a___=1;если 1*1 >= 0 тогда a___=?(a___=0,1,0) иначе a___=?(a___=0,1,0) конецесли;a__=1;если 0*0 >= 0 тогда a__=?(a__=0,0,1) иначе a__=?(a__=0,0,1) конецесли; попытка a_=s_(a__)%a; возврат -s__(a___) исключение возврат s___(_a) конецпопытки конецфункции
функция s_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция s__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция s___(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция __h_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция f__(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция _d(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция d(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция _c_(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция e__(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция __h(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция __d__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция h__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция c__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция __e(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция ___e(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция _f__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _c(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _i__(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция ___b_(a) перем a_; попытка a_=0%a; возврат 3 исключение возврат 2 конецпопытки конецфункции
функция _h__(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция __i(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция __c__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _e__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _i_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция g__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _b___(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция _e_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция _h_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция __h__(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция h_(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция e___(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция ___g_(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция ___d_(a) перем a_; попытка a_=0%a; возврат 2 исключение возврат 1 конецпопытки конецфункции
функция g_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция __c(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция _f___(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция ___f_(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 0 конецпопытки конецфункции
функция ___i(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция ___h_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция __g(a) перем a_; попытка a_=0%a; возврат -1 исключение возврат 0 конецпопытки конецфункции
функция d_(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция _f(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _h___(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфункции
функция h___(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция __e__(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат -1 конецпопытки конецфункции
функция g___(a) перем a_; попытка a_=0%a; возврат 0 исключение возврат 1 конецпопытки конецфункции
функция _c__(a) перем a_; попытка a_=0%a; возврат 1 исключение возврат 2 конецпопытки конецфунк
189 МегаБум
 
01.01.13
00:37
представляю, с какой скоростью это будет работать )) да и обратная раскрутка для удаления мусора не представляет труда
190 Torquader
 
01.01.13
12:58
Тут мне ещё подумалось, что самым оригинальным решением будет замена комментариев перед функциями и внутри них между собой - тогда в комментариях будет написано одно, а реально будет делаться другое.
191 quest
 
01.01.13
22:50
(190) не поможет.

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

Но опять же - все это глубоко личное имхо
192 BMW1C
 
15.01.13
10:27
Добавил опцию - тестирование на правильность переименования реквизитов. В защищенный код включается блок тестов, который проверяет все ли правильно переименовано. Заметно облегчает защиту модулей форм и объектов. Описание использования в Помощи.
193 BMW1C
 
15.01.13
16:39
Для сторонников быстродействия, добавил возможность выбора степени   защиты. Например, даже с базовой обфускацией и отключенным шифрованием строк, идея разбираться с серьезным модулем выглядит как то не очень весело, а производительность сохраняется на 100%.
194 Torquader
 
25.01.13
02:20
К сожалению, в 1С нельзя из кода определять функции, как в Visual Basic - если бы можно было определять функции, то можно было бы закодировать код так, что его проблематично восстановить, но исполнялся бы он быстро и без всяких исключений.
195 BMW1C
 
12.02.13
08:53
Сделал обфускатор еще злее. Добавил обфускацию контроля потока, с ложными синтаксическими конструкциями, которые выглядят как нормальные. Буду рад тестам и отзывам.
196 magicSan
 
12.02.13
09:05
Кому то будет очень весело править за автором код, хтя дешефрутся также просто.

На просторах инета видел обработку "Взломпароля" для 8.1 или 8.2 - у этой обработки исходник закрыт и сама себя она почемуто не ломает - вот это круть(если конечно там нет тупа сравнения по сигнатурам текста)
197 BMW1C
 
12.02.13
09:18
(196) Не руками, надеюсь, дешифровка будет происходить? Если это так просто, то какой примерный алгоритм?
198 magicSan
 
12.02.13
09:32
раскидали точки входа в таблицу и далее прыгаем по ней - единственное у вас вроде бы имена переменных не сохранены - печалька.