Обфускация кода vba excel

Обфускация кода – инструмент запутывания кода макроса, с целью защиты его от не санкционированного доступа, сохраняющий его функциональность, но затрудняющий его анализ

main ribbon главная панель запутывание кода

Главная панель запутывание кода на ленте Excel

Обфускация кода – производится в несколько этапов:

  1. Парсер кода VBA – сбор, из проекта VBA, названий переменных (локальных и глобальных), названий процедур и функций, название всех модулей VBA, названия “контролов” UserForms
  2. Обфускация – главный процесс запутывания кода, производится по списку сформированному парсером кода. Перед выполнением операции “Удаление форматирования” – производится тестирование кода на работоспособность.
  3. Удаление форматирования – удаление из кода: комментариев, форматирование кода, нумерации строк,  пустых строк, перенос строк, инструкции “Option”

Обфускация закончена!

Данный инструмент, рекомендуется использовать совместно с инструментами:

  1. скрыть модули VBA
  2. установить пароль «Project is UNVIEWABLE»

Сравнение проектов VBA до и после запутывания кода

Сравнение проектов VBA до и после запутывания кода

Парсер кода VBA:

В процессе парсинга формируются две таблицы – “DATA_OBF_VBATools” и “STRING_OBF_VBATools“.

В таблица DATA_OBF_VBATools, содержит данные о названиях: переменных,  процедур и функций, модулей и контролов UserForm. Которым в процессе парсинга присваиваются новые зашифрованные названия. Так же для каждого элемента в таблице можно выбрать шифровать его или нет при обфускации.

В таблица STRING_OBF_VBATools, содержит все строковые переменные используемые в проекте VBA. В процессе обфускации эти данные будут помещены в отдельный модуль проекта VBA. А в модулях где они используются они будут заменены на присвоенный им шифр.

Обфускация кода

Таблица данных собранная парсером кода VBA

Обфускация кода:

Нужно перейти в сформированную ранее таблицу “DATA_OBF_VBATools“.

На панели инструментов, надстройки Macro Tools VBA, выбрать пункт обфускация кода.

В диалоговом окне выбрать файл который нужно зашифровать.

Дождаться окончания процесса обфускации кода.

Инструмент обфускации кода VBA надстройки Macro Tools VBA

Инструмент обфускации кода VBA

Удаление форматирования:

Завершающий этап обфускации удаление форматирования кода VBA.

Настройка параметров, удаления форматов кода: комментарий, форматирования, нумерацию строк, пустых и переносов строк.

Данный инструмент можно использовать и для простых, проектов в которых нужно удалить те или иные параметры кода VBA.

Удаление форматирования кода VBA

Удаление форматирования кода VBA

Время на прочтение
5 мин

Количество просмотров 25K

Всем привет! Я обычный пользователь MS Excel. Не являющийся профессиональным программистом, но накопивший достаточно опыта, для установки и обхода защиты проектов VBA.

Дисклеймер:

В данной статье рассмотрены виды защиты проектов VBA, от несанкционированного доступа. Их сильные и слабые стороны – ранжирование.

Цель статьи показать слабые и сильные стороны каждого вида защиты проекта VBA в MS Office.

Демонстрация разработанных инструментов, в надстройке Macro Tools VBA, для снятия и установки той или иной защиты. 

Все инструменты реализованы стандартными средствами VBA, без использования дополнительных библиотек. 

Главная панель Надстройки Macro Tools VBA

Первый вид защиты — Обычный пароль

Время на снятие: мгновенно

Недостаток: быстрый доступ к запароленному модулю VBA

Стандартный инструмент (В среде VBE: панель Tools -> VBAProject Properties -> Protection). 

Самая легко снимающаяся защита. В интернете легко находится код, для снятия данной защиты. 

Данную защиту можно снять следующим инструментом:

Второй вид защиты — Project is Unviewable

Время на снятие:  от 10 до 15 мин (в ручную)

Недостаток: доступ к исходному коду модуля VBA

Один из самых распространённых видов защит.  Встречается в 95% файлах с защитой модуля VBA. При попытке открыть проект, открывается диалоговое окно, с  сообщением:  Project is Unviewable.


Большинство пользователей Excel, не могут снять данную защиту, так как она имеет множество вариации и нюансов, для ее снятие нужно иметь представление о внутренней структуре файла Excel.

Основан, данный вид защиты, на изменение ключей:

CMG=«4A488FCC54D054D054D054D0»

DPB=«0B09CE0F8E108E108E»

GC=«CCCE09520B120C120CED»

в файле vbaProject.bin

Кратко, как создается данная защита

Для создания данной защиты нужно, разархивировать файл Excel. Перейти в архиве в папку xl, открыть файл vbaProject.bin,  в конце файла находятся наши ключи, редактируем значения ключей на пусто, сохраняем файл. Переводим наш архив, обратно в файл Excel. Готово! 

Это самый простой вариант данной защиты, но существует множество модификаций.

Алгоритм снятия защиты Project is Unviewable.

1)  Разархивируем подопытный файл, переходим в файл  …xl_relsworkbook.xml.rels

2)      В файле workbook.xml.rels  ищем строку, содержащую слово  vbaProject, обычно имеет следующий вид:  />. В этой строке нас интересует ключ Target,иего значение. Значение является название файла, в котором находится проект VBA. Иногда, защищающий меняет значения ключа на printerSettings.bin.Получается маскировка файла с проектом VBA  под другой файл.

3)      Открываем на редактирование файл, указанный в  ключе Target, ищем в файле ключи  CMG, DPB, GC. И меняем в их названиях любую букву на любую другую, например: CMC, DPC, CC. При поиске нужно быть аккуратным, так как защищающий может поместить  в проект форму,  подписью повторяющую один из ключей, например такую: DPB=«0B09CE0F8E108E108E». При ее изменении проект VBA, будет удален из книги Excel.  Сохраняем и закрываем файл.

4)      Переводим архив обратно в файл Excel.

5)      Запускаем приложение Excel, выполняем следующее: в Центре управления безопасностью -> Параметры макросов  -> Отключить все макросы без уведомления. Перезапускаем Excel. Данная операция нужна, для блокировки защиты, которую иногда ставят авторы макросов. Данная защита реализована следующим образом. В модуле VBA «ЭтаКнига», создается процедуры, реагирующие на события открытия книги или закрытия книги. Эти события обычно проверяют, наличие пароля на проект VBA, запрет сохранения и прочее.

6)      Открываем файл. Если все правильно сделано то, Excel, будет ругаться на не правильные ключи, которые мы отредактировали, в пункте 3. Жмем, да, пока данные сообщения не закончатся и диалоговое окно закроется. 

      Если данное сообщение не появляется то, вы отредактировали не файл который содержит проект VBA.

7)      Открываем проект VBA. После всего, проект VBA должен быть доступен.

8)       Но иногда защита не снимается, тогда нужно сохранить файл, проверить, что он действительно сохранился! И проделать повторно операции с 1 по 7. Обычно так происходит когда в файле workbook.xml.rels в ключе Target  установлено printerSettings.bin.При сохранение,  Excel  исправляет это на значение на vbaProject.bin

Данную защиту можно установить и снять следующим инструментом:

Третий вид защиты — Hidden  Module, скрытые модули VBA

Время на снятие:  от 15 до 20 мин (нужен редактор OLE — объектов, Structured Storage Viewer, например.

Недостаток: доступ к коду модуля VBA

Менее распространенный вид  защиты обычно встречается в комбинации с защитой Project is Unviewable. При установке данной защиты модуль VBA не отображается в проекте книги Excel. О его существовании можно узнать, проанализировав код VBA (что требует время!) или открыть файл Excel в программе  OpenOffice  или  LibreOffice (так же можно смотреть код при защите Project is Unviewable, но данный способ не дает возможность получить рабочий файл, без пароля). 

Просмотр кода VBA в  LibreOffice

Кратко, как создается данная защита

Для создания данной защиты нужно отредактировать файл  с проектом VBA — vbaProject.bin  или printerSettings.bin,в зависимости от настроек в файле …xl_relsworkbook.xml.rels. В конце файла удаляются строки вида: Module1=32, 32, 635, 330, Z.  С нужными названиями модулей.

Для снятия данной защиты нужно в файле vbaProject.bin — восстановить удаленные записи модулей.

Данную защиту можно установить следующим инструментом.

Четвертый вид защиты — Обфускация кода

Время на снятие:  неизвестно, зависит от объема кода и пере использования частей кода

Обфусцированный код VBA

Недостаток:  необходимость тестирование файла после обфускации, на работоспособность

Крайне редкий вид защиты, основанный на изменении исходного кода VBA, в не удобочитаемый вид для человека. Удаляются все комментарии, форматирование кода, переименовываются названия всех переменных,  процедур, функций, модулей и прочего. Злоумышленнику никогда не удастся восстановить первоначальный вид кода, и потребует достаточно много времени для, его восстановления в удобно читаемый вид для человека.  

Для де-обфускации кода нужно иметь  время, специализированное ПО.

Данную защиту можно установить следующим инструментом.

Пятый вид защиты — Перенос кода в dll

Время на снятие:  неизвестно, зависит от языка программирования и квалификации

Недостаток:  необходимости в дополнительном  файле dll

Один из самых редких видов защиты. Основная идея перенос основного кода в отдельную библиотеку dll, написанную на любом другом языке программирования. Не распространённость данный вид защиты получил по следующей причине,  необходимости за файлом Excel, «таскать» дополнительный файл, dll.

Для получения доступа к коду dll, нужно обладать специальными знаниями.

Заключение

В заключении хочу выделить бесполезность защит:  Project is Unviewable и Hidden  Module которые, по существу ни отчего не защищают. Позволяют просматривать код VBA, без изменения исходного  файла, в таких программах как OpenOffice  или  LibreOffice. Так и снимаются без особых проблем.

Защитить проект VBA

Зачастую, при создании проекта на VBA в Excel, хочется его надежно защитить (особенно, если он какой-то крупный). В первую очередь, это нужно для того, чтобы никто не «украл» Ваши личные интеллектуальные разработки, либо для того, чтобы никто не мог внести какие-либо изменения в код. В данной статье как раз будет рассказано о некоторых способах, с помощью которых можно защитить проект VBA: от самых простейших, до более сложных.

Установка пароля на проект VBA

Первый и наиболее простой способ защитить проект VBA — стандартная установка пароля. Для установки пароля, в открытом редакторе VBA, необходимо нажать «Tools» — «VBA Project Properties» и перейти на вкладку «Protection», как показано на скриншоте ниже:

Защитить проект VBA: свойства проекта

Далее, необходимо ввести пароль и подтвердить его. Если нужно закрыть проект от просмотра кода — установите галочку в поле «Lock project for viewing». И все, пароль установлен. Теперь, в следующий раз, когда вы зайдете в редактор VBA и попытаетесь открыть VBA-проект — необходимо будет ввести пароль:

Защитить проект VBA: стандартный пароль

Данный способ поможет защитить проект VBA только от простых пользователей: если очень захотеть, пароль можно легко взломать. Такая защита не является надежной.

Обфускация кода

Обфускация — это изменение (запутывание) кода программы с целью затруднения его восприятия и понимания. В случае с кодом VBA — удаление отступов, удаление комментариев и переименовывание переменных или даже самих процедур.

Например, имеется простейший код, который сравнивает две переменные и выводит сообщение:

Sub sravnenie()
Dim a As Double 
Dim b As Double
a = 50 'первая переменная
b = 30 'вторая переменная
If (a >= b) Then 'сравнение
    MsgBox a & " больше или равно " & b, "Сравнение"
Else
    MsgBox a & " меньше " & b, "Сравнение"
End If
End Sub

После обфускации получится следующий код:

Sub q3294ac481200c9f62b6a7dac981cea19()
Dim b17fea5c0191a5bc3c2640b8f16b14e98 As Double
Dim ea06f6764676da2a53039a8c582369215 As Double
b17fea5c0191a5bc3c2640b8f16b14e98 = 50
ea06f6764676da2a53039a8c582369215 = 30
If (b17fea5c0191a5bc3c2640b8f16b14e98 >= ea06f6764676da2a53039a8c582369215) Then
MsgBox b17fea5c0191a5bc3c2640b8f16b14e98 & " больше или равно " & ea06f6764676da2a53039a8c582369215, "Сравнение"
Else
MsgBox b17fea5c0191a5bc3c2640b8f16b14e98 & " меньше " & ea06f6764676da2a53039a8c582369215, "Сравнение"
End If
End Sub

Да, разобраться в нем можно, времени уйдет на это чуть больше, но стоит отметить, что здесь всего лишь 11 строк кода. Если строк будет в разы больше, то разобраться будет очень проблематично, код будет максимально сложным для восприятия.

Для того, чтобы защитить проект VBA с помощью обфускации, можно воспользоваться готовыми инструментами:

  • Сайт для обфускации кода VBA
  • Инструмент для обфускации на Python

Обфускация — эффективный способ защиты VBA (и не только VBA). Его также можно использовать с первым способом: если пароль взломают, то с анализом и интерпретацией кода придется довольно долго потрудиться.

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

Изменение бинарного файла (Project is unviewable)

Еще один эффективный способ защитить проект VBA — небольшое изменение бинарного кода самого файла Excel. Что для этого нужно?

Сначала, необходимо сохранить исходный файл в формате .xlsb (рекомендуется именно этот формат), либо в формате .xlam, если это надстройка. После чего, необходимо сменить расширение файла на .zip и открыть его через архиватор (Winrar или 7-Zip). Затем, нужно зайти в папку «xl» и найти там файл vbaProject.bin. Файл необходимо куда-нибудь перенести/скопировать, например, на рабочий стол.

Защитить проект VBA: vbaProject.bin

Далее, нужно открыть vbaProject.bin через текстовый редактор Notepad++ (именно через него, так как через стандартный блокнот не получится) и найти там строчки, содержащие «CMG», «DPB» и «GC» (они находятся почти в самом низу). Все символы, находящиеся в кавычках после них, необходимо заменить на символ «F», как это сделано на примере ниже:

Защитить проект VBA: бинарный файл

Сохраняем файл vbaProject.bin, закрываем, переносим его обратно в архив в ту же папку «xl». Меняем обратно расширение с .zip на .xlsb или .xlam (в зависимости от того, в каком расширении файл был сохранен), и все, готово. Теперь, при попытке просмотреть/изменить модули нашего проекта, мы будем видеть сообщение «Project is unviewable»:

Защитить проект VBA: Project is unviewable

Данный способ поможет эффективнее защитить проект VBA от взлома более опытными пользователями. Но даже эту защиту можно взломать, если очень захотеть.

Важно! Не забудьте сделать резервную копию исходного файла, в противном случае, вы больше не сможете просматривать и редактировать свой код.

Создание надстройки .dll

Еще один из способов, с помощью которого можно защитить проект VBA — создание .dll надстройки. Про данный способ я расскажу вкратце, так как сам я .dll-надстройки не создавал. Суть заключается в том, что код ваших макросов вы пишете на другом языке программирования, например на C++, а затем компилируете его в .dll или .exe файл, который затем подключается к Excel. Исходный код из скомпилированного файла извлечь крайне трудно.

Интересную тему, с которой можно начать небольшое погружение в создание .dll-надстройки, можно прочитать на форуме PlanetaExcel.

Использование стороннего софта

В интернете продается различный софт для защиты проекта, в котором могут сочетаться все перечисленные выше функции: обфускация, изменение бинарного кода и еще какие-либо дополнительные настройки, ограничивающие доступ к исходному коду. Вот некоторых из них:

  • XLS Padlock (139€)
  • VBASH (80$)
  • Unviewable+ (100$ и выше, в зависимости от лицензии)
  • VbaCompiler (299$ стандартная лицензия) — создает .dll-файл (используется язык C)

Стоит отметить, что файлы, защищенные с помощью VBASH и самой дешевой версией Unviewable можно довольно быстро взломать. Вероятно, стоимость этого программного обеспечения «слегка» завышена и, возможно, следует пользоваться другими способами. А вот с помощью VbaCompiler защитить проект VBA можно очень надежно, так как он автоматически создает .dll-надстройку с использованием языка C. Но стоимость данного ПО довольно высокая.

Приобретать данный софт или нет — целиком и полностью ваше решение, но следует понимать, что вклад в защиту проекта должен быть финансово оправдан. Для защиты проекта от обычных пользователей достаточно использовать те методы, о которых я написал в этой статье. Нужно помнить о том, что не существует стопроцентной защиты от взлома: если человек реально захочет взломать ваш проект, он его взломает.

VBad

VBad is fully customizable VBA Obfuscation Tool combined with an MS Office document generator. It aims to help Red & Blue team for attack or defense.

DISCLAIMER: This is only for testing purposes and can only be used where strict consent has been given. Do not use this for illegal purposes, period.

Please read the LICENSE under readme/LICENSE for the licensing of VBad.

alt tag

Features

VBad is a tool that allows you to obfuscate (and encrypted) in many diffrent ways pieces of VBA code and integrated directly into a list of generated MS Office document. You would be able to :

  • Encrypt all strings present in your VBA code;
  • Encrypt data from your python Script in VBA code (domain names or paths for example);
  • Randomize each functions’ (or variables) names that you want;
  • Delete all tabulation/spaces/cariage return
  • Chose Encryption method, how and where encryption keys are stored;
  • Add customizable fake keys (to avoid some easy detection stuff)
  • Generate as many unique MS Office document (with different randomize in the VBA) as you want using a filename list and a document Template;
  • Enable autodestruction of encryption Keys feature once the VBA has been trigger once;
  • 20/10/16 : fake keys implementation on #VBad to avoid some easy detection stuff
  • 07/04/17 : implementing option that allows exploiting this vulnerability: http://seclists.org/fulldisclosure/2017/Mar/90. VBad is now able to destroy references to the module containing effecitve payload in order to make it invisible from VBA Developper Tool making analyses and debugging much more harder :-)

How it works

For the moment, only one type of encryption is supported.

All strings and indicated variables are encrypted (xored in fact) using a random key (different for each files). This key is stored into Document.Variables by the python program and then initialization (not the variable itself) is deleted from the VBA code.

It makes decryption of the code harder because analysts has to get back this Document.Variable key using specific methods (no classic tools will work with this).

For more fun, this keys are deleted once the macro is triggered one time (as long as the file is open from a writable place).

New storage methods and real encryption algorithms are to come. But, remember it’s VBA, we do not have so many choices. :-).

Prerequisites

  • Office (Excel/Word) for generated final doc (tested with Office 2010 and 2013) with Macro fully activated and checkbox «Trust Access to the VBA project object model» checked (in macro security settings, it allows python code to change and create macro)
  • Python 2.7
  • win32com

How to use

First of all, you need to markdown your orignal VBA to indicate the script what you want to obfuscate/randomize or not :

  • All VBA strings are encrypted by default. Moreover, you can exclude encryption of one string by adding an exclude mark ([!!]) at the end of the string. Example :
String_Encrypted = "This string will be encrypted"
String_Not_Encrypted = "This string will NOT be encrypted[!!]"
  • Mark [rdm::x] before a variable or function name will randomize it with a x chars string, Example :
Function [rdm::10]Test()  '=> Test() will become randomized with a 10 characters string
[rdm::4]String_1 = "Test"  '=> String_1 wil lbecome randomized with a 4 characters string
  • Mark [var::var_name] will included the string string_to_hide(‘var_name’) from const.py in a encrypted way in the VBA. With that, you can generate string from your python file and include it directly in your VBA (DGA codding for example).
Path_to_save_exe = [var::path] '=> string_to_hide("path") will be encrypted and put in the final VBA

Git clone and customize const.py to fit your need, you have to indicate at least :

template_file = r"C:tmpVbadExampleTemplatetemplate.doc" # The path to the template Office document you want to use to generate your files
filename_list = r"C:tmpVbadExampleListsfilename_list.txt" #The path to the file that contains a list of different filenames you want to use for your generated files
path_gen_files = r"C:tmpVbadExampleResults" # Path where your generated Office documents will be saved
original_vba_file = r"C:tmpVbadExampleOrignal_VBAoriginal_vba.vbs" # The orignal VBA file you want to include, randomize and obfuscate in your malicious documents
trigger_function_name =  "Test" # Function that you want to auto_trigger (in your original_vba_file)
string_to_hide = {"domain_name":"http://www.test.com", "path_to_save":r"C:tmptoto"} #Strings that you want to add in your 

Example

In Example folder, you will find an already marked vba file, a template.doc, a list of 3 filename. You can use it and adapt it as you need.

TODO :

  • Other encryption methods
  • Other key hiding methods
  • .xls generation (thx @DPeltier)
  • .docx and .xlsx generation

Feel free to contribute :-)

Pepitoh.

To protect VBA code, you can add a password right from the editor to prevent access to VBA code. Unfortunately this protection is limited and can be bypassed by an aware user.

An effective solution to protect VBA code is obfuscation, in other words, the solution is to make your VBA code «unreadable» (but still operational).

This process is done by removing blank lines and comments and replacing variables, procedures and functions names by random names so that VBA code of your Excel workbook becomes incomprehensible.

Here is an example of a code made unreadable using obfuscation:

BEFORE OBFUSCATION

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 '10x10 checkerboard of cells
    Dim offset_row As Integer, offset_col As Integer ' => adding 2 variables

    'Shift (rows) starting from the first cell = the row number of the active cell - 1
    offset_row = ActiveCell.Row - 1
    'Shift (columns) starting from the first cell = the column number of the active cell - 1
    offset_col = ActiveCell.Column - 1

    Debug.Print offset_row & " / " & offset_col 'Debug

    For i = 1 To NB_CELLS 'Row number

        For ii = 1 To NB_CELLS 'Column number

            If (i + ii) Mod 2 = 0 Then
                'Cells(row number + number of rows to shift, column number + number of columns to shift)
                Cells(i + offset_row, ii + offset_col).Interior.Color = RGB(200, 0, 0) 'Red
            Else
                Cells(i + offset_row, ii + offset_col).Interior.Color = RGB(0, 0, 0) 'Black
            End If

        Next
    Next
	
End Sub

AFTER OBFUSCATION

Sub b78a86913923fd45998218c90ae82e3ea()
Const b25f04da8fd373be88988f31960d7700e As Integer = 10
Dim z8752429a9ac65dad58254478ddfa6636 As Integer, w750f1f5c3c111c0af03bc6e6fbabd53c As Integer
z8752429a9ac65dad58254478ddfa6636 = ActiveCell.Row - 1
w750f1f5c3c111c0af03bc6e6fbabd53c = ActiveCell.Column - 1
For z57fbbe9a55b7e76e8772bb12c27d0537 = 1 To b25f04da8fd373be88988f31960d7700e
For m10509d317a03d8e9a09401b6c7d3443f = 1 To b25f04da8fd373be88988f31960d7700e
If (z57fbbe9a55b7e76e8772bb12c27d0537 + m10509d317a03d8e9a09401b6c7d3443f) Mod 2 = 0 Then
Cells(z57fbbe9a55b7e76e8772bb12c27d0537 + z8752429a9ac65dad58254478ddfa6636, m10509d317a03d8e9a09401b6c7d3443f + w750f1f5c3c111c0af03bc6e6fbabd53c).Interior.Color = RGB(200, 0, 0)
Else
Cells(z57fbbe9a55b7e76e8772bb12c27d0537 + z8752429a9ac65dad58254478ddfa6636, m10509d317a03d8e9a09401b6c7d3443f + w750f1f5c3c111c0af03bc6e6fbabd53c).Interior.Color = RGB(0, 0, 0)
End If
Next
Next
End Sub

Obfuscate an Excel VBA code

To easily obfuscate a VBA code, you can use this free tool (important: don’t forget to keep a saved copy of the code or the original file).

Enter your VBA code here:

Enter the list of variables, procedures and functions that you want to replace (tap one name in each line without commas nor special characters):

Понравилась статья? Поделить с друзьями:
  • Обучу работе в excel
  • Обучиться excel самостоятельно с нуля
  • Обучить работе в excel
  • Обучить всех сотрудников использовать excel для обработки данных
  • Обучится работать в excel