Русский | English
Инструмент: MACROTools v2.0
Класс:clsObfuscator
Модуль запуска:modToolsObfuscation
Версия: 2.0.38
- Что такое обфускация
- Зачем нужна обфускация
- Подготовка к обфускации
- Запуск обфускации
- Этапы обфускации
- Результаты обфускации
- Лист настроек OBFUSCATION_VARIABLE
- Что обфусцируется
- Что НЕ обфусцируется
- Восстановление и отладка
⚠️ 🚨 Ограничения и предупреждения ← КРИТИЧЕСКИ ВАЖНЫЙ РАЗДЕЛ!- Часто задаваемые вопросы
Обфускация — это процесс преобразования исходного кода в форму, сохраняющую его функциональность, но затрудняющую понимание, анализ и модификацию.
При обфускации VBA-проекта:
- ✅ Идентификаторы (имена переменных, процедур, модулей) заменяются на сгенерированные
- ✅ Строковые литералы выносятся в отдельный модуль констант
- ✅ Riddon вызовы в XML заменяются на сгенерированные
- ✅ Создаётся отчёт о всех выполненных заменах
- ✅ Функциональность кода полностью сохраняется
- Скрывает логику работы алгоритмов
- Затрудняет обратный инжиниринг
- Защищает коммерческие решения
- Переменные получают имена вида
O01l1l01l1l0 - Процедуры переименовываются в
O01l1l01l1l0 - Модули получают имена
O01l1l01l1l0
-
Доступ к VBA-проекту
- Проект не должен быть защищён паролем
- Включён доступ к объектной модели VBA:
- Excel → Файл → Параметры → Центр доверия → Параметры макросов → ✅ Доверять доступ к объектной модели VBA
-
Резервная копия
⚠️ Обфускация необратима!- Обязательно создайте копию файла перед запуском
- Аддин автоматически создаёт резервную копию, но дополнительная защита не повредит
-
Тестирование
- Протестируйте обфускацию на копии файла
- Убедитесь, что код работает после обфускации
- Проверьте все макросы, привязанные к кнопкам и шейпам
Перед запуском обфускации необходимо собрать данные о VBA-проекте:
-
Откройте целевую книгу Excel
-
В MACROTools выберите: Tools → Collect Data for Obfuscation
-
Аддин создаст лист
OBFUSCATION_VARIABLEс данными:- Модули и их код
- Процедуры и функции
- Переменные и константы
- Контролы UserForm
- Объявления (Declarations)
-
Проверьте данные на листе:
- Убедитесь, что все элементы собраны корректно
- При необходимости отредактируйте список
- Проверьте типы элементов (
TypeElement) - Исключите переменные которые не хотите шифровать, удалением их из списка
- Откройте Excel с загруженным аддином MACROTools
- Перейдите на вкладку MACROTools в Ribbon
- Нажмите кнопку Obfuscate VBA Project (
btnObfuscator) - Выберите целевую книгу (если открыто несколько)
- Дождитесь завершения процесса
- Откройте Visual Basic Editor (
Alt+F11) - В контекстном меню выберите Tools → Obfuscate VBA Project
- Подтвердите действие
Sub RunObfuscation()
Call ObfuscationVBAProject
End SubВо время обфускации:
- 🔄 Отключается обновление экрана (
ScreenUpdating = False) - 🔄 Отключаются предупреждения (
DisplayAlerts = False) - 🔄 Создаётся резервная копия файла
- 🔄 Последовательно выполняются этапы обфускации
- 🔄 Генерируется отчёт на листе
OBFUSCATION_REPORT
Обфускация выполняется в 9 этапов:
Что происходит:
- Извлекаются все строковые значения из кода
- Создаётся новый модуль
modLiteralsс константами - В исходном коде строки заменяются ссылками на константы
Пример:
' До:
MsgBox "Hello, World!"
' После:
MsgBox O01l1l01l1l0 ' где O01l1l01l1l0 = "Hello, World!"Что происходит:
- Переименовываются локальные переменные внутри процедур
- Переименовываются параметры процедур
- Переименовываются локальные константы
Пример:
' До:
Dim userName As String
userName = "John"
' После:
Dim O01l1l01l1l0 As String
O01l1l01l1l0 = "John"Что происходит:
- Переименовываются все контролы на UserForm
- Обновляются ссылки в коде форм
- Обновляются ссылки во всех модулях проекта
Пример:
' До:
TextBox1.Value = "Test"
' После:
O01l1l01l1l0.Value = "Test"Что происходит:
- Переименовываются все процедуры и функции
- Обновляются вызовы во всех модулях
- Обрабатываются макросы, привязанные к шейпам
- Обрабатываются Ribbon UI callbacks
Пример:
' До:
Sub CalculateTotal()
' ...
End Sub
' После:
Sub O01l1l01l1l0()
' ...
End SubЧто происходит:
- Переименовываются переменные уровня модуля
- Обрабатываются
WithEventsобъявления - Обновляются ссылки на классы с событиями
Что происходит:
- Все модули получают новые имена
- Стандартные модули →
OXXXXXXXXXXXX - Классы →
OXXXXXXXXXXXX - UserForm →
OXXXXXXXXXXXX
Пример:
' До:
modTools.bas
clsHelper.cls
UserForm1.frm
' После:
O01l1l01l1l0.bas
O01l1l01l1l1.cls
O01l1l01l1ll.frm
Что происходит:
- Сохраняются изменения в интерфейсе UserForm
- Обновляются свойства контролов
Что происходит:
- Изменённый код записывается в VBComponents
- Модули переименовываются в VBA-проекте
- Проект сохраняется
Что происходит:
- Создаётся лист
OBFUSCATION_REPORT - Записываются все соответствия: Новое имя → Оригинальное значение
- Формируется полная карта обфускации
После завершения обфускации создаётся лист с отчётом:
| Столбец | Описание |
|---|---|
| A | Тип элемента (Literals, Module, Procedure, и т.д.) |
| B | Подтип элемента |
| C | Дополнительная информация |
| D | Имя модуля |
| E | Новое обфусцированное имя |
OBFUSCATION_REPORT
├── Literals.<ModuleName>.<StringValue> → OXXXXXXXXXXXX
├── Module.<ModuleName> → OXXXXXXXXXXXX
├── Procedure.<ModuleName>.<ProcName> → OXXXXXXXXXXXX
├── Declaration.<ModuleName>.<VarName> → OXXXXXXXXXXXX
├── Local Variable.<Module>.<Proc>.<VarLines> → OXXXXXXXXXXXX
└── UserForm.<Module>.<ControlName> → OXXXXXXXXXXXX
- Файл автоматически сохраняется после обфускации
- Резервная копия создаётся перед началом
⚠️ Рекомендуется сразу проверить работоспособность
Лист OBFUSCATION_VARIABLE содержит информацию о VBA-проекте:
| Столбец | Данные | Описание |
|---|---|---|
| A | TypeElement | Тип элемента (Module, Procedure, Declaration, и т.д.) |
| B | ModuleName | Имя модуля |
| C | ModuleType | Тип модуля (Standard, Class, UserForm) |
| D | ProcName | Имя процедуры/переменной |
| E | ProcType | Тип (Function, Sub, WithEvents, и т.д.) |
| F | ProcLines | Номера строк или идентификатор |
| G | ProcDeclaration | Декларация процедуры |
| H-J | Дополнительные данные | Внутренние параметры |
| Тип | Описание |
|---|---|
Module |
Стандартный модуль, класс или UserForm |
Procedure |
Процедура или функция |
Declaration |
Объявление переменной уровня модуля |
UserForms |
Контрол на UserForm |
Parametr |
Параметр процедуры |
Local Variable |
Локальная переменная |
Local Const |
Локальная константа |
Если вы изменили код после сбора данных:
- Удалите лист
OBFUSCATION_VARIABLE - Запустите: Tools → Collect Data for Obfuscation
- Данные будут собраны заново
| Элемент | Пример | Результат |
|---|---|---|
| Строковые литералы | "Hello" |
O7A3B9C2D1E5 |
| Локальные переменные | Dim x As Long |
Dim O4F8A2C9D3E7 As Long |
| Параметры процедур | Sub Test(name As String) |
Sub Test(O2D7E4A1B8C3 As String) |
| Процедуры | Sub CalculateTotal() |
Sub O9B3C6D2E5A1() |
| Функции | Function GetValue() |
Function O5A9B2C7D3E1() |
| Переменные модуля | Private m_count As Long |
Private O3F7C2D8E5A1 As Long |
| Контролы UserForm | TextBox1 |
O2D7E4A1B8C3 |
| Модули | modTools |
O5A9B2C7D3E1 |
| Классы | clsHelper |
O8D4E1A6B9C2 |
| UserForm | UserForm1 |
O3F7C2D8E5A1 |
| WithEvents | WithEvents App As Application |
WithEvents O1C5D9E3A7B2 As Application |
- Вызовы процедур во всех модулях
- Обработчики событий контролов
- Макросы, привязанные к шейпам
- Ribbon UI callbacks
- Ссылки на классы с событиями
| Имя | Причина |
|---|---|
Class_Initialize |
Системный конструктор класса |
Class_Terminate |
Системный деструктор класса |
Auto_Open |
Автоматический запуск книги |
Auto_Close |
Автоматическое закрытие книги |
| Имя | Пример |
|---|---|
| Workbook events | Workbook_Open, Workbook_SheetChange |
| Worksheet events | Worksheet_Change, Worksheet_Activate |
| UserForm events | UserForm_Initialize, UserForm_Click |
' НЕ обфусцируется:
Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
' Имя события сохраняется
End Sub- Вызовы Windows API (
Declare Function) - Ссылки на внешние библиотеки
- Имена встроенных функций VBA
Обфусцируются только строки в коде VBA, не в формулах ячеек.
ВАЖНО: Обфускация НЕОБРАТИМА автоматически.
-
Из резервной копии
- Используйте автоматически созданную копию файла
- Или вашу ручную резервную копию
-
Через лист отчёта
- Лист
OBFUSCATION_REPORTсодержит карту соответствий - Столбец E → новое имя
- Столбцы A-D → оригинальное описание
- Можно вручную восстановить имена
- Лист
-
Через OBFUSCATION_VARIABLE
- Лист настроек содержит оригинальные имена
- Используйте как справочник
- ❌ Имена переменных неинформативны
- ❌ Трассировка кода затруднена
- ❌ Окно Immediate показывает
OXXXXXXXXXXXX
-
Отлаживайте НЕобфусцированную версию
- Всегда сохраняйте оригинал
- Ведите разработку в оригинале
- Обфусцируйте только для распространения
-
Используйте лист отчёта
- Откройте
OBFUSCATION_REPORT - Найдите нужное новое имя в столбце E
- Определите оригинальное назначение
- Откройте
-
Комментируйте код ДО обфускации
- Добавьте подробные комментарии
- Комментарии сохраняются при обфускации
- Это поможет понимать логику позже
-
Ведите журнал изменений
- Фиксируйте, что и зачем обфусцировали
- Сохраняйте версию до обфускации
-
Конфликт имён переменных со свойствами объектов
⚠️ Если имя переменной совпадает с именем свойства объекта, обфускация может ошибочно заменить свойство- Пример проблемы:
' До обфускации: Public Sub example() Dim oList As MSForms.ListBox Dim Value As String Debug.Print oList.Value = "value" End Sub ' ❌ После обфускации (НЕВЕРНО): Public Sub example() Dim oList As MSForms.ListBox Dim o01010l01l01l0 As String Debug.Print oList.o01010l01l01l0 = "value" ' ← Ошибка: заменено свойство .Value End Sub
- Решение: Переименуйте переменную, чтобы она не совпадала со свойствами объектов:
' ✅ Правильный вариант (переменная sValue вместо Value): Public Sub example() Dim oList As MSForms.ListBox Dim sValue As String Debug.Print oList.Value = "value" End Sub ' ✅ После обфускации (ВЕРНО): Public Sub example() Dim oList As MSForms.ListBox Dim o01010l01l01l0 As String Debug.Print oList.Value = "value" ' ← Свойство .Value сохранено End Sub
- Рекомендация: Используйте префиксы для имён переменных:
sValue,sName,sPath(строки)lCount,lIndex,lTotal(числа Long)bFlag,bEnabled,bVisible(булевы)oObject,oList,oRange(объекты)
-
Пароль на VBA-проект
- ❌ Обфускация не работает с защищёнными проектами
- Снимите защиту перед запуском
-
Необратимость
⚠️ Нет автоматического отката- Обязательно создавайте резервную копию
-
Сложные проекты
⚠️ Большие проекты могут обрабатываться долго- Рекомендуется тестировать на копии
-
API-вызовы
⚠️ Некоторые функции используют API-хуки- Может потребоваться дополнительная настройка
-
Ссылки на другие проекты
⚠️ Внешние ссылки не обфусцируются- Проверьте совместимость после обфускации
| Проблема | Решение |
|---|---|
| Late Binding объекты | Могут некорректно обфусцироваться |
| Динамическое создание контролов | Проверьте после обфускации |
| CallByName вызовы | Строковые имена не обновляются автоматически |
| Evaluate() с именами процедур | Может потребоваться ручная правка |
- Обфусцированный код защищён от чтения, но не от выполнения
- Для полной защиты используйте дополнительно Unviewable VBA Project
- Обфускация затрудняет, но не делает невозможным обратный инжиниринг
Нет. Обфускация не влияет на производительность. Меняются только имена, логика остаётся прежней.
Да. Отредактируйте лист OBFUSCATION_VARIABLE перед запуском — удалите строки, которые не нужно обфусцировать.
- Проверьте лог:
...\AppData\Roaming\Microsoft\AddIns\MACROTools_logs.csv - Убедитесь, что VBA-проект не защищён паролем
- Проверьте корректность данных на листе
OBFUSCATION_VARIABLE - Попробуйте на простой тестовой книге
Нет. Обфускация выполняется для одной книги за раз. Повторите процесс для каждой.
Нет. Комментарии удаляются.
Да. Ссылки на макросы в шейпах и контролах обновляются автоматически.
- Запустите все основные макросы
- Проверьте UserForm
- Протестируйте кнопки и шейпы
- Проверьте Ribbon UI callbacks
- Убедитесь, что события работают
Рекомендуется:
- ✅ Сохраните копию файла с листами отчёта
- ✅ Удалите листы из финальной версии для безопасности
- ✅ Или скройте листы:
xlSheetVeryHidden
Да. Используйте:
Sub ObfuscateTargetWorkbook()
Dim wb As Workbook
Set wb = Workbooks("TargetBook.xlsm")
If wb.VBProject.Protection = vbext_pp_locked Then
MsgBox "Project is protected!", vbCritical
Exit Sub
End If
Dim oObs As Object
Set oObs = CreateObject("clsObfuscator")
Application.ScreenUpdating = False
Application.DisplayAlerts = False
If oObs.Execute(wb) Then
MsgBox "Success!", vbInformation
Else
MsgBox "Failed!", vbExclamation
End If
Set oObs = Nothing
End Sub- MODULES_REFERENCE.md — Справочник всех модулей MACROTools
- clsObfuscator.cls — Исходный код класса обфускации
- modToolsObfuscation.bas — Модуль запуска обфускации
При возникновении проблем:
-
Проверьте лог-файл:
...\AppData\Roaming\Microsoft\AddIns\MACROTools_logs.csv -
Убедитесь, что доступ к VBA разрешён
-
Перезагрузите Excel и проверьте активацию аддина
-
Тестируйте только на копиях файлов
Apache License
Автор: VBATools
Версия аддина: v2.0.38
⚠️ Помните: Обфускация — это инструмент защиты от случайного чтения кода, а не от целенаправленного взлома. Используйте комплексные меры защиты для критически важных проектов.