На ее основании я остановил свой выбор на DoneEx. Немного погонял - вроде работает четко. Нравится максимальный уровень защиты. Не нравится то, что это предполагает распространение своих наработок в виде exe-файла. Все-таки не каждый решится использовать чужой exe (хотя, с точки зрения злодеяний - навредить можно и VBA-кодом, но его хотя бы можно отключать). Да и размер файла большой. В общем, exe-формат как-то напрягал. Но за неимением лучшего, решился все-таки на приобретение решения от DoneEx.
И вот захожу я на http://doneex.com/ дабы оплатить это чудо (в хорошем смысле), как вижу новую кнопочку - мол есть новый продукт. Перехожу на http://vbacompiler.com/, изучаю (сайт пока что откровенно лаконичен). Решение - давняя моя (и не только) мечта - макросы (вернее их Си-версия) переносятся в DLL-ку!
А мне как раз срочно надо распространить один свой файл, но только так чтобы он дальше не пошел. В итоге я на эмоциях и цейтноте решился сразу взять новый продукт. Все-таки решение гораздо красивее и логичнее. К сожалению, именно мой файл он "кушать" отказался, даже после исправления мной пары ошибок. Выслал разработчикам - все-таки бетта-версия. Уже через сутки прислали ссылку на новый релиз. Теперь компиляция проходила успешно. Но во время работы файл "падает". Еще причину не понял, но пока грешу на себя - возможно, где-то обнуляющие set-ы не использую, плюс у меня для он-лайн обновления данных используется несколько кривое, поспешное решение через постоянный запуск процедуры самой себя через OnTime. В общем буду искать ошибки и помогать разработчикам. С учетом того, что они смогли сотворить в первом своем продукте - в успехе даже не сомневаюсь.
О результатах обязательно проинформирую. Все-таки выход практически компилятора VBA считаю значимым событием. Хочу также убедить разработчиков добавить функцию не изменять (не шифровать) имена процедур/функций, т.к. я бы лично значительную часть своих вспомогательных библиотек с большой радостью таскал не в коде, а в виде DLL. Даже не защиты ради, а ради облегчения взгляда на код.
dll загружается в память... в придачу к открытому файлу... наверно, остаётся проблема memory-efficiency, если в dll'ке большой функционал... по логике
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Всем доброго времени. Вот и мне понадобился функционал защиты своего проекта. Функционал http://vbacompiler.com/ хорош, но не работает с большими проектами, к тому же стоимость пока за такой сырой продукт весьма высокая. и есть подтормаживания. Protect VBA - отличный инструмент, но его легко победить с помощью ОО или последних ЛибрО. Подскажите, можно ли внедрить в код файла xlsm ЗАЦИКЛЕННЫЙ макрос АВТООТКРЫТИЯ ТОЛЬКО для этих офисов (а не для Excel), чтобы они зависали при открытии файла в них Например, если переменная >0 , к ней будет прибавляться 1. небольшая, но всё таки защита будет от не очень продвинутых.
Вариант с DLL плох тем, что нужно иметь две отдельные DLL: для 32 битного Office и для 64-битного. Для защиты коммерческих надстроек XLAM без использования EXE и DLL часто используют Unviewable+. Защита не идеальная, но вполне достаточна для коммерческих целей.
Добрый день, Андрей. Libre Office (текущая версия 5.3) не видит VBA код любой надстройки XLAM. На сайте по приведенной мною ссылке в примерах есть пара зашифрованных надстроек XLAM, можете с ними поэкспериментировать в разных программах.
Вы взяли не самый защищенный вариант, который там в надстройке WC2014-Locked-Ultimate-MultiLayer.xlam То, что Вы попытаетесь вскрыть не будет тем, что делает надстройка, проверьте.
RAN написал: Libre Office3.5 эту надстройку видит без проблем.
Андрей, очевидно, там уже не уровень защиты Locked-Ultimate-MultiLayer, возможно, автора теперь устраивает цифровая подпись. Уберите, пожалуйста, название надстройки из сообщения, чтобы не подставлять её автора. Попробуйте поэкспериментировать с WC2014-Locked-Ultimate-MultiLayer.xlam
Напомню на всякий случай, что про Unviewable+ в сообщении #6 я уточнял, что "Защита не идеальная, но вполне достаточна для коммерческих целей". По крайней мере, так считают ряд зарубежных разработчиков VBA-надстроек. Ссылку дал не ради рекламы, сам этой утилитой не пользуюсь.
Владимир. Вам большое спасибо. Действительно, указанная Вами надстройка защищена очень хорошо. По крайней мере от таких. как я. Пожалуй. всё таки куплю данный продукт.
ZVI написал: Попробуйте поэкспериментировать с WC2014-Locked-Ultimate-MultiLayer.xlam
Владимир, попробовал. Честно говоря не нашёл разницы с обсуждавшимися здесь ProtectVBA, LockXLS, которые заменяют несколько байтов в файле VBAProject.bin. Для примера Файл: WC2014-Locked-Ultimate-Encrypted.xlam Модуль: mRibbonTabActivate
часть кода
Код
Option Explicit
' http://www.wordarticles.com/Shorts/RibbonVBA/RibbonVBADemo.php
' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
' Definitions and Procedures relating to Accessibility, used by the Ribbon VBA '
' Demonstration UserForm. The constants have been lifted from oleacc.h, and are '
' just a subset of those available. '
' (c) Tony Jollans, August 2008. '
' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
Public Const CHILDID_SELF As Long = &H0&
Private Const STATE_SYSTEM_UNAVAILABLE As Long = &H1&
Private Const STATE_SYSTEM_INVISIBLE As Long = &H8000&
Private Const STATE_SYSTEM_SELECTED As Long = &H2&
Public Enum RoleNumber
ROLE_SYSTEM_CLIENT = &HA&
ROLE_SYSTEM_PANE = &H10&
ROLE_SYSTEM_GROUPING = &H14&
ROLE_SYSTEM_TOOLBAR = &H16&
ROLE_SYSTEM_PROPERTYPAGE = &H26&
ROLE_SYSTEM_GRAPHIC = &H28&
ROLE_SYSTEM_STATICTEXT = &H29&
ROLE_SYSTEM_Text = &H2A&
ROLE_SYSTEM_PAGETABLIST = &H3C&
End Enum
Private Enum NavigationDirection
NAVDIR_FIRSTCHILD = &H7&
End Enum
#If Win64 Then
Private Declare PtrSafe Function AccessibleChildren _
Lib "oleacc.dll" _
(ByVal paccContainer As Object, _
ByVal iChildStart As Longlong, _
ByVal cChildren As Longlong, _
rgvarChildren As Variant, _
pcObtained As Longlong) As LongPtr
Private Declare PtrSafe Function GetRoleText _
Lib "oleacc.dll" _
Alias "GetRoleTextA" _
(ByVal dwRole As Longlong, _
lpszRole As Any, _
ByVal cchRoleMax As Longlong) As LongPtr
#Else
Private Declare Function AccessibleChildren _
Lib "oleacc.dll" _
(ByVal paccContainer As Object, _
ByVal iChildStart As Long, _
ByVal cChildren As Long, _
rgvarChildren As Variant, _
pcObtained As Long) _
As Long
Private Declare Function GetRoleText _
Lib "oleacc.dll" _
Alias "GetRoleTextA" _
(ByVal dwRole As Long, _
lpszRole As Any, _
ByVal cchRoleMax As Long) _
As Long
#End If
Public Type ChildList
Objects() As IAccessible
Levels() As Long
SelectedIndex As Long
End Type
Private Const NoControls As String = "(no available controls)"
Private Const ExecuteControl As String = "Execute selected Control"
Private Const NoExecuteControl As String = "Text control: can't execute"
‘…
Option Explicit
Const SEPARATORS As String = ";#"
Public Sub GotoWebLink(sURL As String, Optional vSeparator As Variant)
Dim vItems As Variant
Dim I As Long
On Error GoTo ErrHandler
' Separator validation
If IsMissing(vSeparator) Then vSeparator = ";"
If Len(vSeparator) > 1 Then GoTo SeparatorError
If InStr(SEPARATORS, vSeparator) = 0 Then GoTo SeparatorError
' URL, MailTo or Path validation
If InStr(sURL, "/") = 0 And InStr(sURL, "\") = 0 And InStr(sURL, ":") = 0 Then
If MsgBox("Is this URL valid? " & vbCrLf & vbCrLf & sURL, vbYesNo + vbQuestion, APP_TITLE) = vbNo Then Exit Sub
End If
'Split URLs if multiple
vItems = Split(sURL, vSeparator)
' Launch URLs
For I = LBound(vItems) To UBound(vItems)
'No need to check for a valid internet connection
If Val(Application.Version) = 12 Then
ActiveWorkbook.FollowHyperlink CStr(vItems(I))
Else
ThisWorkbook.FollowHyperlink CStr(vItems(I))
End If
Next I
Exit Sub
ErrHandler:
MsgBox "The requested webpage cannot be launched due to a web error" & vbCrLf & _
"or due to a temporarily unavailable service." & vbCrLf & vbCrLf & _
"Please try again later.", vbCritical, APP_TITLE
Exit Sub
SeparatorError:
MsgBox "Weblink separator error " & vSeparator, vbCritical, APP_TITLE
End Sub
Как было описано в обсуждении по ссылке выше, вполне после двух команд в Immediate, код просматривается в LibreOffece. Так что защита Unviewable+, на мой взгляд, ничем не отличается от ProtectVBA. Или я что-то упускаю? Собственно, Владимир, мой вопрос и был вызван этим моментом - в чём разница и преимущество Unviewable+? Предполагал, что вы общаетесь с авторами и владеете информацией почему +