<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='\
Обфускатор 1С пока находиться на стадии тестирования, поэтому прошу сообщать об обнаруженных багах.
На коде 7.7 не тестировал (так как «вживую» семерку уже давно не видел), но вероятно будет работать и для него.
Пока имеется только один баг: нельзя использовать ковычки в комментарии.
Кто подскажет мне шаблон регулярного выражения, способного отличить двойной слэш внутри строковой константы от комментария, буду очень признателен )
Обфуксатор оч.даже + а вот Для отладки RegExp лучше использовать RegexBuddy
(3) Не знал, поэтому и нарисовал по-быстрому свою обработку, гляну эту программу, спасибо… )
(1) Насколько я понял, так как обработка исходного текста происходит в отрыве от контекста, то надо самому определять, какие имена процедур, функций и переменных можно заменять на белиберду, а какие — нет. Ведь нет никакой информации о том, какие переменные, процедуры и функции являются глобальными, какие переменные являются реквизитами объекта или формы и т.д.
Но, по крайней мере, можно определить некоторые имена переменных, процедур и функций, которые нельзя менять — те, которые объявлены со словом Экспорт. Сейчас обработки слова Экспорт нет совсем. Более того, если переменная объявлена с Экспорт, она обфусцируется вне зависимости от флажка в дереве лексического анализа.
Также нет обработки английских синонимов ключевых слов.
И еще есть траблы с регистром — если процедура объявлена как «Процедура», то в дереве лексического анализа она показывается как процедура, если же она объявлена как «процедура» или «ПроцедурА», например, то в дереве лексического анализа она становится вдруг функцией!
Посмотри Ei // там с структуре модуля разбираются процедуры функции и переменныеhttp://enterpriseintegrator.googlepages.com/StructureModule.jpg
На 7.7 это — типичный кирпичиватель — я таким только одну свою разработку закрыл (строк на 40), требуется явное указание в области описания всех используемых переменных, + не забывать про имена функция в реквизитах диалогов.. мое резюме — вполне нормальная защита…
Гиблая затея, хотя и смелая =)
(5) > «Насколько я понял, так как обработка исходного текста происходит в отрыве от контекста, то надо самому определять, какие имена процедур, функций и переменных можно заменять на белиберду, а какие — нет.»
Именно так, если бы можно было получать текст модуля штатными средствами, то наверное имело бы смысл выбирать не просто код, а объект, например обработку или объект метаданных из конфигурации. А уже из него получать исходный код, с разбором на реквизиты формы, объекта и т.д. Да и я думаю, определить имена обработчиков событий, так же не возможно штатно. Поэтому здесь, ответственность за «проставление галочек» ложиться на пользователя.
По-поводу того что обфусцируется в независимости от флажка — это не правда ) Просто сейчас пока есть такой недостаток: если нажать «Выполнить», а потом поменять флажки без выполнения «Анализа» заново, то уже обфусцированные переменные остануться. Доработкой этого недостатка займусь в ближайшее время.
По-поводу траблов с регистром написания, странно, не должно быть… Проверю.
ЗЫ: Спасибо за грамотные замечания.
(6) Сорри, что не в тему. German, подскажи плиз, а чем это ты смотришь структуру модуля?
(5) > «Сейчас обработки слова Экспорт нет совсем.»
Думал об этом… Для процедур не имеет смысла, т.к. я не могу знать какие из них являются обработчиками событий. Вот для экспортных переменных и функций, можно сделать так что бы флажки по-умолчанию не проставлялись.
> «Также нет обработки английских синонимов ключевых слов.»
Принято.
(6) Герман, до твоих гениальных (в хорошем смысле этого слова 🙂 ) творений мне долековато что и говорить… )
(7) Слышал про «закирпичиватель» на 7.7, но не разу не видел его в живую… Наверно потому, что у меня ещё не возникало необходимости таким образом скрывать свои алгоритмы, я ещё не написал свою «нетленку» ))
(8) Почему?… )
Исправлен баг с регистром написания. Например, «ПроЦедурА» обрабатывается корректно.
А я вот не считаю такую защиту сколь либо действенной.
Сам таким образом ковырял закирпиченный Rocket Launcher, вполне успешно (только т-с-с-с!)…
Будем ждать КЗК 3.0 для 8-ки…
Добавлена обработка английских синонимов ключевых слов.
(16) Согласен. Данная обработка написана мной чисто из интереса, без какой-либо практической цели.
Я считаю, что будущее защиты исходного кода для восьмерки за обфускаторами так называемого «байт-кода». Более тего, я тестировал бэта-версию такого обфускатора и могу сказать, что существующие на данный момент декомпиляторы просто вываливаются с ошибкой при попытке декомпеляции защищенного таким образом модуля (только не просите у меня эту обработку, я не автор и распространением не занимаюсь).
(18) обработку не надо, дай исходный байт-код + перекомпиллированный
(19) MMF, я даже не сомневаюсь, что ты разберешь ) Но скорее всего, прийдется поковыряться ручками, как с любым хорошо запутанным кодом.
ручками .. это не для нас…
(10) в смысле чем? какой обработкой? — Ei…. На чем реализовано?- На RegExp.. немного не понял вопроса.
Исправлена недоработка о которой я говорил в (9). Теперь можно перевыбирать заменяемые переменные без необходимости повторного анализа исходного кода.
(22) Дошло
Добавлена обработка ключевого слова Экспорт.
а можно еще случайным образом использовать смесь рус и анг операторов?
(26) Никак нетленку сваял, Алеша?
(26) Можно. Ещё можно делать ложные переходы (оператором goto), разбавлять код «мусором», заменять константы формулами и т.д. Моя обработка всего лишь пример. По теории запутывающих преобразований я бы советовал читать это:http://www.citforum.ru/security/articles/analysis/ Очень позновательно! )
(29) Без всякого смысла ) Просто «RegExp Тестер» не заслуживает вобщем-то особого внимания, но тем не менее очень помогла мне разобраться с регулярными выражениями и я решил её добавить в качестве бонуса )
(29)А почему бы не сделать две разработки???
Просто автор, как я понимаю, не гонится за дешевой популярностью, плодя количество разработок с целью получения поболее плюсиков. За это ему — ПЛЮС
(31) И это тоже ) Ещё не люблю «попрошайничество плюсов», если об этом зашел разговор…
(32) Блин, придется еще один поставить — заслужил :))))))))))))))
(33) хе-хе ))
Ключевое слово Экспорт уже распознается, но по-прежнему у переменных, объявленных с Экспорт по-умолчанию стоит галка в дереве лексического запутывания. Все-таки надо бы по-умолчанию галку снимать. И еще неплохо бы было как-то выделять в дереве процедуры и переменные с Экспорт, как предупреждение, что не стоит тут ставить галку (или вообще запретить ее ставить).
Еще есть глюк с совпадающими именами переменных и функций. Вот такой код обфусцируется неправильно:
Показать полностью
При обфускации переменной Сообщить, неправомерно обфусцируется системная функция Сообщить.
(35) Принято.
Спасибо за идею интеграции RegExp в 1С. Как раз хотел этим заняться.
Файл обновлен.
Исправлена ошибка о которой говорится в (35). Доработан интерфейс.
Итак совместными усилиями с awa обработка начинает приобретать законченный вид. )
(37) Эта идея стара как мир )
(38) Не смотрел, но вот такой вопрос: не будет ли проблем с проблем с инструкциями препроцессора? Ведь инструкции препроцессора должны обязательно содержаться в отдельной строке, засовывать их в одну строку с простым кодом нельзя!
(39) Точно! ) Инструкции препроцессора пока не поддерживаются…
Прикольно. Как-то я делал такое вручную. Но это было давно. С тех у меня не было необходимости шифровать свои разработки.
(41) Аналогично. ) Эта разработка скорее «для удовольствия». Было интересно сделать парсинг кода самому.
Ну что обфуксатор заглох .. хотя ОЧ. необходимая вешь.
предлагаю следующее развитие событий.
1. Вместо Уникальных идентификаторов использовать _______________________________ ну и с каким нибуть символом на конце или в начале .. а то длинны может не хватить
2. Замена множества процедур или функций на одну, вставляя определенный параметр… в дальнейшем условие по данному параметру будет определять границы алгоритма входящего в функцию.
3. Убрать все строки и другие значения в BASE64 … в дальнейшем можно будет написать ВК, которая будет шифровать строки нормально (одну и туже строку,значение с разным результатом, что бы исключить возможность поиска по модулю).
4. Также можно применить запутывание процедур и функций.. как в статье описано .. но это на сладкое
5. Ну и после этого на все это ДОБРО можно смело ставить пароль, декомпилятор улетит
Хотя прикольно.. Сами написали декомпилятор, теперь пишут обфуксатор :). потом будет декомпилятор обфуксатора
(43) + ну и циклы переделать в GoTO
(43) Да, сейчас немножко не хватает времени на развлечения, занят серьезными делами )
Далее по пунктам:
1. Тоже думал о этом, специально оставил возможность редактировать имя НА которое заменяется. Можно дорисовать кнопочку «Заполнить» в «Дереве лексического запутывания», которая будет заполнять колонку «Идентификатор после» по любому понравившемуся алгоритму… )
2. Не хочется возиться с изменением структуры самого кода…
3. И об этом тоже думал, вот идея шифровать строковые данные мне очень нравиться! Обязательно займусь этим как только будет время…
ЗЫ: Хотя я здесь уже говорил, что всё это баловство, нужно обфусцировать непосредственно байт-код! )
+(46) Как всегда спасибо за грамотные замечания!
Хорошая наверно вешь. Я уже + поставил. Вот только не работает !
{ВнешняяОбработка.АРМзакупок(1070,6250)}: Ожидается ключевое слово ‘Тогда’ (‘Then’).
(48) Читай внимательно комменты, в частности комментарий номер (2) 🙂
Если не поможет, то прошу в личку кусочек кода который не корректно обфусцируется, будем разбираться…
А если просто добавить множество переменных ? C названием от 10 до 100 символов ? И разными типами…
(50) Можно… Можно ещё переходами и просто «левым» кодом разбавлять…
Но пока я пытаюсь сделать шифрование строк, в свободное время…
ЗЫ: Помогло-то (49)?… )
Внимание! Наконец реализованно шифрование строковых данных, содержащихся в коде! )
Шифрование довольно простенькое, с открытым ключем даже, но тем не менее, я думаю, значительно усложнит чтение кода… Плюс, не требуется никаких dll — всё штатными средствами Windows.
ИМХО баловство все это.
Необходимо для начала ответить на вопрос, что и зачем вы хотите таким образом защитить?
если какую-нить хрень за 50р, то наверное оно того стоит.
если же что-то серьезное — то надо понимать, от чего вы защищаете свое творение. и только после получения ответов на эти вопросы стоит разрабатывать систему защиты конфигурации.
(53) Ты совершенно прав! 80% из того что я здесь выкладываю — это баловство, сделанное исключительно из интереса и для саморазвития… 🙂
(52) В шифрованных строках можно смело убирать переносы строк, для дешифровки это не критично, зато модуль будет опять, как и раньше состоять из одной единственной длиннннннннющей строки! ))
(55) Есть тут не большая загвоздка, не пойму чем строки переносятся?… Вот так не катит:
Показать полностью
+(56) Всё! Разобрался! ) Теперь как раньше, весь код в одну строку.
Файл обновлен.
(56) Ну обычно перенос бывает либо LF, либо CR+LF
попробуй
Показать полностью
Вторая строка — контрольная))
+(58) Не успел))))
Вот думаю. Если выпускать, доработку за 8 000 рублей и потом может еще 2000 в год брать за тех поддержку, то какая защита необходима ?
Что думаете о ключах rutoken, guardant, senselock ?
http://www.guardant.ru/products/guardant-stealth/
Самый дешевы Guardant Stealth III (2kb) можно взять за 475р. Как думаете он защитит ?
(61) Я думаю, моя обфускация в совокупности с обфускацией «байт-кода» вполне достаточны. Лично я, ни за какие шиши, в таком коде копаться не буду! ) По-поводу ключей, есть тут у нас специалист… )
Что значит: «По-поводу ключей, есть тут у нас специалист… ) » …
(63) Да вот:http://infostart.ru/profile/18122/projects/2717/
Попробовал открыть обработку вылезла ошибка:
{Форма.Форма(1)}: Метод объекта не обнаружен (SetSecret)
по причине:
{Форма.Форма(1)}: Метод объекта не обнаружен (SetSecret)
Чо с ней делать? Платформа 8.1.12.101
(65) Как написано выше, в описании: при использовании шифрования строковых переменных может потребоваться capicom.dll.
Что делать? Варианта 2: либо не устанавливать галочку «шифровать строковые переменные» при обфускации, либо скачать и зарегистрировать эту dll-ку.
Не знаю как на счет первого варианта(обработка не запускалась изначально, а значит и галочку снимать не от куда было), но второй вариант прошел, после того как я скачал с сайта майкрософт пакет CAPICOM-KB931906-v2102. Так что в моем случае, чтобы воспользоваться этой обработкой наличие capicom.dll было обязательным условием.
(67) Хм… Да, прошу прощения, я забыл что выложенная здесь обработка уже обфусцированна! 🙂 И конечно же, требует capicom.dll, хотя в моей (к примеру) винде такая длл-ка уже была установлена по-умолчанию. Спасибо за ценное замечание!
>хотя в моей (к примеру) винде такая длл-ка уже была установлена по-умолчанию
Знаешь в чем прикол: сегодня переставил систему — фигвам, нема её :)))
Это кто-то видать подставляет при инсталляции… какая-то прога
+(69) А ведь была, гадина :))))))))))
Так что — не по умолчанию
Прелагаю коммерческий проект — обфускация конфигурации 🙂
Тестерам — бесплатно! 😉
Обфускицинул код в 1500 строк, при получении результата все записывается в одну строку, скопировать полностью из текстового поля её нельзя, при нажатии кнопки сохранить 1с вылетает. Платформа 1с 8.1 последняя. Можно ли записывать не в одну строку, а в несколько, либо ввести параметр максимальное количество знаков в строке.
(72) Можно. Будет параметр для разбивания по строкам, в следующем релизе.
(73) Отлично, а когда релиз?
(74) Скоро ) С работой разберусь немного…
(75) Заждались уже :))
(74) (76)
Добавил разбиение результата на строки.
Довольно приметивное, перенос осуществляется только по «;» и не разбиваются строковые константы, но я думаю этого будет достаточно?…
о, спасибо
все работает, если не ставлю галку на процедурах и функциях.
(80) Дык, галку на процедурах/функциях надо с умом ставить, а не подряд )))
в итоге только те названия функций и процедур, которые не привязаны к событию, успешно кодируются.
(82) Ну естественно! А как же иначе? ) События и экспортные процедуры/функции обфусцировать можно только с аккуратностью, заменяя идентификаторы там где надо уже ручками…
Все это очень красиво и наглядно.. спотреть на «переработанный» код..
А можно все это чудо вернуть при необходимости вернуть к людському виду?
И у меня при открытии обработки вылетает ошибка:
Как ее исправить?
(84) Не обфусцировать текстовые параметры или создание ком-объектов.
с ошибкой разобрался… а вот как по первому вопросу декодирования???
(85) Душелов +1 )
(84) Это значит что не зарегистрирована capicom.dll. Сам обфускатор, выложенный здесь, требует для своей работы эту библиотеку. А в обфусцируемых обработках, можно отключить шифрование строк и значит, использование capicom.dll.
(86) К относительно людскому виду вернуть можно, форматирование можно поправить… Имена переменных/функций уже конечно не откуда будет взять… И если строки зашифрованы были, то тоже ничего не поделать…
Уважаемый, coder1cv8, хочу спросить сам алгоритм по которму можно вытянуть переменные и функции (процедуры) так как у вас в обработки…
Зарье спасибо.
(88) Почту давай )
(89) Когда обфускация конфигурации будет? 😉
(90) Что вы подрозумеваете под «Обфускацией кофигурации»? Переработка всего кода базы? Смотря на данную обработку думаю, что не очень сложно сделать….
(90) ну это уже не моими силами, я думаю )
такую ощибку выдает:
de.Replace(a5e643824e34b44b7d59747c85b34af,ad396ecec0804589aab1acbdecdaadcc[e83070454784f62fd6ef415c79]);
{Форма.Форма(115)}: Индекс находится за границами массива
e83070454784f62fd6ef415c79=0;Пока b28c72bab1402aa1e527b7cdffe7a2.Count>0 Цикл a5e643824e34b44b7d59747c85b34af=df8a421a994962b5a674ed00ef23
(93) Может в коде ошибка? )
(94) Нет
на нескольких обработках проверял, везде именно эта ошибка.
во всех кодах есть тексты запросов, может изза них?
(95) А! Так это моя обработка ошибку выдает, а не обфусцированный код? )
Мне нужен какой-нибудь небольшой кусочек твоего кода, который будет выдавать такую ошибку при обфускации, что бы смоделировать ситуацию.
(96)http://infostart.ru/public/65008/
вот на модуле этой обработки проверь. выдает ошибку
(96) вот код который выдает ошибку
Функция кк()
п = 1+3;
// Разделитель = «####»;
//Возврат Истина;
КонецФункции
п = 1+3;
// Разделитель = «!!!!»;
//Возврат Истина;
КонецФункции
а вот так вот не выдает
(98)(99) Ну я вот для кого описание пишу? )
Читай внимательно: «Примечание: Имеется один, но очень не приятный баг, в обфусцируемом коде не должны использоваться комментарии, содержащие внутри себя кавычки«
В исходный код ввел строку:
МассивСобытий.Добавить(«_$Data$_.New»);
убрал галку «шифровать»
строка обфусцируется в
МассивСобытий.Добавить(############);
при нажатии «Выполнить» появляется ошибка описанная в сообщении (93)