Обфускатор языка 1С (bsl)
Этот репозиторий содержит инструмент для обфускации кода на языке 1С:Предприятие (BSL). Обфускация позволяет усложнить анализ кода и повысить уровень защиты интеллектуальной собственности в ваших проектах на платформе 1С.
Проект работает на 1c-language-parser
Пример использования
package main
import (
"context"
"fmt"
"github.com/LazarenkoA/Obfuscator-1C/obfuscator"
)
func main() {
code := `...`
obf := obfuscator.NewObfuscatory(context.Background(), obfuscator.Config{RepExpByTernary: true,
RepLoopByGoto: true,
RepExpByEval: true,
HideString: true,
ChangeConditions: true,
AppendGarbage: true,
})
obCode, err := obf.Obfuscate(code)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(obCode)
}
этот пример на play.golang.com
Примеры обфускации
Исходный код
&НаСервереБезКонтекста
Процедура Команда1НаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Оборудование.Ссылка КАК Ссылка
|ИЗ
| Справочник.Оборудование КАК Оборудование";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка);
КонецЦикла;
КонецПроцедуры
на выходе
&НаСервереБезКонтекста
Процедура Команда1НаСервере() Запрос = Вычислить(raeyrчфлинzpeолюучzт("0LzQn9CT0arQmAHQttCR0J7RodCf0aAJCA==", ?(81 + 94 - 12 / 20 + 70 / 68 < 80 - 21 + 54 - 30, 674, ?(76 / 98 * 9 + 13 + 99 / 57 > 56 * 30 + 81, 727, ?(71 + 97 - 51 > 71 * 63 / 26 * 56 / 93, 33, 666)))));Запрос.Текст = raeyrчфлинzpeолюучzт("0ZLRq9GR0aDRkNGi0axKSUlgSdGe0bHRvtCA0IPRtNG+0bLRsNG90bjRtW7RodCB0IvRu9G60bBg0ZrRkNGaYNGh0IHQi9G70brRsEpJSWDRmNGXSklJYEnRodG/0IDRsNGy0b7Qh9G90bjRum7RntGx0b7QgNCD0bTRvtGy0bDRvdG40bVg0ZrRkNGaYNGe0bHRvtCA0IPRtNG+0bLRsNG90bjRtQ==", ?(8 - 69 / 38 > 85 + 94 * 38, 102, ?(25 + 1 + 69 + 33 + 96 < 80 + 87 * 2 - 78, 892, ?(100 / 8 + 37 + 88 + 10 > 80 + 26 - 16, 64, 696))));РезультатЗапроса = Вычислить(raeyrчфлинzpeолюучzт("0LfQkNCf0aDQntGhDtCy0avQn9Ce0JvQndCY0aLRrAgJ", ?(28 + 44 > 91 - 18 + 55 + 29 + 18, 803, ?(91 - 45 * 18 * 95 + 55 - 80 < 62 * 98 * 39 + 16 / 15 / 3, 32, ?(80 + 95 + 69 * 19 < 6 * 39 / 63, 37, 736)))));ВыборкаДетальныеЗаписи = Вычислить(raeyrчфлинzpeолюучzт("0bDRpdGn0JPRq9Cc0JLRoNCS0YfRoNGv0JDRrtCR0aB+0YLQm9Gh0JDRoNCS0Jx4eQ==", ?(43 - 38 + 95 * 86 + 13 / 60 < 7 + 71, 732, ?(41 - 1 - 34 + 3 / 66 > 81 - 7 + 60 + 90 / 79 / 70, 347, ?(42 * 50 / 84 - 48 / 46 < 73 + 88, 80, ?(60 / 48 + 90 - 61 / 69 * 86 < 97 + 67 - 52 * 36, 786, 96))))));~аqс:Если Не ВыборкаДетальныеЗаписи.Следующий() Тогда Перейти ~sъjm;КонецЕсли;Сообщить(ВыборкаДетальныеЗаписи.Ссылка);Перейти ~аqс;~sъjm:iзylшйбилnowм = ?(88 + 44 > 76 - 93 / 47 + 11, "islmл", ?(59 / 58 < 42 / 71, "roтrзwlv", ?(44 + 68 / 29 * 90 * 4 > 76 + 94 * 32 - 69, "ыyфвбя", ?(59 + 53 - 21 / 9 / 87 * 13 > 94 * 27 - 74 / 75, "еgdpгсx", "vгаzэop"))));Если 71 + 70 < 57 / 3 / 28 / 77 * 32 Тогда Перейти ~жhфqpгj;~жhфqpгj:Иначе Перейти ~qщлjgру;~qщлjgру:КонецЕсли;КонецПроцедуры
&НаСервереБезКонтекста
Функция raeyrчфлинzpeолюучzт(зmжzdcч, ккeнок) зmжzdcч = ПолучитьСтрокуИзДвоичныхДанных(?(24 - 7 > 5 * 91 * 32 - 83 * 99 * 5, Base64Значение(зmжzdcч), ?(58 + 88 - 97 < 13 + 34 - 40 + 24 / 94, Base64Значение(зmжzdcч), ?(85 / 99 > 8 - 75 * 93 / 11 / 64 + 100, Base64Значение(зmжzdcч), ?(17 * 17 < 76 - 6 / 64 - 81 - 83, Base64Значение(зmжzdcч), Base64Значение(зmжzdcч))))));нпgmpcа = ?(80 - 5 > 14 - 22 / 81, "", ?(36 - 68 / 72 > 87 + 22, "prоъьп", ?(85 + 39 - 6 + 63 < 28 + 43 - 65 / 76, "ддagчъ", ?(97 / 54 / 31 - 13 * 31 > 81 * 19 / 10 / 70 - 3, "bфщиspq", "эnмemчo"))));_ = 1;~rуvr:Если _ > СтрДлина(зmжzdcч) Тогда Перейти ~гpfq;КонецЕсли;код = ?(26 * 58 + 61 < 7 * 60 / 52 - 76 + 23 * 75, КодСимвола(зmжzdcч, _), ?(50 + 82 < 3 / 7 - 95 / 57, КодСимвола(зmжzdcч, _), ?(88 / 27 < 86 - 8 * 53 + 66, КодСимвола(зmжzdcч, _), КодСимвола(зmжzdcч, _))));нпgmpcа = ?(58 + 40 - 54 - 31 / 10 + 42 < 97 + 16 / 15 - 85 + 58, 15 / 19 * 40 - 61 + 4 / 100 > 90 - 67, ?(61 + 22 > 31 * 66 - 95 + 55 - 22, 3 * 55 < 49 - 61 * 34 + 50 / 51, ?(6 + 19 > 56 + 68 + 96 - 24, 53 - 8 + 98 * 82 + 78 < 71 / 54, ?(31 + 78 / 19 - 27 * 79 / 100 > 99 / 20 + 53, 95 * 75 * 34 / 33 / 43 < 47 + 42 / 95 - 68, ?(69 / 71 * 76 < 95 - 76 / 50 * 35 / 73, нпgmpcа + Символ(?(4 + 99 + 9 < 4 - 70, ПобитовоеИли(?(31 - 81 > 92 + 55 - 39, ПобитовоеИНе(код, ккeнок), ?(10 / 62 + 63 > 81 - 78 * 44, ПобитовоеИНе(код, ккeнок), ?(50 / 73 < 12 - 71 - 14 * 72 - 96 * 85, ПобитовоеИНе(код, ккeнок), ?(38 * 24 * 48 / 57 < 92 - 43, ПобитовоеИНе(код, ккeнок), ПобитовоеИНе(код, ккeнок))))), ?(11 / 12 / 82 - 76 - 47 > 83 * 38, ПобитовоеИНе(ккeнок, код), ?(96 * 39 / 7 + 30 + 65 < 62 * 37 / 37 / 18, ПобитовоеИНе(ккeнок, код), ?(41 / 78 - 81 < 16 * 21 * 20 * 68 * 96, ПобитовоеИНе(ккeнок, код), ПобитовоеИНе(ккeнок, код))))), ?(86 + 8 * 71 < 24 + 68 - 64, ПобитовоеИли(?(31 - 81 > 92 + 55 - 39, ПобитовоеИНе(код, ккeнок), ?(10 / 62 + 63 > 81 - 78 * 44, ПобитовоеИНе(код, ккeнок), ?(50 / 73 < 12 - 71 - 14 * 72 - 96 * 85, ПобитовоеИНе(код, ккeнок), ?(38 * 24 * 48 / 57 < 92 - 43, ПобитовоеИНе(код, ккeнок), ПобитовоеИНе(код, ккeнок))))), ?(11 / 12 / 82 - 76 - 47 > 83 * 38, ПобитовоеИНе(ккeнок, код), ?(96 * 39 / 7 + 30 + 65 < 62 * 37 / 37 / 18, ПобитовоеИНе(ккeнок, код), ?(41 / 78 - 81 < 16 * 21 * 20 * 68 * 96, ПобитовоеИНе(ккeнок, код), ПобитовоеИНе(ккeнок, код))))), ?(94 + 30 * 9 - 70 > 7 / 73 - 31, ПобитовоеИли(?(31 - 81 > 92 + 55 - 39, ПобитовоеИНе(код, ккeнок), ?(10 / 62 + 63 > 81 - 78 * 44, ПобитовоеИНе(код, ккeнок), ?(50 / 73 < 12 - 71 - 14 * 72 - 96 * 85, ПобитовоеИНе(код, ккeнок), ?(38 * 24 * 48 / 57 < 92 - 43, ПобитовоеИНе(код, ккeнок), ПобитовоеИНе(код, ккeнок))))), ?(11 / 12 / 82 - 76 - 47 > 83 * 38, ПобитовоеИНе(ккeнок, код), ?(96 * 39 / 7 + 30 + 65 < 62 * 37 / 37 / 18, ПобитовоеИНе(ккeнок, код), ?(41 / 78 - 81 < 16 * 21 * 20 * 68 * 96, ПобитовоеИНе(ккeнок, код), ПобитовоеИНе(ккeнок, код))))), ?(32 - 44 / 2 - 69 - 37 > 17 / 94 / 52, ПобитовоеИли(?(31 - 81 > 92 + 55 - 39, ПобитовоеИНе(код, ккeнок), ?(10 / 62 + 63 > 81 - 78 * 44, ПобитовоеИНе(код, ккeнок), ?(50 / 73 < 12 - 71 - 14 * 72 - 96 * 85, ПобитовоеИНе(код, ккeнок), ?(38 * 24 * 48 / 57 < 92 - 43, ПобитовоеИНе(код, ккeнок), ПобитовоеИНе(код, ккeнок))))), ?(11 / 12 / 82 - 76 - 47 > 83 * 38, ПобитовоеИНе(ккeнок, код), ?(96 * 39 / 7 + 30 + 65 < 62 * 37 / 37 / 18, ПобитовоеИНе(ккeнок, код), ?(41 / 78 - 81 < 16 * 21 * 20 * 68 * 96, ПобитовоеИНе(ккeнок, код), ПобитовоеИНе(ккeнок, код))))), ?(68 - 56 / 33 - 7 + 61 < 46 - 96 - 51, ПобитовоеИли(?(31 - 81 > 92 + 55 - 39, ПобитовоеИНе(код, ккeнок), ?(10 / 62 + 63 > 81 - 78 * 44, ПобитовоеИНе(код, ккeнок), ?(50 / 73 < 12 - 71 - 14 * 72 - 96 * 85, ПобитовоеИНе(код, ккeнок), ?(38 * 24 * 48 / 57 < 92 - 43, ПобитовоеИНе(код, ккeнок), ПобитовоеИНе(код, ккeнок))))), ?(11 / 12 / 82 - 76 - 47 > 83 * 38, ПобитовоеИНе(ккeнок, код), ?(96 * 39 / 7 + 30 + 65 < 62 * 37 / 37 / 18, ПобитовоеИНе(ккeнок, код), ?(41 / 78 - 81 < 16 * 21 * 20 * 68 * 96, ПобитовоеИНе(ккeнок, код), ПобитовоеИНе(ккeнок, код))))), ПобитовоеИли(?(31 - 81 > 92 + 55 - 39, ПобитовоеИНе(код, ккeнок), ?(10 / 62 + 63 > 81 - 78 * 44, ПобитовоеИНе(код, ккeнок), ?(50 / 73 < 12 - 71 - 14 * 72 - 96 * 85, ПобитовоеИНе(код, ккeнок), ?(38 * 24 * 48 / 57 < 92 - 43, ПобитовоеИНе(код, ккeнок), ПобитовоеИНе(код, ккeнок))))), ?(11 / 12 / 82 - 76 - 47 > 83 * 38, ПобитовоеИНе(ккeнок, код), ?(96 * 39 / 7 + 30 + 65 < 62 * 37 / 37 / 18, ПобитовоеИНе(ккeнок, код), ?(41 / 78 - 81 < 16 * 21 * 20 * 68 * 96, ПобитовоеИНе(ккeнок, код), ПобитовоеИНе(ккeнок, код))))))))))), ?(73 * 78 - 88 / 83 * 94 + 15 > 91 * 19 / 5 * 61, 62 * 3 + 27 > 96 * 88, 73 + 4 / 84 - 16 < 43 / 8 / 31))))));хvmоnеk = ?(42 - 49 / 98 > 68 - 61 / 37 + 29, 597, ?(55 / 34 * 43 + 85 - 88 < 67 + 99 / 38 - 26 + 54, -41, ?(70 + 72 + 72 > 99 / 13 * 69 * 48 / 12, 917, ?(35 * 54 * 59 < 82 * 66 - 93, 272, 214))));Если 70 / 31 - 63 + 85 > 100 * 73 - 55 Тогда Перейти ~dlтчeckp;~dlтчeckp:ИначеЕсли 40 / 9 + 32 - 10 / 40 / 42 < 36 / 33 Тогда ИначеЕсли 71 * 9 < 25 + 18 + 68 / 25 * 10 / 81 Тогда ИначеЕсли 62 / 97 - 44 / 71 > 16 + 35 + 2 Тогда ИначеЕсли 65 + 51 * 54 * 27 / 90 < 27 * 30 / 80 Тогда Иначе Перейти ~yщфoмrг;~yщфoмrг:КонецЕсли;Пока 70 - 80 > 71 + 79 / 31 Цикл Перейти ~qдгyье;~qдгyье:Пока 33 / 55 + 30 - 3 - 33 > 32 + 39 / 58 / 53 - 72 / 15 Цикл Перейти ~tgюndхп;~tgюndхп:пnakйzсhюцыuз = ?(10 + 44 * 36 / 34 < 92 / 86, "шiмнбj", ?(35 * 65 - 34 * 29 * 20 + 4 < 28 * 68, "иоэ", ?(75 + 20 * 82 - 39 + 34 < 22 / 80 * 71 - 81, "шйfаvц", ?(68 * 5 - 48 < 3 * 26 / 38 / 46, "ppqpаjсr", "фтttpзя"))));Перейти ~yхеецт;~yхеецт:Пока 32 / 62 - 100 / 80 > 99 / 72 + 43 * 19 Цикл Перейти ~pфзcеzф;~pфзcеzф:КонецЦикла;Перейти ~tvxyаgиu;~tvxyаgиu:КонецЦикла;Перейти ~чыibcэх;~чыibcэх:КонецЦикла;_ = _ + 1;Перейти ~rуvr;~гpfq:Возврат нпgmpcа;bpnnшuмvbнsfшяu = ?(61 * 1 / 96 / 25 / 94 > 23 + 90 - 83 - 20 / 89 * 45, "irясcпc", ?(28 + 20 * 47 * 75 / 26 > 31 - 66 * 77 + 21 - 61 * 36, "ьwщ", ?(70 + 72 * 100 - 37 - 17 - 90 < 91 / 87 + 8 / 96 / 69, "умилр", ?(4 * 85 - 49 < 70 - 63 - 1 * 9, "гщmqыvу", "яфrбюю"))));kcahhwоо = ?(41 - 4 * 59 < 39 / 46 + 22, 34, ?(5 - 66 - 77 > 45 + 28 - 84 / 5 / 30 - 28, 731, ?(91 / 28 > 19 + 99 / 96, 226, 639)));Если 40 * 53 + 80 * 76 < 32 - 50 - 7 * 20 Тогда Перейти ~wtkmsоъa;~wtkmsоъa:ИначеЕсли 28 - 44 > 30 + 86 / 3 + 14 * 8 Тогда ИначеЕсли 23 - 41 - 89 / 92 < 71 / 72 - 43 + 20 Тогда ИначеЕсли 32 + 79 / 96 * 97 * 38 / 29 < 46 - 50 / 44 Тогда Иначе Перейти ~рpkорп;~рpkорп:КонецЕсли;КонецФункции
Кода на порядок больше, однако тот код что был добавлен, он мусорный, он никогда не будет выполнен, а значит значительного эффекта на производительность не даст.
данный пример был выполнен 10 раз с замером производительности, вот результаты
до обфускации
после (максимальные настройки)