|
OFF: Обфускатор 1С. | ☑ | ||
---|---|---|---|---|
0
AndStar
20.12.12
✎
10:27
|
||||
1
MRAK
20.12.12
✎
10:32
|
уже было:
http://infostart.ru/public/15907/ |
|||
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
|
Подозрение на то, что неправильно обрабатывается "константа типа дата". Из такого кода:
получается такой:
при проверке синтаксиса ругается на: 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
|
||||
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
|
раскидали точки входа в таблицу и далее прыгаем по ней - единственное у вас вроде бы имена переменных не сохранены - печалька.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |