После защиты паролем через библиотеку, макрос перестал работать

Автор Konstanta, 7 февраля 2020, 10:54

0 Пользователи и 1 гость просматривают эту тему.

Kadet

Ошибка была на LoadLibrary, а не на verifyLibraryPassword. Я же давал ссылку на обсуждение.

Kadet

Проблему решил.
Ну, как "решил"... обошёл, как обычно. Ибо настоящее решение не далось.

Начальную базу оставил без пароля, но при первой загрузке пароли таки устанавливаются, то решил просто сохранить базу перед закрытием, чтобы и внутренняя библиотека сохранилась с паролем.
Поставил на закрытие БД небольшой макрос. Чтобы база сохранялась только при первом запуске поставил проверку.
Sub DBClose()
ON LOCAL ERROR GOTO ErrDBCloseAll:
If (ThisDatabaseDocument.isModified) Then
ThisDatabaseDocument.store()
End If
ErrDBCloseAll:
ON LOCAL ERROR GOTO 0
End Sub

Однако, выяснилось, что когда пароль устанавливается макросом, то флаг Modified не устанавливается. Поэтому пришлось делать это "насильственно". Сразу после копирования библиотек и установки паролей установил флаг Modified.
ThisDatabaseDocument.setModified(true)
Вроде бы всё работает. После этого и внутренняя библиотека и внешняя всегда запароленная.

Однако, маленькая беда таки осталась. После установки этого макроса на закрытие после закрытия документа всегда выскакивает непонятная пустая ошибка (вложение). А после "Ок" загружается старндартный "soffice.exe". Не удобно, но терпимо.
Возможно это только у меня на win7 такая проблема, а на других компах её не будет (уже такая фигня бывала). Завтра проверю.

bk

Вот это во вспомогательном макросе в библиотеке Standard:

Option Explicit
Sub CallLoadLib()
Dim oLibs, OldPs
oLibs = BasicLibraries
OldPs = "111"
If oLibs.hasByName("MyLibrary") Then
oLibs.LoadLibrary("MyLibrary")
 If oLibs.isLibraryPasswordProtected("MyLibrary") Then
  If NOT oLibs.isLibraryPasswordVerified("MyLibrary") Then
  oLibs.verifyLibraryPassword("MyLibrary", OldPs)
  End If
  If GlobalScope.BasicLibraries.hasByName("MyLibrary") Then
      GlobalScope.BasicLibraries.loadLibrary("MyLibrary")
      GlobalScope.DialogLibraries.loadLibrary("MyLibrary")
   End If
  If oLibs.isLibraryPasswordVerified("MyLibrary") Then
      ThisDBDoc(oLibs, OldPs) 'это тот Ваш макрос
  End If
 End If
End If
End Sub

И вот это в ThisDBDoc:

Sub ThisDBDoc(Libs, sPs)

   Dim Ps
   Ps = ""
   ThisDatabaseDocument = ThisComponent
   ThisDatabaseDocument.DataSource.Settings.RespectDriverResultSetType = false
   sDBname = ThisDatabaseDocument.DataSource.URL
   sDBURL=ThisDatabaseDocument.URL
   
   StartOsn(Pass)
       If ( NOT Libs.isLibraryPasswordProtected("MyLibrary")) Then Libs.changeLibraryPassword("MyLibrary",Ps,Pass)
   
      If Libs.isLibraryPasswordProtected("MyLibrary") Then Libs.changeLibraryPassword("MyLibrary",sPs, Pass)
       
       AddOneLib("MyLibrary", "MyLibrary", Libs, GlobalScope.BasicLibraries, true)
      AddOneLib("MyLibrary", "MyLibrary", ThisDatabaseDocument.DialogLibraries, GlobalScope.DialogLibraries, false)
            
      GlobalScope.BasicLibraries.changeLibraryPassword("MyLibrary",Ps,Pass)
      
      UserName = "Manager1"
      ThisDatabaseDocument.DataSource.User = "Manager1"
     
   LoginID(UserName)
   OpenForm0

End Sub

Всё открывает, распароливает и устанавливает новый пароль.
Но есть ньюанс: пока не понятна логика смены пароля (но он меняется и защищает библиотеку), тут надо "поиграть" с логикой, чтобы понять.
И второе: функции OpenForm0 и LoginID нужно ещё раз просмотреть (мне их пришлось корректировать - аргументы) и connect_to_database.

Возвращаю файл, но пожалуйста осмотрительно там, т.к. кое-где (в функциях, завязанных на ThisDBDoc) я внес свои изменения, когда пытался запустить. Они незначительные, касаются имен аргументов, где-то убрал Parent из метода ThisComponent, где присваивалось к ThisDatabaseDocument. Сейчас на внутренней библиотеке пароль 222.


Kadet

bk рассмотрел ваш вариант повнимательней и пришёл к выводу, что... нет.
Такой вариант я и без допмакроса, а внутри самого ThisDBDoc() делал и он прекрасно работал, но... он не отвечает тем задачам, которые я на него возлагаю, поэтому и начал его усложнять. В принципе вы повторили мой первичный путь в этом направлении.
Однако, уж не знаю, на какой по мощности аппарате вы всё это делаете, и может вам этого не заметно, но у меня машина не сильная и не быстрая, а на некоторых предприятиях (да и на моём тоже) ещё хилее машин предостаточно. И нужно учитывать этот факт.
Ваш вариант при каждой загрузке совершает весьма трудоёмкие и длительные процедуры - снятие пароля, причём с двух библиотек, там ещё внутри AddOneLib идёт удаление прежней библиотеки в глобал, копирование большой библиотеки, а затем вновь установка паролей на две библиотеки. И так при каждой загрузке. У меня это занимает не меньше 30-60с. Это весьма долго.

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

siti

Есть ли способ узнать пароль на библиотеку?
По какой-то мистической случайности изменился пароль. В пятничном бекапе работает, а в пн уже не подходит. Старый был 4 цифры, и даже если как то случайно я его заменил  :o то явно на что-то близкое, хотя попробовал все варианты в надежде что ошибся кнопкой. Есть инструменты подбора?

economist

Вот прям "узнать" - вряд ли есть готовый инструмент.

Шифрование модулей в LO - хорошее, гораздо надежнее чем в Excel VBA (для которых есть десятки коммерческих ломалок и пара бесплатных).

В ветках на Форуме с участием пользователя Kadet разные участники публиковали примеры кода динамической постановки/снятия пароля с модуля. Если составить "словарь" возможных паролей или просто перебрать все 0000-9999 - то таким макросом можно "раскрыть" модуль.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

siti

Цитата: economist от 17 октября 2022, 13:20Если составить "словарь" возможных паролей или просто перебрать все 0000-9999 - то таким макросом можно "раскрыть" модуль.
попробовал и с прискорбием выяснил, что пароль из диапазона 0-999999 не подходит  >:D
наваждение какое то было видать...
жаль, что LO использует в работе лишь одно ядро процессора

economist

Проверять надо строки "0000"-"9999". За неск. часов можно перебрать и 6 разрядов. Но проще повторить все изменения вечера пятницы.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

mikekaganski

Цитата: siti от 17 октября 2022, 14:19жаль, что LO использует в работе лишь одно ядро процессора

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

Некоторое время назад разработчики John the Ripper password cracker общались с нами в процессе реализации алгоритма подбора пароля для документов ODF - они помогли нам найти ошибку в алгоритме, которая делала шифрование не соответствующим стандарту ODF (ошибка не влияла на силу защиты, просто не позволяла открыть зашифрованный документ с правильным паролем другому приложению, которое использовало алгоритм по стандарту). К чему это я: есть специализированные программы, которые не ограничены "одним ядром" ;)
С уважением,
Михаил Каганский

siti

7 цифр перебирает за час примерно.
8 сейчас запустил, посмотрим. Активировал OPenCL. Сперва давало загрузку проца на 50%, но сейчас упало на 25.
Но я склоняюсь к какому то сбою. Я не менял пароль, тем более на больше чем 4 цифры. Мистика...

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

mikekaganski

Цитата: siti от 18 октября 2022, 10:46Активировал OPenCL.

Использование OpenCL должно быть исключительно в настройках Calc (по-моему Kompilainenn писал такой баг). Оно используется только при вычислении достаточно больших диапазонов однотипных формул, и нигде больше.
С уважением,
Михаил Каганский

siti

Цитата: mikekaganski от 18 октября 2022, 11:15Использование OpenCL должно быть исключительно в настройках Calc (по-моему Kompilainenn писал такой баг). Оно используется только при вычислении достаточно больших диапазонов однотипных формул, и нигде больше.

Ну я calc и использую. Может конечно какой-то другой процесс еще решил подгрузить проц, но я не нашел какой еще. Подумал, что gpu подключился.

Интересно, что в одном тестовом файле внезапно стало очень медленно перебирать (трехзнак за пару минут), а в другом рабочем быстро. Не понял в чем разница.

8 знаков чисел перебрало за 4 часа. Без выигрыша :(

sokol92

Цитата: economist от 17 октября 2022, 13:20Шифрование модулей в LO - хорошее, гораздо надежнее чем в Excel VBA (для которых есть десятки коммерческих ломалок и пара бесплатных).
А вторая какая?  ;D
Владимир.

mikekaganski

Цитата: siti от 18 октября 2022, 14:26Ну я calc и использую.

В рамках обсуждаемой проблемы Вы используете Basic, а не Calc (даже если файл, в котором зашифрована библиотека - это табличный файл).
С уважением,
Михаил Каганский