Всем привет, недавно с ужасом обнаружил, что есть масса программ, которые тупо удаляют пароль с проекта VBA за 1 секунду. Так как через код идет вся защита от нелегального распространения, то проблема очень очень актуальна. 1. Можно ли как то усилить защиту кода? 2. Может есть другие недорогие способы привязки пользователя к копии продукта, чем зашивка его параметров в тело кода?
Сразу добавлю, что у меня есть свой сайт(и ftp доступ), где я могу разместить нужный файл с данными, но не знаю как это реализовывать через VBA.
ПС: обфускацией я буду заниматься только в самом последнем случае, когда исчерпаю все другие возможности ))
к сожалению по моей теме ничего нет, там в основном защиты листов и постановка пароля на проект VBA, который не защищает нисколько. Я сам скачал прогу и сломал свой же проект за 2 секунды ))
ikki пишет: честно говоря, этого не понял - как это относится к вопросу/теме?
на например закинуть данные персональные каждого зарегистрированного пользователя в html или другой файл на сервер, чтобы ексель при запуске сравнивал его с текущими данными компьютера, и если они отсутствуют на сервере, то прога не работала. Но опять же все это пишется в коде VBA, а доступ к коду получить как нефиг делать.
а вообще... меня в своё время аналогичные изыскания привели к довольно неутешительному выводу: несанкционированное использование проектов VBA можно несколько усложнить (прятать что-либо для проверки на скрытые листы, в скрытые имена, в реестр windows и т.п., обфусцировать код), надеясь на некоторые пробелы в знаниях или недостаток времени у "взламывателя", но, по большому счету, полностью исключить не получится. правда, меня интересовал вариант использования проекта в оффлайне.(есть такое ограничение). при наложении условия наличи работающего соединения с инетом проблему, возможно, и удастся решить. я представляю себе это примерно так: в коде нет ключевого фрагмента (важной функции, модуля и т.п.) либо он неправильный. при запуске идет соединение с сайтом, отправка запроса, проверка логина-пароля и ip-шника. при успешной проверке (логин такой имеет право быть (напр., был продан кому-л.), пароль верный, ip-шников для данного логина в базе данных сайта не слишком много - возвращаем текст кода ключевого фрагмента, вставляем его в проект и работаем. ессно, сохранение этого самого фрагмента надо предотвращать.
конечно, тоже не 100%, если "злоумышленнику" известен этот алгоритм. кроме того - всё это "чисто теретически", нужных знаний у меня пока нет и приобретить их мне пока лень но основная причина - возможность пользователей работать хотя бы иногда оффлайн всё-таки ограничивает
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Проблема в том, что если я сохраняю свой проект в формат Книга Ексель, то у меня не работают макросы - не срабатывает нажатие кнопок. А по файлу выше видно, что он вроде как обычная книга Ексель.
Юрий М пишет: Если у Вас Офис 2007 и выше, то так и должно быть: в xlsx макросы не живут.
Да Офис 2007. Ну так есть мысли почему выложенный выше файл не позволяет просмотреть код VBA и в то же время там не стоит пароль. Мне не нужен код этого файла, я хочу сделать так же со своим )))
Doober пишет: И он не всегда спасает. Все зависит от знаний конкретного юзера
попробую, ну про крайней мере это сложнее, чем открыть в программке взламываемый фаил и тыкнуть "убрать пароль vba" ))) Моя задача осложнить жизнь взломщику так, чтобы цена взлома превысила 500-700 руб )))
ProtectVBA - вполне достаточно в 95% случаев Мои платные программы взламывают не более 5% пользователей, - остальные покупают.
> Моя задача осложнить жизнь взломщику так, чтобы цена взлома превысила 500-700 руб )))
Дело не в цене взлома, а в непреодолимом желании халявы отдельных пользователей. Если хочется программу нахаляву, - некоторые по несколько дней пароли подбирают (рекорд, на моих программах, - 4 месяца, около 100 попыток подбора пароля) Т.е. если пользователь изначально не готов платить за софт, - он вам не заплатит. А если готов оплачивать чужой труд, - то он и ломать пытаться не будет, просто купит (независимо от уровня защиты)
Доброе время суток. ProtectVBA, ссылка на который есть у Игорь,к сожалению выполняет такую защиту только для xls, xla файлов. Можно подобное сделать и для файлов xlsb, xlsa, xlsm таким кодом
Скрытый текст
Код
Private A() As Byte
Private B() As Byte
Private C() As Byte
Private Sub InitSign()
Const startStr = "VersionCompatible32=""393222000"""
Const finishStr = "CMG=""", GC = "GC="""
Dim i As Long, fullStr As String
fullStr = startStr & Chr(&HD) & Chr(&HA) & finishStr
A = "Root Entry" & String(10, Chr(0))
ReDim B(1 To Len(fullStr))
For i = 1 To UBound(B)
B(i) = Asc(Mid$(fullStr, i, 1))
Next
ReDim C(1 To Len(GC))
For i = 1 To UBound(C)
C(i) = Asc(Mid$(GC, i, 1))
Next
End Sub
Private Function Change1Pos(ByVal fileNum As Integer, ByVal FileLength As Long) As Long
Const lastAId = 39
Dim ARead(1 To lastAId) As Byte, AChange(1 To 5) As Byte
Dim i As Long, k As Long, isEqual As Boolean, l As Long
For i = 1 To FileLength - lastAId
Get #fileNum, i, ARead
isEqual = True
For k = 1 To lastAId
If A(k) <> ARead(k) Then isEqual = False: Exit For
Next
If isEqual Then
Get #fileNum, i + 235, AChange
For l = 1 To 5
AChange(l) = CByte(255 * Math.Rnd)
Next
Put #fileNum, i + 235, AChange
Stop
Change1Pos = i
Exit Function
End If
Next
Change1Pos = 0
End Function
Private Function Change2Pos(ByVal fileNum As Integer, ByVal FileLength As Long) As Long
Const lastBId = 38, lastCId = 4, FSign As Byte = &H46
Dim BRead(1 To lastBId) As Byte, pos As Long, isNext As Boolean
Dim i As Long, k As Long, l As Long, isEqual As Boolean
Dim vChange As Byte, CRead(1 To lastCId) As Byte
For i = 1 To FileLength - lastBId
Get #fileNum, i, BRead
isEqual = True
For k = 1 To lastBId
If B(k) <> BRead(k) Then isEqual = False: Exit For
Next
If isEqual Then
pos = i + lastBId: isNext = True
Do While isNext
Get #fileNum, pos, vChange
If vChange = &H22 Then
isNext = False
Else
Put #fileNum, pos, FSign
End If
pos = pos + 1
Loop
Exit For
End If
Next
If isEqual Then
For k = pos To FileLength - UBound(C)
Get #fileNum, k, CRead
isEqual = True
For l = 1 To lastCId
If C(l) <> CRead(l) Then isEqual = False: Exit For
Next
If isEqual Then
pos = k + lastCId: isNext = True
Do While isNext
Get #fileNum, pos, vChange
If vChange = &H22 Then
isNext = False
Else
Put #fileNum, pos, FSign
End If
pos = pos + 1
Loop
Change2Pos = pos: Exit Function
End If
Next
End If
Change2Pos = 0
End Function
Public Sub MakeUnviewable()
Dim vLen As Long, res As Long
Dim fNum As Integer
fNum = FreeFile
vLen = FileLen("d:\path\vbaProject.bin")
Open "d:\path\vbaProject.bin" For Binary As #fNum Len = 1
InitSign
res = Change1Pos(fNum, vLen)
If res > 0 Then
res = Change2Pos(fNum, vLen)
If res > 0 Then MsgBox "Успешно", vbOKOnly + vbInformation, "Выполнено"
End If
Close #fNum
End Sub
На двух проектах протестировал, вроде и их функциональность не пострадала и unviewable сообщение получается. P. S. Код для извлечения и записи изменённого vbaProject.bin не писал. Думаю это не столь частая операция.
По теме: использую честно купленную LockXLS в своих проектах.
Не совсем по теме:
Цитата
Игорь пишет: если пользователь изначально не готов платить за софт, - он вам не заплатит
Согласен на 100%. А есть еще сайты для нищебродов, которые скидываются по три рубля и покупают вскладчину вашу программу как бы "честно", а потом раздают среди своих. У меня так как-то раз PLEX за 500 рублей 30 с лишним человек купили. Все никак не могу придумать названия для таких товарищей. Софт-бомжи?
Николай, просто надо сделать ограничение по количеству рабочих мест (ну и код открытым в полной версии не делать, чтобы ваши программы не продавали потом на других сайтах), - и смысл покупки вскладчину исчезнет (ненамного выгоднее получится)
Кстати, 500 рублей - это дешево очень. Я тут продавал одну программу (самую простенькую) за 500 рублей - её вообще не покупали почти (почти 2 года она стоила 500). Повысил цену до 800 рублей - сразу начались продажи) А остальные программы, которые 1000 и больше стоят, - так вообще хорошо продаются. Впечатление такое, что пользователей смущает низкая цена...
xlsb также как и xlsm и xlam - это zip-архивы, проект VBA в которых - это файл vbaProject.bin в папке архива xl. Так что если программа-взломщик паролей может ломать xlsm, то и другие она точно также сломает. Не сломают, только если эти программы не понимают новый формат файлов.
Андрей VG пишет: xlsb также как и xlsm и xlam - это zip-архивы
Андрей, разве? читал, что xlsb - это бинарный файл. впрочем, Михаил уже подсказал правильный путь - пересохранить xlsb в xlsm
на столь нелюбимом многими кибере столь нелюбимый многими Скрипт недавно создавал похожую тему я в подробности не вдавался, но, кажется, к чему-то в процессе обсуждения они таки пришли...
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Александр, xlsb бинарный в смысле содержимого листов книги (для примера xl\worksheets\sheet1.bin в xlsb и xl\worksheets\sheet1.xml в xlsm), а в остальном всё тоже самое. Файл проекта VBA бинарный в любом случае. Вам проще зайти и в тот и другой тип файла как в архив по Ctrl+PgDn в Total Commander or Double Commander (ну, или изменить тип файла на zip),
к чему-то в процессе обсуждения они таки пришли...
Поковырялся, вывод-то Этот формат - формат .XLA. Тема закрыта :) Но, по ходу обсуждения "Project is unviewable" - в фомате xls легко смотрится в OpenOffice Calc. Так проблемы вернуть xla в xls особой нет. Всего-то ставим активным защищённый проект и в Immediate (а можно отдельный макрос написать)
я давно сделал вывод лично для себя - защита моих проектов мне не нужна. ибо ничего "общеполезного" я не пишу, а решение для конкретного заказчика такой ерунды не требует. поэтому просматриваю подобные темы исключительно по диагонали. сорри, если ввёл в заблуждение.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг